ARM Linux 3.x的设备树(Device Tree)
时间:11-09
来源:互联网
点击:
3. Device Tree引发的BSP和驱动变更
有了Device Tree后,大量的板级信息都不再需要,譬如过去经常在arch/arm/plat-xxx和arch/arm/mach-xxx实施的如下事情:1. 注册platform_device,绑定resource,即内存、IRQ等板级信息。
透过Device Tree后,形如
[cpp]view plaincopy
- 90staticstructresourcexxx_resources[]={
- 91[0]={
- 92.start=…,
- 93.end=…,
- 94.flags=IORESOURCE_MEM,
- 95},
- 96[1]={
- 97.start=…,
- 98.end=…,
- 99.flags=IORESOURCE_IRQ,
- 100},
- 101};
- 102
- 103staticstructplatform_devicexxx_device={
- 104.name="xxx",
- 105.id=-1,
- 106.dev={
- 107.platform_data=&xxx_data,
- 108},
- 109.resource=xxx_resources,
- 110.num_resources=ARRAY_SIZE(xxx_resources),
- 111};
[cpp]view plaincopy
- 18staticstructof_device_idxxx_of_bus_ids[]__initdata={
- 19{.compatible="simple-bus",},
- 20{},
- 21};
- 22
- 23void__initxxx_mach_init(void)
- 24{
- 25of_platform_bus_probe(NULL,xxx_of_bus_ids,NULL);
- 26}
- 32
- 33#ifdefCONFIG_ARCH_XXX
- 38
- 39DT_MACHINE_START(XXX_DT,"GenericXXX(FlattenedDeviceTree)")
- 41…
- 45.init_machine=xxx_mach_init,
- 46…
- 49MACHINE_END
- 50#endif
2.注册i2c_board_info,指定IRQ等板级信息。
形如
[cpp]view plaincopy
- 145staticstructi2c_board_info__initdataafeb9260_i2c_devices[]={
- 146{
- 147I2C_BOARD_INFO("tlv320aic23",0x1a),
- 148},{
- 149I2C_BOARD_INFO("fm3130",0x68),
- 150},{
- 151I2C_BOARD_INFO("24c64",0x50),
- 152},
- 153};
[cpp]view plaincopy
- i2c@1,0{
- compatible="acme,a1234-i2c-bus";
- …
- rtc@58{
- compatible="maxim,ds1338";
- reg=<58>;
- interrupts=<73>;
- };
- };
3. 注册spi_board_info,指定IRQ等板级信息。
形如
[cpp]view plaincopy
- 79staticstructspi_board_infoafeb9260_spi_devices[]={
- 80{/*DataFlashchip*/
- 81.modalias="mtd_dataflash",
- 82.chip_select=1,
- 83.max_speed_hz=15*1000*1000,
- 84.bus_num=0,
- 85},
- 86};
4.多个针对不同电路板的machine,以及相关的callback。
过去,ARM Linux针对不同的电路板会建立由MACHINE_START和MACHINE_END包围起来的针对这个machine的一系列callback,譬如:
[cpp]view plaincopy
- 373MACHINE_START(VEXPRESS,"ARM-VersatileExpress")
- 374.atag_offset=0x100,
- 375.smp=smp_ops(vexpress_smp_ops),
- 376.map_io=v2m_map_io,
- 377.init_early=v2m_init_early,
- 378.init_irq=v2m_init_irq,
- 379.timer=&v2m_timer,
- 380.handle_irq=gic_handle_irq,
- 381.init_machine=v2m_init,
- 382.restart=vexpress_restart,
- 383MACHINE_END
引入Device Tree之后,MACHINE_START变更为DT_MACHINE_START,其中含有一个.dt_compat成员,用于表明相关的machine与.dts中root结点的compatible属性兼容关系。如果Bootloader传递给内核的Device Tree中root结点的compatible属性出现在某machine的.dt_compat表中,相关的machine就与对应的Device Tree匹配,从而引发这一machine的一系列初始化函数被执行。
[cpp]view plaincopy
- 489staticconstchar*constv2m_dt_
ARMLinux设备 相关文章:
- ARM嵌入式Linux设备树简介及应用示例(11-21)
- ARM嵌入式LINUX设备驱动设计入门学习(11-19)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)