DM9000 网卡移植
由于DM9000 挂接在 EBI 总线上,所以CPU用SROM控制器(此处用BANK1)来对其进行访问和配置,SROM控制器直接接到AHB,所以保证了其通信速度
根据DM9000特性进行SROM控制器配置
#define DM9000_Tacs
(0x1)
/* 0clk address set-up
*/
#define DM9000_Tcos
(0x1)
/* 4clk chip selection set-up
*/
#define DM9000_Tacc
(0x5)
/* 14clk access cycle
*/
#define DM9000_Tcoh
(0x1)
/* 1clk chip selection hold
*/
#define DM9000_Tah
(0xC)
/* 4clk address holding time
*/
#define DM9000_Tacp
(0x9)
/* 6clk page mode access cycle
*/
#define DM9000_PMC
(0x1)
/* normal(1data)page mode configuration
*/
#define SROM_BC1_VAL
((DM9000_Tacs << 28) \
| (DM9000_Tcos << 24) \
| (DM9000_Tacc << 16) \
| (DM9000_Tcoh << 12) \
| (DM9000_Tah << 8) \
| (DM9000_Tacp << 4) \
| (DM9000_PMC))
.global srom_ctrl_init
srom_ctrl_init:
/* CSn, WE, OE*/
ldr
r0, =0x11000120
ldr
r1, =0x00222222
str
r1, [r0]
/* BE, WAIT, RD */
ldr
r0, =0x11000140
ldr
r1, =0x00002222
str
r1, [r0]
/* ADDR[0-7], pull up */
ldr
r0, =0x11000180
ldr
r1, =0x22222222
str
r1, [r0]
ldr
r0, =0x11000188
ldr
r1, =0x0000FFFF
str
r1, [r0]
/* DATA[0-7], pull up */
ldr
r0, =0x110001C0
ldr
r1, =0x22222222
str
r1, [r0]
ldr
r0, =0x110001C8
ldr
r1, =0x0000FFFF
str
r1, [r0]
/* DATA[8-15], pull up */
ldr
r0, =0x110001E0
ldr
r1, =0x22222222
str
r1, [r0]
ldr
r0, =0x110001E8
ldr
r1, =0x0000FFFF
str
r1, [r0]
/* SROM BANK 1 */
ldr
r0, =0x12570000
ldr
r1, [r0]
orr
r1, r1, #0xF0
str
r1, [r0]
ldr
r0, =0x12570008
ldr
r1, =SROM_BC1_VAL
str
r1, [r0]
mov
pc, lr
在include/configs/xxdk.h 添加如下配置宏
#define CONFIG_CMD_PING
#define CONFIG_CMD_ELF
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_MMC
#define CONFIG_CMD_FAT
#define CONFIG_CMD_NET
#undef CONFIG_CMD_NFS
#define CONFIG_CMD_NET
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x05000000 // SROMC 的BANK1 MEMORY地址
#define DM9000_IO
CONFIG_DM9000_BASE
#define DM9000_DATA
(CONFIG_DM9000_BASE + 4)
#define CONFIG_ETHADDR
11:22:33:44:55:66
#define CONFIG_IPADDR
192.168.9.200
#define CONFIG_SERVERIP 192.168.9.120
#define CONFIG_GATEWAYIP 192.168.9.1
#define CONFIG_NETMASK
255.255.255.0
在board/Samsung/xxdk/xxdk.c 添加网卡初始化函数
/*dm9000 initialize*/
#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_DRIVER_DM9000
rc = dm9000_initialize(bis);
#endif
return rc;
}
#endif
编译测试
> tftp 41000000 uImage
..........ok
这里重要的思想是:命令和驱动分离,每个层次有自己的处理问题的方法和范围,也就是高内聚低耦合原则
比如: 设备驱动在 driver中
设备初始化在 board/samsung/xxdk/xxdk.c 中
设备相关的命令在commom/下
编译配置宏在include/configs/xxdk.h 中
各司其事,层次清晰,协同工作
每次学习时, 层次一定要对,设计思想是重中之重
最后总结一下uboot2013 的4412启动流程
1. arch/arm/cpu/armv7/start.S
学习其刚开始的汇编的回调写法例如:ldr, pc, _irq
2. 根据 CONFIG_SPL_BUILD 选择uboot和spl
3. reset 宰狗,关闭电源管理芯片
4. bl cpu_init_cirt (spl)
| system_clock_init 时钟
| mem_ctrl_init 内存
在uboot运行时发现自己已在内存中则跳过时钟和内存的初始化
5.bl _main (arch/arm/lib/ctr0.S)
6.bl board_init_f (arch/arm/lib/board.c)(flash这里是sd, 重定向之前的准备工作)
7.bl relocate_code (arch/arm/cpu/armv7/start.S) 自己将自己搬移到内存中的高端地址
将内存低端留给加载的内核或其他镜像使用
8.ldr, pc, =board_init_r 在内存中初始化一些必要函数
......
board_init(); 板板相关的添加到此处
......
for(;;) {
main_loop(); // 解析字符串,查函数指针表,执行命令
}
over。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
相关文章
- 树莓派3b在rt-thread上移植LittlevGL
- 用arm-linux-gnueabihf移植MP3播放器libmad-0.15.1b的时候出现错误提示
- MiniGUI-3.0.12在loongson-1b版上的移植
- 【嵌入式开发学习笔记】Exynos4412 uboot移植笔记
- 在ARMSYS(S3C44B0X开发板)上进行uClinux内核移植的总结
- 基于iTop-4412的U-Boot 2017移植[0]:Exynos4412基础
- u-boot-2010.09移植(B)
- OpenHarmony3.0的树莓派4B移植-学习记录
- UC/OS-II的详细移植笔记 两种处理器的移植比较(S1C33209和S3C44B0X)
- Exynos4412 Uboot 移植(五)—— Uboot 移植过程