接上回:
4.网络功能的添加。
这一步比较简单,因为smdk2410的网络芯片是CS8900A,U-Boot-1.1.4已经做好了这个芯片的驱动程序,所以
我们只要在设置文件中作些操作就可以了。配置文件是/include/configs/smdk2410.h,前面的步骤中需要在这个
设置文件中定义#ifndef CONFIG_S3C2410_NAND_BOOT,就可以在start.s执行nand相关操作了。
我们在设置文件中定义如下宏就可以驱动起CS8900A了。
#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
#define CS8900_BASE 0x19000300
#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */
在
#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL | \
CFG_CMD_CACHE | \
CFG_CMD_NAND | \
/*CFG_CMD_EEPROM |*/ \
/*CFG_CMD_I2C |*/ \
/*CFG_CMD_USB |*/ \
CFG_CMD_PING | \
CFG_CMD_REGINFO | \
CFG_CMD_DATE | \
CFG_CMD_ELF)
/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
中把CFG_CMD_PING这个选项打开,就有了ping的功能。
这时可以通过tftp来传文件到sdram了。
5.nand相关命令的支持。
必须在设置文件smdk2410.h添加如下宏:
首先在
#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL | \
CFG_CMD_CACHE | \
CFG_CMD_NAND | \
/*CFG_CMD_EEPROM |*/ \
/*CFG_CMD_I2C |*/ \
/*CFG_CMD_USB |*/ \
CFG_CMD_PING | \
CFG_CMD_REGINFO | \
CFG_CMD_DATE | \
CFG_CMD_ELF)
中将CFG_CMD_NAND这个宏打开。
其次:
/* define s3c2410 nand flash add by kavin*/
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
#define CFG_NAND_BASE 0x4E000000
#define CFG_MAX_NAND_DEVICE 1 /* Max number of NAND devices */
#define SECTORSIZE 512
#define ADDR_COLUMN 1
#define ADDR_PAGE 2
#define ADDR_COLUMN_PAGE 3
#define NAND_ChipID_UNKNOWN 0x00
#define NAND_MAX_FLOORS 1
#define NAND_MAX_CHIPS 1
#define NAND_WAIT_READY(nand) {while(!(rNFSTAT&(1<<0)));}
#define NAND_DISABLE_CE(nand) {rNFCONF|=(1<<11);}
#define NAND_ENABLE_CE(nand) {rNFCONF&=~(1<<11);}
#define WRITE_NAND_COMMAND(d , adr) {rNFCMD=d;}
#define WRITE_NAND_ADDRESS(d, adr) {rNFADDR=d;}
#define WRITE_NAND(d , adr) {rNFDATA=d;}
#define READ_NAND(adr) (rNFDATA)
/* the following functions are NOP's because S3C24X0 handles this in hardware */
#define NAND_CTL_CLRALE(nandptr)
#define NAND_CTL_SETALE(nandptr)
#define NAND_CTL_CLRCLE(nandptr)
#define NAND_CTL_SETCLE(nandptr)
#define CONFIG_MTD_NAND_VERIFY_WRITE 1
#define CONFIG_MTD_NAND_ECC_JFFS2 1
#endif /* CONFIG_COMMANDS & CFG_CMD_NAND*/
比如:
#define NAND_WAIT_READY(nand) {while(!(rNFSTAT&(1<<0)));}
#define NAND_DISABLE_CE(nand) {rNFCONF|=(1<<11);}
#define NAND_ENABLE_CE(nand) {rNFCONF&=~(1<<11);}
#define WRITE_NAND_COMMAND(d , adr) {rNFCMD=d;}
#define WRITE_NAND_ADDRESS(d, adr) {rNFADDR=d;}
#define WRITE_NAND(d , adr) {rNFDATA=d;}
#define READ_NAND(adr) (rNFDATA)
这几个宏都是对nand芯片的底层操作,必须自己通过阅读s3c2410的手册去实现,大括号内的
代码就是实现的代码,由于nand的操作是在/commom/cmd_nand.c中用到这些底层操作,所以必须
在cmd_nand.c头顶的位置中加入:
/* NAND FLASH */
#define rNFCONF (*(volatile unsigned *)0x4E000000)
#define rNFCMD (*(volatile unsigned *)0x4E000004)
#define rNFADDR (*(volatile unsigned *)0x4E000008)
#define rNFDATA (*(volatile unsigned *)0x4E00000C)
#define rNFSTAT (*(volatile unsigned *)0x4E000010)
#define rNFECC (*(volatile unsigned *)0x4E000014)
这是相关寄存器地址。
在lib_arm/board.c中,有个函数没有实现void nand_init (void)
这是系统刚上电要初始化nand芯片的函数添入如下代码:
void nand_init (void)
{
int i;
S3C2410_NAND * nand = S3C2410_GetBase_NAND();
/*NF_Init();*/
nand->NFCONF = (1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(0<<8)|(3<<4|0<<0);
/*reset*/
nand->NFCONF = nand->NFCONF&~(1<<11);
nand->NFCMD = 0xff;
for(i = 0; i < 10; i++);
while(!(nand->NFSTAT&(1<<0)));
nand->NFCONF = nand->NFCONF|(1<<11);
printf("%4lu MB",nand_probe((ulong)nand)>>20);//这个函数相当关键啊,监测nand设备的函数
//不监测根本就不能操作nand.
}
这样就可以随意烧写,擦除flash了。
6.环境变量的存储
环境变量有如下内容
#define CONFIG_BOOTDELAY 5
#define CONFIG_BOOTARGS "root=/dev/mtdblock/0 init=/linuxrc console=ttyS0,115200"
#define CONFIG_ETHADDR 12:34:56:78:9a:bc
#define CONFIG_NETMASK 255.255.240.0
#define CONFIG_IPADDR 192.192.78.222
#define CONFIG_SERVERIP 192.192.78.20
/*#define CONFIG_BOOTFILE "elinos-lart" */
/*#define CONFIG_BOOTCOMMAND "tftp; bootm" */
依次是系统引导延迟时间,引导参数,网卡mac地址,IP地址,服务器ip地址等等。
只要把#define CFG_ENV_IS_IN_NAND 1
定义了就可以了
结尾:这就是整个移植过程,虽然功能不多,但是已经可以引导linux内核了。U-Boot的功能还很强大,比如
usb,lcd,spi等,所以说u-boot不仅是牛比得bootloader,他还可以测试板卡的各项功能。而且bootloader的
技术也是嵌入式开发非常核心的一块,值得大家去深入研究。
阅读(1143) | 评论(0) | 转发(0) |