六、uboot2010.09移植

来源:互联网 发布:apache tomcat java8 编辑:程序博客网 时间:2024/06/05 20:02
根据前面的讲解,可参考uboot移植第二篇的最后,
总结:从以上过程可以看出,如果要在如果要在board目录下新建一个开发板<board_name> 的目录,或着在board目录的子目录下新建一个开发板<board_name> 的目录,需要在board.cfg配置文件中添加相应的信息,在#include/configs目录下也要建立一个文件<board_name.h>,里面存放的就是开发板board_name的配置信息。
那么我们开始移植uboot2010.09
1、cd uboot-2010.09
2、在board/samsung目录下建立目录:mkdir board/samsung/mini2440
3、cp board/samsung/smdk2410/* board/samsung/mini2440/
4、mv board/samsung/mini2440/smdk2410.c board/samsung/mini2440/mini2440.c
5、cp include/configs/smdk2410.h include/configs/mini2440.h
6、gedit board/samsung/mini2440/Makefile:smdk2410.o->mini2440.o
7、gedit boards.cfg:添加一行: mini2440 arm arm920t - samsung s3c24x0
8、vim Makefile:在#set default to nothing for native builds这行的上面添加一句
   CROSS_COMPILE=arm-lwm-linux-gnueabi-  //这个根据自己的交叉编译链做相应的修改
9、vim /etc/profile 最后一行添加export PATH=$PATH:/home/lwm/software/mini2440/x-tools/arm-lwm-linux-gnueabi/bin
10、source /etc/profile
    注:9,10主要是讲交叉编译链的路径添加到环境变量里面,根据自己的情况可以选择取舍
11、make distclean
12、make mini2440_config
13、make
14、将生成的uboot.bin通过vivi的d命令下到ram中去运行,效果如下:


再继续下去可以参照黄刚的博客或者Tekkaman Ninja的博客进行移植,当然,对于128M的nandflash代码要做如下修改:
  1. 对于128m的mini2440相关代码为

  2. #include <config.h>


  3. #define NF_BASE 0x4E000000 //Nand Flash配置寄存器基地址

  4. #define __REGb(x) (*(volatile unsigned char *)(x))
  5. #define __REGi(x) (*(volatile unsigned int *)(x))

  6. #define NFCONF __REGi(NF_BASE + 0x0 ) //通过偏移量还是得到配置寄存器基地址
  7. #define NFCONT __REGi(NF_BASE + 0x4 ) //通过偏移量得到控制寄存器基地址
  8. #define NFCMD __REGb(NF_BASE + 0x8 ) //通过偏移量得到指令寄存器基地址
  9. #define NFADDR __REGb(NF_BASE + 0xC ) //通过偏移量得到地址寄存器基地址
  10. #define NFDATA __REGb(NF_BASE + 0x10) //通过偏移量得到数据寄存器基地址
  11. #define NFSTAT __REGb(NF_BASE + 0x20) //通过偏移量得到状态寄存器基地址

  12. #define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1)) //Nand片选使能
  13. #define NAND_CHIP_DISABLE (NFCONT |= (1<<1)) //取消Nand片选
  14. #define NAND_CLEAR_RB (NFSTAT |= (1<<2))
  15. #define NAND_DETECT_RB { while(! (NFSTAT&(1<<2)) );}


  16. #define NAND_SECTOR_SIZE 2048
  17. #define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)

  18. /* low level nand read function */
  19. int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
  20. {
  21.     int i, j,page;

  22.     if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) 
  23.     {
  24.         return -1; //地址或长度不对齐
  25.     }

  26.     NAND_CHIP_ENABLE; //选中Nand片选


  27.     for(i=start_addr; i < (start_addr + size);) 
  28.     {
  29.         //发出READ0指令

  30.         NAND_CLEAR_RB;
  31.         NFCMD = 0x00;

  32.         //对Nand进行寻址
  33.            page=i>>11;
  34.         NFADDR = 0;
  35.           NFADDR = 0;
  36.           NFADDR = page & 0xFF;
  37.           NFADDR = (page>> 8) & 0xFF;
  38.           NFADDR = (page>> 16) & 0xFF;
  39.     NFCMD = 0x30;

  40.         NAND_DETECT_RB;


  41.         for(j=0; j < NAND_SECTOR_SIZE; j++, i++) 
  42.         {
  43.             *buf = (NFDATA & 0xFF);
  44.             buf++;
  45. /********************************************************************************************************/
  46. if (*buf!=0)
  47. {
  48. #define GPBCON (*(volatile unsigned long *)0x56000010)
  49. #define GPBDAT (*(volatile unsigned long *)0x56000014)
  50. void led()
  51. {
  52. GPBCON = 0x154FD;
  53. GPBDAT = 0x1C0;
  54. }
  55. }
  56. /********************************************************************************************************/

  57.         }
  58.     }

  59.     NAND_CHIP_DISABLE; //取消片选信号

  60.     return 0;
  61. }
下面的我就不继续移植了,因为下面准备自己尝试着去写一个bootloader,所以uboot2010.09的工作到此结束,下面把努力去自己实现一个bootloader!!!加油!!!
0 0