原创 [博客大赛]U-Boot for AM335x (11) U-Boot中eth驱动

2014-8-28 15:50 2159 14 16 分类: MCU/ 嵌入式 文集: U-Boot

U-Boot for AM335x (11) U-Boot中eth驱动

在调试eth驱动之前,先把下面这个函数整理一下:
int board_late_init(void)
它的主要作用是,为U-Boot添加两个环境变量,名为board_name和board_rev,它们和AM335x的评估板版本有关,因为我只需要对Forlinx的OK335D单板进行porting,所以将里面的内容全部删除,直接返回0。

当然,为了调试U-Boot,而不是自动解压Linux kernel,需要把前面的uEnv.txt文件从SD卡中删除。

驱动eth的第一步,是定义GPIO的引脚mux:
static struct module_pin_mux rgmii1_pin_mux[] = {
        {OFFSET(mii1_txen), MODE(2)},                   /* RGMII1_TCTL */
        {OFFSET(mii1_rxdv), MODE(2) | RXACTIVE},        /* RGMII1_RCTL */
        {OFFSET(mii1_txd3), MODE(2)},                   /* RGMII1_TD3 */
        {OFFSET(mii1_txd2), MODE(2)},                   /* RGMII1_TD2 */
        {OFFSET(mii1_txd1), MODE(2)},                   /* RGMII1_TD1 */
        {OFFSET(mii1_txd0), MODE(2)},                   /* RGMII1_TD0 */
        {OFFSET(mii1_txclk), MODE(2)},                  /* RGMII1_TCLK */
        {OFFSET(mii1_rxclk), MODE(2) | RXACTIVE},       /* RGMII1_RCLK */
        {OFFSET(mii1_rxd3), MODE(2) | RXACTIVE},        /* RGMII1_RD3 */
        {OFFSET(mii1_rxd2), MODE(2) | RXACTIVE},        /* RGMII1_RD2 */
        {OFFSET(mii1_rxd1), MODE(2) | RXACTIVE},        /* RGMII1_RD1 */
        {OFFSET(mii1_rxd0), MODE(2) | RXACTIVE},        /* RGMII1_RD0 */
        {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN},/* MDIO_DATA */
        {OFFSET(mdio_clk), MODE(0) | PULLUP_EN},        /* MDIO_CLK */
        {-1},
};

驱动eth的第二步,是执行:
configure_module_pin_mux(rgmii1_pin_mux);
这个函数可以放在void set_mux_conf_regs(void)里面实现,它在SPL阶段就被调用了。

驱动eth的第三步,是执行:
int board_eth_init(bd_t *bis)
去掉其中关于beagle部分,只保留evm的rgmii语句。它的主要功能是读取AM335x的CONTROL_MODULE REGISTERS的device id的值,其中就包含eth0和eth1的mac地址;然后为ethaddr和eth1addr添加环境变量;注册cpsw设备;并且处理有关AR8051关于tx clock delay的部分;

完成之后重新编译运行,在U-Boot命令提示符下输入:
U-Boot# printenv
就会在打印的一大堆信息中发现:
eth1addr=88:33:14:ed:df:e0
ethact=cpsw
ethaddr=88:33:14:ed:df:de
fdt_high=0xffffffff
fdtaddr=0x80F80000

此时它是没有ip地址的,需要给它手动指定一个:
U-Boot# serenv ipaddr 192.168.1.115

然后使用ping命令:
U-Boot# ping 192.168.1.135
link up on port 0, speed 100, full duplex
Using cpsw device
host 192.168.1.135 is alive

到这里为止,最新版的U-Boot基本上算是porting成功,我所做的所有工作只是在各个不同的地方加上printf的打印信息,并且根据Forlinx的硬件删减board.c的内容。这也说明U-Boot的驱动几乎包含了所有的主流硬件,节省了开发时间和精力。

接下来,就该解决Linux kernel的解压问题了。u-boot.img会从SD卡MMC0中读取uEnv.txt和uImage,然后将uImage解压到DRAM中(这也是为什么DRAM的驱动必须放在U-Boot而不是kernel里面),解压完成之后会跳转到相应的地址去执行。

至于SPI、PWM、AD等等的驱动也可以在U-Boot中调试相应的功能,不过它们与我需要porting的主线并没有关系,因此暂时跳过。下一步,是编译出新版的Linux内核,并且让它顺利的被解压和运行。

 

文章评论2条评论)

登录后参与讨论

DiracFatCat 2014-8-28 16:13

必须的~

用户403664 2014-8-28 16:07

好速度
相关推荐阅读
DiracFatCat 2018-09-05 12:14
【博客大赛】卡尔曼滤波学习笔记(11)从位置估计速度
卡尔曼滤波器,不仅仅是一个低通滤波器,否则也不会持续发展50年。 示例:桑先生需要测试高速列车的性能。测试的目的是判断列车在直线上能否保持80m/s的速度。速度和位置每0.1秒测量一次,但是由于...
DiracFatCat 2018-08-31 19:32
【博客大赛】卡尔曼滤波学习笔记(10)一个简单的示例
《Kalman Filtering: Theory and Practice Using MATLAB》第三章,看不懂,暂时略过。《Kalman Filtering: Theory and Pract...
DiracFatCat 2018-07-19 15:09
对sed命令的练习
sed是流编辑器。它每次处理一个输入,因此很有效率。官方手册:https://www.gnu.org/software/sed/manual/sed.html学习Linux命令,当然要阅读官方手册,所...
DiracFatCat 2018-06-19 15:10
【博客大赛】卡尔曼滤波学习笔记(八)可观测性和可控制性 ...
可观测性是指,在给定模型的情况下,动力学系统的状态是否由它的输入输出唯一确定。可观测性是系统模型的特征。如果传感器矩阵H是可逆的,则本系统可观测,因为有:如果传感器矩阵H某些时候是不可逆的,则本系统仍...
DiracFatCat 2018-06-19 10:56
【博客大赛】卡尔曼滤波学习笔记(七)Z变换
如果我们仅仅对离散线性系统感兴趣,那么就使用下面这个表达式:如果u是常量,那么可以写成:为了简化表达式,我们可以将上面写成:离散线性时不变系统的Φ求解,可以使用Z变换。(* 由于本人已经忘记了Z变换的...
DiracFatCat 2018-06-19 10:54
【博客大赛】卡尔曼滤波学习笔记(六)拉普拉斯变换
对于线性时变/时不变系统,求解Φ(t)有多种方式,拉普拉斯变换是其中一种。(* 由于本人已经忘记了拉普拉斯变换的内容,因此本节待续。)...
我要评论
2
14
关闭 站长推荐上一条 /2 下一条