我是一个基督徒,今年36岁了,目前在一家上市公司担任维修组的负责人,2018.7月份开始了业余编程,到现在已经2年的时间了,因着上帝的恩典和怜悯,从零开始,现在把linux系统跑起来了。圣经上面说:“你们白白的得来,也要白白的舍去”。我要和大家一起分享我这两个年来做出来的东西,希望能够帮助有需要的人。
荣耀归于神,平安归于他所喜悦的人。
硬件介绍:
CPU: at91rm9200
SDRAM: IS42S16160C-7TLI 32M
NAND FALSH: H27U1G8F2BTR(或nand512w3a2snb)
NORFLASH): S29AL016J70TFI020 SST39VF6401-70-4C-B1K
NET: CS8900A-IQ3Z
扩展网卡: CS8900A-IQ3Z 或 DM9000
编译环境介绍:
linux系统: Ubuntu 18.04.3 LTS (GNU/Linux 5.3.0-53-generic x86_64)
编译器: arm-linux-gcc-4.1.1-920t.tar.bz2
j-link工程文件: arm9v2.jflash
非常非常重要,用j-link下载程序全靠它!
-
在本机下载u-boot1.3.4,然后利用ftp工具把u-boot1.3.4上传到服务器上/RM9200/soft下:
ftp://ftp.denx.de/pub/u-boot/ -
解压:$tar xjf u-boot-1.3.4.tar.bz2 -C …/
-
配置u-boot:
在Makefile line2352找到:
at91rm9200dk_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t at91rm9200dk atmel at91rm9200$make at91rm9200dk_config
Configuring for at91rm9200dk board…$make
… …
arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin测试:把u-boot.bin文件下载到开发板中,重新上电串口无反应
-
改变为norflash启动:
修改/u-boot-1.3.4/cpu/arm920t/start.s:
line181: #ifdef CONFIG_AT91RM9200 /* change1: ifnodef->if defined /
line266: / #else / / change2: 注释掉 #else*/保存文件后重新编译: @make
测试:把u-boot.bin文件下载到开发板中,重新上电串口输出:
U-Boot 1.3.4 (Jul 24 2020 - 09:58:49)
DRAM: 32 MB
Atmel: Flash: 0 kB
NAND: 0 MB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
U-Boot> -
配置norflash: S29AL016J70TFI020(CFI标准的flash) manufacturer id:0x1 device id: 0x2249
入口函数在/u-boot-1.3.4/lib_arm/board.c:
line333: ifndef CFG_NO_FLASH
/* configure available FLASH banks /
size = flash_init ();
display_flash_config (size);
#endif / CFG_NO_FLASH *//u-boot-1.3.4/board/atmel/at91rm9200dk/Makefile:
注释: line28: COBJS := at91rm9200dk.o led.o mux.o partition.o # 去掉flash.o/u-boot-1.3.4/include/configs/at91rm9200dk.h:
添加在#define PHYS_FLASH_1 0x10000000 上一行:
/* NOR FLASH START*/
#define CFG_FLASH_CFI 1
#define CFG_FLASH_CFI_DRIVER 1
#define CFG_FLASH_USE_BUFFER_WRITE 1
#define CFG_FLASH_INCREMENT 0
#define CFG_FLASH_PROTECTION 1
#define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE }
#define CFG_FLASH_CFI_WIDTH FLASH_CFI_16BIT/* S29AL016J70TFI020 */
保存后重新编译: $make
测试:把u-boot.bin文件下载到开发板中,重新上电串口输出:
U-Boot 1.3.4 (Jul 24 2020 - 13:24:13)
DRAM: 32 MB
Flash: 2 MB
NAND: 0 MB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
U-Boot>
“Flash: 2 MB”, 找到了第一个flash
在"U-Boot>"后输入flinfo 打印如下信息
Bank # 1: CFI conformant FLASH (16 x 16) Size: 2 MB in 35 Sectors
AMD Standard command set, Manufacturer ID: 0x01, Device ID: 0x2249
Erase timeout: 8192 ms, write timeout: 1 ms
Sector Start Addresses:
10000000 10004000 10006000 10008000 10010000
10020000 10030000 10040000 10050000 10060000 RO
10070000 10080000 10090000 100A0000 100B0000
100C0000 100D0000 100E0000 100F0000 10100000
10110000 10120000 10130000 10140000 10150000
10160000 10170000 10180000 10190000 101A0000
101B0000 101C0000 101D0000 101E0000 101F0000 -
配置norflash: SST39VF6401(jedec标准的flash) JEDEC PROBE: manufacturer id:0xbf device id: 0x236d
/u-boot-1.3.4/include/configs/at91rm9200dk.h:
修改:#define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE }
为:#define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE, CFG_FLASH2_BASE }
修改:#define CFG_MAX_FLASH_BANKS 1
为:#define CFG_MAX_FLASH_BANKS 2添加在#define CFG_FLASH_WRITE_TOUT (2*CFG_HZ) /* Timeout for Flash Write */下一行: /* SST39VF6401 */ #define CONFIG_FLASH_CFI_LEGACY 1 #define CFG_FLASH_LEGACY_8Mx8 1 #define PHYS_FLASH_2 0x30000000 #define PHYS_FLASH2_SIZE 0x4000000 /* 64 megs bit main flash */ #define CFG_FLASH2_BASE PHYS_FLASH_2 /* NOR FLASH END*/
/u-boot-1.3.4/drivers/mtd/cfi_flash.c:
修改: line66: #define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE }
为:#define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE, CFG_FLASH2_BASE }/u-boot-1.3.4/board/atmel/at91rm9200dk/at91rm9200dk.c:
添加在最后一行:
#if defined(CONFIG_FLASH_CFI_LEGACY)
/*
* Hardcoded flash setup:
* Flash 0 is a non-CFI AMD AM29F040 flash, 8 bit flash / 8 bit bus.
/
ulong board_flash_get_legacy (ulong base, int banknum, flash_info_t * info)
{
if (banknum == 1) { / non-CFI boot flash */
AT91C_BASE_SMC2->SMC2_CSR[2] = 0x1100318A;
info->portwidth = FLASH_CFI_16BIT;
info->chipwidth = FLASH_CFI_BY16;
info->interface = FLASH_CFI_X16;
return 1;
} else
return 0;
}
#endif/u-boot-1.3.4/drivers/mtd/jedec_flash.c:
添加line68:
#define SST39VF6401 0x236d添加line189: #ifdef CFG_FLASH_LEGACY_8Mx8 {