这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » Zynq-Linux移植学习笔记之七-网络驱动

共1条 1/1 1 跳转至

Zynq-Linux移植学习笔记之七-网络驱动

菜鸟
2017-06-28 14:00:36     打赏
这一篇讲一讲u-boot里面的网络驱动以及Linux内核里面的网络驱动,以及u-boot和linux的启动流程。 1、u-boot启动流程 u-boot启动是从start.s开始的,一直到进入main_loop结束。过程用下面一个表格表示,这里只列出几个重要的过程函数: [td]
序号 执行过程
1 start.s(_start)
2 lowlevel_init.s(lowlevel_init)
3 crt0.s (_main)
4 board_f.c(board_init_f)
5 board_r.c(board_init_r)
6 board_r.c(init_sequence_r)
7 board_r.c(main_loop)
在上面过程中init_sequence_r是一个function list,里面包括对所有用到的设备进行初始化。 
对于网络来说,在init_sequence_r中能够找到一个函数initr_net,这个函数内部能进一步看到网络是如何初始化的。 
initr_net内部包含过程如下表:
[td]
序号 过程
1 eth_initialize(eth_uclass.c)
2 reset_phy(marvell类型)
对于eth_initialize又可以分为下面几个步骤 [td]
序号 过程
1 eth_common_init->phy_init->phy_marvell_init->配置寄存器
2 uclass_first_device->device_probe(检测设备)
3 eth_get_dev_by_name(获取设备名)
4 num_devices(循环遍历设备)->eth_write_hwaddr(dev)
5 device_active->write_hwaddr调用zynq_gem设置mac
这就是zynq上u-boot加载网络设备的过程 2、linux内核启动过程 linux内核过程如下,这里只列举重要过程 [td]
序号 过程
1 head.s(arch/arm/kernel/head.s)
2 asmlinkage_visible void_init start_kernel(init/main.c)
3 rest_init内部创建init内核线程
4 init->do_basic_setup->do_initcalls
最后调用了initcall.init函数 
由于subsys_initcall(fn)=_initcall_fn4被放入了section initcall4.init中,在执行initcall.init函数时被调用 
又由于subsys_initcall=module_init等于调用驱动加载函数,加载了设备驱动。 
在zynq上linux加载网络驱动分为两个方面,一方面是控制器方面的驱动,另一方面是phy驱动。 
控制器方面驱动位于Macb.c (drivers\net\ethernet\cadence)中,重要的函数为macb_probe,其中包括三个主要函数
[td]
序号 函数名
1 macb_probe_queues探测设备
2 of_property_readu32读32位数组
3 of_get_named_gpio启动phy
phy操作调用marvell_drivers[](Marvell.c (drivers\net\phy))根据不同的phy选择对应的驱动进行操作。


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]