linux从eth11开始,U-Boot for AM335x (11) U-Boot中eth驱动

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内核,并且让它顺利的被解压和运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值