简述编译进内核的平台设备是如何在内核注册的(by liukun3211咕唧咕唧)
2011-11-25 19:49
267 查看
对内核结构感到迷惑,是因为缺少好奇心。这句话说得一点也不假。顺利的移植完驱动,看到内核顺利的启动,驱动正常工作。貌似是大功告成。可是对于一个学习驱动的人来说这可不是什么好事。由于前段时间太顺利,被一次次的“success”迷了心窍。自认为了不得了。上星期在移植uda1341驱动时,才突然反思,驱动目录里很多设备的驱动都是基于platform虚拟平台总线的。但是驱动程序里只有对device_driver的注册,那设备在哪里注册的。难道不需要?这当然是不可能的。
追踪内核的驱动代码,没发现platform_device注册的蛛丝马迹(后来才发现是没找对地方)。今天突然想到了内核启动时,加载的平台相关的模块。于是我找到了自己内核的mach-micro2440.c文件。。。原来在这里。。。全都在这里。。。这个文件里有所有需要初始化的平台设备(设备结构体)。最后将所有的平台设备定义在一个平台结构体数组中。
static struct platform_device *mini2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_wdt,
/* &s3c_device_adc,*/ /* ADC doesn't like living with touchscreen ! */
&s3c_device_i2c0,
&s3c_device_rtc,
&s3c_device_usbgadget,
&mini2440_device_eth,
&mini2440_led1,
&mini2440_led2,
&mini2440_led3,
&mini2440_led4,
&mini2440_button_device,
&s3c_device_nand,
&s3c_device_sdi,
&s3c_device_iis,
&mini2440_audio,
/* &s3c_device_timer[0],*/ /* buzzer pwm, no API for it */
/* remaining devices are optional */
};
在我们加载模块时,会调用到platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));函数
该函数内容如下:
int platform_add_devices(struct platform_device **devs, int num)
{
int i, ret = 0;
for (i = 0; i < num; i++) {
ret = platform_device_register(devs[i]);
if (ret) {
while (--i >= 0)
platform_device_unregister(devs[i]);
break;
}
}
return ret;
}
然后调用到了platform_device_register(devs[i]);
这个函数
int platform_device_register(struct platform_device *pdev)
{
device_initialize(&pdev->dev);
return platform_device_add(pdev);
}
而后platform_device_add(pdev);
OK到此为止,platform结构已经被加入到了内核链表中了。过程就这么简单,当然内涵可是相当的丰富,不是像这样几句话就说的清的,相信大家源码都读的懂,我就不在这里罗嗦了。
追踪内核的驱动代码,没发现platform_device注册的蛛丝马迹(后来才发现是没找对地方)。今天突然想到了内核启动时,加载的平台相关的模块。于是我找到了自己内核的mach-micro2440.c文件。。。原来在这里。。。全都在这里。。。这个文件里有所有需要初始化的平台设备(设备结构体)。最后将所有的平台设备定义在一个平台结构体数组中。
static struct platform_device *mini2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_wdt,
/* &s3c_device_adc,*/ /* ADC doesn't like living with touchscreen ! */
&s3c_device_i2c0,
&s3c_device_rtc,
&s3c_device_usbgadget,
&mini2440_device_eth,
&mini2440_led1,
&mini2440_led2,
&mini2440_led3,
&mini2440_led4,
&mini2440_button_device,
&s3c_device_nand,
&s3c_device_sdi,
&s3c_device_iis,
&mini2440_audio,
/* &s3c_device_timer[0],*/ /* buzzer pwm, no API for it */
/* remaining devices are optional */
};
在我们加载模块时,会调用到platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));函数
该函数内容如下:
int platform_add_devices(struct platform_device **devs, int num)
{
int i, ret = 0;
for (i = 0; i < num; i++) {
ret = platform_device_register(devs[i]);
if (ret) {
while (--i >= 0)
platform_device_unregister(devs[i]);
break;
}
}
return ret;
}
然后调用到了platform_device_register(devs[i]);
这个函数
int platform_device_register(struct platform_device *pdev)
{
device_initialize(&pdev->dev);
return platform_device_add(pdev);
}
而后platform_device_add(pdev);
OK到此为止,platform结构已经被加入到了内核链表中了。过程就这么简单,当然内涵可是相当的丰富,不是像这样几句话就说的清的,相信大家源码都读的懂,我就不在这里罗嗦了。
相关文章推荐
- 如何在Android平台上使用PMEM及注册Platform设备
- 【Linux高级驱动】平台设备驱动机制的编程流程与编译进内核
- 【转】如何编译一个内核 - Ubuntu方式
- 如何编译免注册COM(reg-free COM)
- 关于 Visual Studio C#工程属性的Build Events中如何根据编译平台分别设置的解答
- x86平台内核配置、编译、和安装
- [HOW-TO]Windows平台如何编译代码
- 如何将驱动或模块编译进内核
- linux如何编译安装新内核支持NTFS文件系统(以redhat7.2x64为例)
- Modbus串口设备如何接入多比物联网云平台
- [HOW-TO] Windows平台如何编译MySQL代码
- 如何编译ffmpeg以支持dshow设备
- userAgent,JS用户代理检测——判断浏览器内核、浏览器、浏览器平台、windows操作系统版本、移动设备、游戏系统
- 如何编译自己的内核树
- 如何编译 smspopup---出自Android平台值得关注的开源项目
- 如何编译一个内核 - Fedora方式
- Android平台上PMEM的使用及Platform设备注册(一)
- 蜂鸣器驱动程序,应用程序控制(自动创建设备节点,内核目录之外编译)
- 【转】如何下载并编译Android4.0内核源码goldfish(图文)
- 物联网平台机智云Android开源框架入门之旅(六)如何修改设备的名字,并且添加描述信息。