<code> zynq_init_machine---> 当前的zybo的机器初始化主函数。如需上点后初始化该板子的其他外设,可以在本函数内添加相应的初始化功能。 </code>
玩过或者移植过arm-linux的都应该知道在/arch/arm目录下有许多与具体处理器相关的目录,当然对于zynq的话所对应的目录就是mach-zynq,在里面找到与具体板子相关的文件Linux-Digilent-Dev-masterarcharmmach-zynqarmcommon.c,没错,就是它。无论是出于想移植到新的内核还是出于想深入学习某一款arm等,对这个文件的学习是必不可少的。这个文件大部分内容是对平台设备的结构体初始化,在这个文件的最后有一个非常重要的宏:
<code>DT_MACHINE_START(XILINX_EP107, <span class="hljs-string">"Xilinx Zynq Platform"</span>)
<span class="hljs-comment">/* 64KB way size, 8-way associativity, parity disabled */</span>
<span class="hljs-preprocessor">.l</span>2c_aux_val = <span class="hljs-number">0x00000000</span>,
<span class="hljs-preprocessor">.l</span>2c_aux_mask = <span class="hljs-number">0xffffffff</span>,
<span class="hljs-preprocessor">.smp</span> = smp_ops(zynq_smp_ops),
<span class="hljs-preprocessor">.map</span>_io = zynq_map_io,
<span class="hljs-preprocessor">.init</span>_irq = zynq_irq_init,
<span class="hljs-preprocessor">.init</span>_machine = zynq_init_machine,
<span class="hljs-preprocessor">.init</span>_late = zynq_init_late,
<span class="hljs-preprocessor">.init</span>_time = zynq_timer_init,
<span class="hljs-preprocessor">.dt</span>_compat = zynq_dt_match,
<span class="hljs-preprocessor">.reserve</span> = zynq_memory_init,
<span class="hljs-preprocessor">.restart</span> = zynq_system_reset,
MACHINE_END</code>
DT_:qMACHINE_START的定义在arch/arm/include/asm/mach/arch.h,如下:
<code><span class="hljs-preprocessor">#<span class="hljs-keyword">define</span> DT_MACHINE_START(_name, _namestr) </span>
<span class="hljs-keyword">static</span> <span class="hljs-keyword">const</span> <span class="hljs-keyword">struct</span> machine_desc __mach_desc_<span class="hljs-preprocessor">##_name </span>
__used __attribute__((__section__(<span class="hljs-string">".arch.info.init"</span>))) = { .nr = ~<span class="hljs-number">0</span>, .name = _namestr,
<span class="hljs-preprocessor">#<span class="hljs-keyword">endif</span></span></code>
噢,其实就是定义了一个struct machine_desc类型结构体变量,这个结构体还定义了其他一些成员,接下来着重关注.init_machine这个成员,它是一个函数指针,值为zynq_init_machine,这个函数也在common.c中定义。内容是什么呢?呵呵,因为在这里只给出大体流程,具体内容先不分析。现在最关心的是这个结构体变量在哪里被调用,从而调用它里面的成员和成员函数呢?先来看/arch/arm/kernel/setup.c里面的setup_arch()函数:
<code><span class="hljs-literal">void</span> __init setup_arch(char <span class="hljs-subst">**</span>cmdline_p)
{
const struct machine_desc <span class="hljs-subst">*</span>mdesc;
setup_processor();
mdesc <span class="hljs-subst">=</span> setup_machine_fdt(__atags_pointer);
<span class="hljs-keyword">if</span> (<span class="hljs-subst">!</span>mdesc)
mdesc <span class="hljs-subst">=</span> setup_machine_tags(__atags_pointer, __machine_arch_type);
machine_desc <span class="hljs-subst">=</span> mdesc;
machine_name <span class="hljs-subst">=</span> mdesc<span class="hljs-subst">-></span>name;
<span class="hljs-keyword">if</span> (mdesc<span class="hljs-subst">-></span>reboot_mode <span class="hljs-subst">!=</span> REBOOT_HARD)
reboot_mode <span class="hljs-subst">=</span> mdesc<span class="hljs-subst">-></span>reboot_mode;
init_mm<span class="hljs-built_in">.</span>start_code <span class="hljs-subst">=</span> (unsigned long) _text;
init_mm<span class="hljs-built_in">.</span>end_code <span class="hljs-subst">=</span> (unsigned long) _etext;
init_mm<span class="hljs-built_in">.</span>end_data <span class="hljs-subst">=</span> (unsigned long) _edata;
init_mm<span class="hljs-built_in">.</span>brk <span class="hljs-subst">=</span> (unsigned long) _end;
<span class="hljs-comment">/* populate cmd_line too for later use, preserving boot_command_line */</span>
strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE);
<span class="hljs-subst">*</span>cmdline_p <span class="hljs-subst">=</span> cmd_line;
parse_early_param();
early_paging_init(mdesc, lookup_processor_type(read_cpuid_id()));
setup_dma_zone(mdesc);
sanity_check_meminfo();
arm_memblock_init(mdesc);
paging_init(mdesc);
request_standard_resources(mdesc);
<span class="hljs-keyword">if</span> (mdesc<span class="hljs-subst">-></span>restart)
arm_pm_restart <span class="hljs-subst">=</span> mdesc<span class="hljs-subst">-></span>restart;
unflatten_device_tree();
arm_dt_init_cpu_maps();
psci_init();
<span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-attribute">...</span><span class="hljs-built_in">.</span></code>
这个函数在/init/main.c的start_kernel()函数里被调用。看到第10行,这里的setup_machine()函数的作用就是找到我们想要的struct machine_desc类型的变量,也就是在common.c里定义那个变量。函数的参数machine_arch_type的值是什么呢?继续看:
版权声明:本文为博主原创文章,未经博主允许不得转载。
[Zedboard Linux系统移植]-从MACHINE_START开始
标签:移植 内核
本文系统来源:http://blog.csdn.net/xiabodan/article/details/46835827
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!