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内核,并且让它顺利的被解压和运行。
DiracFatCat 2014-8-28 16:13
用户403664 2014-8-28 16:07