IMX257 总线设备驱动模型编程之总线篇(二)

发布时间:2024-08-15  

前面我们讲解了一个简单的总线驱动程序,目的就是在/sys/bus/下面创建文件,但是这还是不够的,因为总线也是一个设备,如果想让系统认识的话,必须要用device_register进行注册。


此处,我们就开始来注册一个总线,让总线下即可以包含属性文件,也包含设备文件,和驱动程序。

让驱动程序 和设备文件之间互联,这才是总线真正的用途。

 

一、程序解析

 

前面已经将的很详细,我们这儿在前面的基础上加上一下:

1. 定义总体设备结构体

并且实现 设备的release函数;

 

2. 导出总线设备

 

3. 注册设备驱动

 

4. 卸载设备

 

二、编译测试:

加载成功后,因为总线也是一个设备,所以在 /sys/bus/下面有my_bus这个目录

而在/sys/device/ 下面同样也生成了一个目录,名字为我们的my_bus 的init_name

如图所示

 

 

 

附上my_bus.c驱动程序:


 1 #include

 2 #include

 3 #include

 4 #include

 5 #include

 6 

 7 

 8 static char *Version = '$LoverXueEr : 1.0 $';

 9 

10 //检测驱动是否匹配设备,dev->bus_id 和 driver->name相等的

11 static int my_match(struct device *dev ,struct device_driver *driver){

12     return !strncmp(dev_name(dev),driver->name,strlen(driver->name));

13 }

14 

15 static void my_bus_release(struct device *dev){

16     printk('

17 }

18   

19 //设置设备的名字  dev_set_name(&dev,'name');

20 struct device my_bus = {

21     .init_name = 'my_bus0',

22     .release = my_bus_release,

23 };

24 

25 struct bus_type my_bus_type = {

26     .name = 'my_bus',

27     .match = my_match,

28 };

29 EXPORT_SYMBOL(my_bus);  //导出符号

30 EXPORT_SYMBOL(my_bus_type);

31 

32 //显示总线版本号

33 static ssize_t show_bus_version(struct bus_type *bus,char *buf){

34     return snprintf(buf,PAGE_SIZE,'%sn',Version);

35 }

36 

37 //产生后面的 bus_attr_version 结构体

38 static BUS_ATTR(version,S_IRUGO, show_bus_version, NULL);

39 

40 static int __init my_bus_init(void){

41     int ret;

42     /* 注册总线 */

43     ret = bus_register(&my_bus_type);

44     if(ret)

45         return ret;

46     /*  创建属性文件 */

47     if(bus_create_file(&my_bus_type, &bus_attr_version))

48         printk('

49 

50     /* 注册总线设备 */

51     ret = device_register(&my_bus);

52     if(ret)

53         printk('

54     return ret;

55 }

56 

57 static void my_bus_exit(void){

58     bus_unregister(&my_bus_type);

59     device_unregister(&my_bus);

60 }

61 

62 module_init(my_bus_init);

63 module_exit(my_bus_exit);

64 

65 

66 MODULE_AUTHOR('Lover雪儿');

67 MODULE_LICENSE('GPL');


三、错误解决:

 

1. error: 'struct device' has no member named 'bus_id'

在新版本的内核中device已经没有bus_id这个成语了,取而代之的是.init_name.

解决方法:

将device下面的 .bus_id 修改为 .init_name ,如图所示:

 

 

然后,再将程序中match函数中 dev->bus_id 修改为 dev_name(dev), 就可以了


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>