繼ok6410 u-boot-2012.04.01移植四後,開發闆基本已支援MLC NAND,但還有一些細節地方修改,這節增加DM9000支援,通過網卡tftp程式到記憶體,接着通過NAND指令寫到NAND,這一過程肯定會遇到很多問題,遇到後再一個個解決。
開發環境:
系統:ubuntu 10.04.4
單闆:ok6410
NAND FLASH:K9GAG08U0D 2048MB
DDR:K4X1G163PCX2 256MB
NET:DM9000AEP
編譯器:arm-linux-gcc-4.3.2
搭建開發環境詳見ubuntu 10.04.4開發環境配置。
目标:
1.闆級初始化,支援單闆ok6410
2.修改u-boot,支援NAND啟動
3.增加菜單update功能
4.增加MLC NAND支援
5.支援DM9000,網卡下載下傳程式
6.修改環境變量以及mtdpart分區
7.u-boot裁剪及制作更新檔
一、修改源碼支援DM9000
增加dm9000aep_init設定記憶體控制器
void dm9000aep_init(void)
{
SROM_BW |= (0XFF<<4);
}
在start.S增加bl dm9000aep_init,其實在以前支援單闆是已添加。
分析eth_initialize(gd->bd);->board_eth_init在board/samsung/smdk6410/smdk6410.c修改board_eth_init(bd_t *bis),改成如下:
#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
#ifdef CONFIG_DRIVER_DM9000
rc = dm9000_initialize(bis);
#endif
return rc;
}
#endif
接着頭檔案include/configs/smdk6410.h增加DM9000網卡支援
#if 0
#define CONFIG_CS8900
#define CONFIG_CS8900_BASE 0x18800300
#define CONFIG_CS8900_BUS16
#else
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x18000000 //0x20000300
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT 1
//#define CONFIG_DM9000_DEBUG 1
#endif
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 172.16.1.111
#define CONFIG_SERVERIP 172.16.1.114
#define CONFIG_ETHADDR 00:0c:29:4d:e4:f4
編譯試試看網卡是否OK
[email protected]:/si/OK6410/u-boot-2012.04.01$ make
二、編譯測試網卡
剛剛編譯的程式,燒寫OK,重新開機下面測試網卡
U-Boot 2012.04.01 (Jul 01 2013 - 21:27:53) for SMDK6400
CPU: [email protected]
Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz (ASYNC Mode)
Board: SMDK6400
DRAM: 128 MiB
WARNING: Caches not enabled
Flash: 0 KB
NAND: select s3c_nand_oob_mlc_64
NAND_ECC_NONE selected by board driver. This is not recommended !!
2048 MiB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
##### Update menu for ok6410 #####
[g] get file, and write to nand flash 0 block
[b] Boot the system
[r] Reset the u-boot
[q] Quit from menu
Enter your selection: q
SMDK6410 # ping 172.16.1.134
dm9000 i/o: 0x18000000, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 00:0c:29:4d:e4:f4
operating at 100M full duplex mode
Using dm9000 device
host 172.16.1.134 is alive
SMDK6410 #
可以ping通,可以根據自己情況設定網關,ping自己的主機。下面測試看能否用NAND燒寫程式,當然是不行的,測試就是為了找問題
SMDK6410 # set serverip 172.16.1.134
SMDK6410 # tftp 0x50000000 u-boot.bin
dm9000 i/o: 0x18000000, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 00:0c:29:4d:e4:f4
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 172.16.1.134; our IP address is 172.16.1.111
Filename 'u-boot.bin'.
Load address: 0x50000000
Loading: ################
done
Bytes transferred = 228796 (37dbc hex)
SMDK6410 # nand erase 0 0x80000
NAND erase: device 0 offset 0x0, size 0x80000
Erasing at 0x0 -- 100% complete.
OK
SMDK6410 # nand write 0x50000000 0x80000
NAND write: device 0 offset 0x80000, size 0x7ff80000
Attempt to write outside the flash area
0 bytes written: ERROR
SMDK6410 # nand write 0x50000000 0 0x80000
NAND write: device 0 offset 0x0, size 0x80000
524288 bytes written: OK
SMDK6410 # reset
resetting ...
data abort
pc : [<e5951008>] lr : [<000000d0>]
sp : 0c001f90 ip : 12345678 fp : 00000000
r10: 57e380ec r9 : 57cfae38 r8 : 57cf7f64
r7 : 00000001 r6 : 1a000005 r5 : e3500000 r4 : eb006faa
r3 : 00500000 r2 : e5eff014 r1 : 00000000 r0 : 00000000
Flags: nZCv IRQs off FIQs off Mode SVC_32
Resetting CPU ...
看看reset果然就挂了,程式就是用的剛剛燒寫OK的程式,看來程式沒有燒進對的地方,下面針對nand write 0x50000000 0 0x80000燒寫指令進一步跟蹤,待續