Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1345151
  • 博文数量: 244
  • 博客积分: 10311
  • 博客等级: 上将
  • 技术积分: 3341
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-14 21:50
文章分类

全部博文(244)

文章存档

2013年(6)

2012年(5)

2011年(16)

2010年(11)

2009年(172)

2008年(34)

分类: LINUX

2009-05-15 17:14:44

接上回:

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的
技术也是嵌入式开发非常核心的一块,值得大家去深入研究。
阅读(1085) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~