分类:
uboot2010.09移植
根据前面的讲解,可参考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代码要做如下修改:
- 对于128m的mini2440相关代码为
-
- #include <config.h>
-
-
- #define NF_BASE 0x4E000000 //Nand Flash配置寄存器基地址
-
- #define __REGb(x) (*(volatile unsigned char *)(x))
- #define __REGi(x) (*(volatile unsigned int *)(x))
-
- #define NFCONF __REGi(NF_BASE + 0x0 ) //通过偏移量还是得到配置寄存器基地址
- #define NFCONT __REGi(NF_BASE + 0x4 ) //通过偏移量得到控制寄存器基地址
- #define NFCMD __REGb(NF_BASE + 0x8 ) //通过偏移量得到指令寄存器基地址
- #define NFADDR __REGb(NF_BASE + 0xC ) //通过偏移量得到地址寄存器基地址
- #define NFDATA __REGb(NF_BASE + 0x10) //通过偏移量得到数据寄存器基地址
- #define NFSTAT __REGb(NF_BASE + 0x20) //通过偏移量得到状态寄存器基地址
-
- #define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1)) //Nand片选使能
- #define NAND_CHIP_DISABLE (NFCONT |= (1<<1)) //取消Nand片选
- #define NAND_CLEAR_RB (NFSTAT |= (1<<2))
- #define NAND_DETECT_RB { while(! (NFSTAT&(1<<2)) );}
-
-
- #define NAND_SECTOR_SIZE 2048
- #define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
-
- /* low level nand read function */
- int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
- {
- int i, j,page;
-
- if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))
- {
- return -1; //地址或长度不对齐
- }
-
- NAND_CHIP_ENABLE; //选中Nand片选
-
-
- for(i=start_addr; i < (start_addr + size);)
- {
- //发出READ0指令
-
- NAND_CLEAR_RB;
- NFCMD = 0x00;
-
- //对Nand进行寻址
- page=i>>11;
- NFADDR = 0;
- NFADDR = 0;
- NFADDR = page & 0xFF;
- NFADDR = (page>> 8) & 0xFF;
- NFADDR = (page>> 16) & 0xFF;
- NFCMD = 0x30;
-
- NAND_DETECT_RB;
-
-
- for(j=0; j < NAND_SECTOR_SIZE; j++, i++)
- {
- *buf = (NFDATA & 0xFF);
- buf++;
- /********************************************************************************************************/
- if (*buf!=0)
- {
- #define GPBCON (*(volatile unsigned long *)0x56000010)
- #define GPBDAT (*(volatile unsigned long *)0x56000014)
- void led()
- {
- GPBCON = 0x154FD;
- GPBDAT = 0x1C0;
- }
- }
- /********************************************************************************************************/
-
- }
- }
-
- NAND_CHIP_DISABLE; //取消片选信号
-
- return 0;
- }
下面的我就不继续移植了,因为下面准备自己尝试着去写一个bootloader,所以uboot2010.09的工作到此结束,下面把努力去自己实现一个bootloader!!!加油!!!