当前位置:首页 > 单片机 > 单片机
[导读]驱动程序识别设备时,有以下两种方法:(1)驱动程序本身带有设备信息,比如开始地址、中断号等;加载驱动程序时,就可以根据这些信息来识别设备。(2)驱动程序本身没有设备信息,但是内核中已经(或以后)根据其他

驱动程序识别设备时,有以下两种方法:

(1)驱动程序本身带有设备信息,比如开始地址、中断号等;加载驱动程序时,就可以根据这些信息来识别设备。

(2)驱动程序本身没有设备信息,但是内核中已经(或以后)根据其他方式确定了很多设备的信息;加载驱动程序时,将驱动程序与这些设备逐个比较,确定两者是否匹配(math)。如果驱动程序与某个设备匹配,就可以通过该驱动程序来操作这个设备了。

内核常使用第二种方法来识别设备,这可以将各种设备集中在一个文件中管理,当开发板的配置改变时,便于修改代码。在内核文件include/linux/platform_device.h中,定义了两个数据结构来表示这些设备和驱动程序:platform_device结构用来描述设备的名称、ID、所占用的资源(比如内存地址/大小、中断号)等;platform_driver结构用来描述各种操作函数,比如枚举函数、移除设备函数、驱动名称等。

内核启动后,首先构造链表将描述设备的platform_device结构组织起来,得到一个设备的列表;当加载某个驱动程序的platform_driver结构时,使用一些匹配函数来检查驱动程序能否支持这些设备,常用的检查方法很简单:比较驱动程序和设备的名称。

以S3C2410开发板为例,在include/arch/arm/mach-s3c2410/mach-smdk2410.c中定义了如下设备:

89 static struct platform_device *smdk2410_devices[] __initdata = {

90&s3c_device_usb,

91&s3c_device_lcd,

92&s3c_device_wdt,

93&s3c_device_i2c,

94&s3c_device_iis,

95 };

104 static void __init smdk2410_init(void)

105 {

106platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));

107smdk_machine_init();

108 }

在include/arch/arm/plat-s3c24xx/common-smdk.c中定义了如下设备:

175 static struct platform_device __initdata *smdk_devs[] = {

176&s3c_device_nand,

177&smdk_led4,

178&smdk_led5,

179&smdk_led6,

180&smdk_led7,

181 };

183 void __initsmdk_machine_init(void)

184 {

185/* Configure the LEDs (even if we have no LED support)*/

186

187s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);

188s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP);

189s3c2410_gpio_cfgpin(S3C2410_GPF6, S3C2410_GPF6_OUTP);

190s3c2410_gpio_cfgpin(S3C2410_GPF7, S3C2410_GPF7_OUTP);

191

192s3c2410_gpio_setpin(S3C2410_GPF4, 1);

193s3c2410_gpio_setpin(S3C2410_GPF5, 1);

194s3c2410_gpio_setpin(S3C2410_GPF6, 1);

195s3c2410_gpio_setpin(S3C2410_GPF7, 1);

196

197if (machine_is_smdk2443())

198smdk_nand_info.twrph0 = 50;

199

200s3c_device_nand.dev.platform_data = &smdk_nand_info;

201

202platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs));

203

204s3c2410_pm_init();

205 }

627 int __init s3c2410_pm_init(void)

628 {

629printk("S3C2410 Power Management, (c) 2004 Simtec Electronicsn");

630

631suspend_set_ops(&s3c2410_pm_ops);

632return 0;

633 }

这些设备在smdk2410_init函数(对应S3C2410)或smdk2440_machine_init函数(对应S3C2440)中,通过plat_add_devices函数注册进内核中。

NAND Flash设备s3c2410_device_nand在include/arch/arm/plat-s3c24xx/devs.c中的定义如下:

201 struct platform_devices3c_device_nand= {

202.name= "s3c2410-nand",

203.id= -1,

204.num_resources= ARRAY_SIZE(s3c_nand_resource),

205.resource= s3c_nand_resource,

206 };

207

208 EXPORT_SYMBOL(s3c_device_nand); /*导出符号,以便外部文件引用*/

对于S3C2440开发板,s3c_device_nand结构的名字会在s3c244x_map_io函数中修改为“s3c2440-nand”,这个函数在include/arch/arm/plat-s3c24xx/s3c244x.c中定义如下:

59 void __init s3c244x_map_io(struct map_desc *mach_desc, int size)

...

68s3c_device_i2c.name= "s3c2440-i2c";

69s3c_device_nand.name = "s3c2440-nand";

70s3c_device_usbgadget.name = "s3c2440-usbgadget";

71 }

有了NAND Flash设备,还要有NAND Flash驱动程序,内核针对S3C2410、S3C2412、S3C2440定义了3个驱动。它们在include/drivers/mtd/nand/s3c2410.c中的s3c2410_nand_init函数中注册进内核,如下所示:

890 static int __init s3c2410_nand_init(void)

891 {

892printk("S3C24XX NAND Driver, (c) 2004 Simtec Electronicsn");

893

894platform_driver_register(&s3c2412_nand_driver);

895platform_driver_register(&s3c2440_nand_driver);

896return platform_driver_register(&s3c2410_nand_driver);

897 }

其中的S3C2410_nand_driver结构是在include/drivers/mtd/nand/s3c2410.c中定义,如下所示:

857 static struct platform_drivers3c2410_nand_driver= {

858.probe= s3c2410_nand_probe,

859.remove= s3c2410_nand_remove,

860.suspend= s3c24xx_nand_suspend,

861.resume= s3c24xx_nand_resume,

862.driver= {

863.name= "s3c2410-nand",

864.owner= THIS_MODULE,

865},

866 };

可见,s3c_device_nand结构和s3c2410_nand_driver结构中的name成员相同,都是“s3c2410-nand”。platform_driver_register函数就是根据这点确定它们是匹配的,所以调用s3c2410_nand_probe函数枚举NAND Flash设备s3c2410_device_nand。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭