序号 | 执行过程 |
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中能够找到一个函数initr_net,这个函数内部能进一步看到网络是如何初始化的。
initr_net内部包含过程如下表: [td]
序号 | 过程 |
1 | eth_initialize(eth_uclass.c) |
2 | reset_phy(marvell类型) |
序号 | 过程 |
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 |
序号 | 过程 |
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 |
由于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 |