Linux-3.5-Exynos4412驱动分层分离

Posted Jason_linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux-3.5-Exynos4412驱动分层分离相关的知识,希望对你有一定的参考价值。

 

linux-3.5/Documentation/driver-model/bus.txt

先写一个简单的例子,是为了给学习platform做准备。

dev.h

 1 #ifndef  JASON_DEV_H_
 2 #define JASON_DEV_H_
 3 
 4 #include <linux/device.h>
 5 
 6 struct pridevice {
 7     struct device device;
 8     char *name;
 9 };
10 
11 
12 #endif
 1 #include <linux/module.h>
 2 #include <linux/init.h>
 3 #include <linux/syscalls.h>
 4 #include <linux/io.h>
 5 #include <linux/uaccess.h>
 6 
 7 #include "dev.h"
 8 
 9 static int mara_match(struct device *dev, struct device_driver *drv)
10 {
11     struct pridevice *pdev = container_of(dev, struct pridevice, device);
12 
13     printk("match: %s device try match %s driver...\\n", pdev->name, drv->name);
14 
15     return !strcmp(pdev->name, drv->name );
16     //返回值为1代表匹配成功,为0则失败
17 }
18 
19 static struct bus_type demobus = {
20     .name    =    "marathon",
21     .match    =    mara_match,
22 };
23 EXPORT_SYMBOL_GPL(demobus);
24 
25 module_driver(demobus, bus_register, bus_unregister);
26 
27 MODULE_LICENSE("GPL");
28 
29 MODULE_AUTHOR("no name");
30 MODULE_VERSION("J-15");
31 MODULE_DESCRIPTION("a simple demo for driver module");
bus.c
 1 #include <linux/module.h>
 2 #include <linux/init.h>
 3 #include <linux/syscalls.h>
 4 #include <linux/io.h>
 5 #include <linux/uaccess.h>
 6 
 7 #include "dev.h"
 8 
 9 extern struct bus_type demobus;
10 
11 static void demo_release(struct device *dev)
12 {
13     struct pridevice *pdev = container_of(dev, struct pridevice, device);
14 
15     printk("%s device is released....\\n", pdev->name);
16 }
17 
18 static struct pridevice demodev1 = {
19     .device = {
20         .init_name     = "spring_1",    
21         .bus           = &demobus,
22         .release    = demo_release,
23     },
24     .name    =  "spring",
25 };
26 
27 static int demo_init1(void)
28 {
29     return device_register(&demodev1.device);
30 }
31 
32 /*此宏用于指定驱动的入口函数, 内核启动或插入模块到内核时被调用*/
33 module_init(demo_init1);
34 
35 
36 static void demo_exit1(void)
37 {
38     device_unregister(&demodev1.device);
39 }
40 
41 /*此宏用于指定驱动模块输出函数*/
42 module_exit(demo_exit1);
43 
44 MODULE_LICENSE("GPL");
45 
46 MODULE_AUTHOR("no name");
47 MODULE_VERSION("J-15");
48 MODULE_DESCRIPTION("a simple demo for driver module");
dev.c
 1 #include <linux/module.h>
 2 #include <linux/init.h>
 3 #include <linux/syscalls.h>
 4 #include <linux/io.h>
 5 #include <linux/uaccess.h>
 6 
 7 #include "dev.h"
 8 
 9 extern struct bus_type demobus;
10 
11 static int demo_probe (struct device *dev)
12 {
13     /*
14          当总线的match函数返回1时,则由内核调用驱动对象的probe指针指向的
15         函数
16      */
17 
18     struct pridevice *pdev = container_of(dev, struct pridevice, device);
19     struct device_driver *pdrv = dev->driver;
20 
21     printk("probe: %s driver do %s device...\\n",
22             pdrv->name, pdev->name);
23 
24     return 0;
25 }
26 
27 static int demo_remove (struct device *dev)
28 {
29     struct pridevice *pdev = container_of(dev, struct pridevice, device);
30     struct device_driver *pdrv = dev->driver;
31 
32     printk("remove: %s driver remove %s device...\\n",
33             pdrv->name, pdev->name);
34 
35     return 0;
36 }
37 
38 static struct device_driver demodrv1 = {
39     .name    =       "spring",
40     .bus            =     &demobus,    
41     .probe    =    demo_probe,
42     .remove    =    demo_remove,
43 };
44 
45 module_driver(demodrv1, driver_register, driver_unregister);
46 
47 MODULE_LICENSE("GPL");
48 
49 MODULE_AUTHOR("no name");
50 MODULE_VERSION("J-15");
51 MODULE_DESCRIPTION("a simple demo for driver module");
drv.c

查看总线:

insmod bus.ko     查看总线:

生成的:marathon

目前还没有加载dev       drv

加载驱动后:

 

 

 

 

platform 总线是内核自身已经注册好的一种总线,我们无须再注册,直接根据总线的匹配规则
来管理设备对象和驱动对象。那么设备对象和驱动对象的类型如下:

参考手册:linux-3.5/Documentation/driver-model/platform.txt

 

匹配规则:

看完理解之后,常用第二种和第三种匹配规则:

第二种匹配规则:

  

 

以上是关于Linux-3.5-Exynos4412驱动分层分离的主要内容,如果未能解决你的问题,请参考以下文章

Exynos4412 IIC总线驱动开发—— IIC 基础概念及驱动架构分析

Linux驱动开发-中断分层机制笔记 6

Linux驱动开发-中断分层机制笔记 6

[转载]嵌入式开发板-iTOP-4412开发板LCD的屏幕驱动

iTOP-4412开发板驱动lcd显卡以及linux开机log的修改方法

《Linux驱动》iTop4412开发板LCD驱动 详细分析