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

发布时间:2024-08-15  

一、程序分析

1. 包含总线

既然我们的设备在总线上,自然我们既要包含总线了

如图所示,使用外部声明将我们的总线的结构体包含进来

2. 定义设备结构体

父目录为 my_bus

 

3. 定义属性文件结构体

属性文件结构体可以有一下得到:

//产生后面的 bus_attr_version 结构体

static DEVICE_ATTR(dev,S_IRUGO,mydev_show,NULL);

如图所示:

 

4. 在初始化函数中

如图所示:

在初始化函数中,

先初始化设备的名字,这个名字用于于驱动名字进行匹配

然后注册设备,让系统认识这个设备,在/sys/device/my_bus0 下面就会有my_dev这个设备

最后创建属性文件,这个就是在my_dev下面的 dev文件,可以使用cat dev 进行读取,用于传递字符串。

5. 在exit函数中

如图所示就是 移除属性文件,注销设备

 

 

二、编译测试

 

可以发现,在我们的/sys/bus/目录下生成了 my_bus 目录

然后,在 my_bus/devices/ 目录下又生成了 my_dev 目录

 

查看my_dev的属性文件 cat dev

我们使用cat drivers_autoprobe 命令,为1,意思就是我们驱动会自动探测设备

移除驱动时最好注意顺序

 

至此,总线-设备-驱动 模型中,我们已经完成其二了,最后的一个驱动篇,加油!

我们的目标是在总线中加入驱动程序,并且驱动程序和设备程序会自动互相探测寻找,然后在match中检测关联。


附上 mybus .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');


附上 mydev .c 设备驱动程序


 1 #include

 2 #include

 3 #include

 4 #include

 5 #include

 6 

 7 //包含总线

 8 extern struct device my_bus;

 9 extern struct bus_type my_bus_type;

10 

11 static void my_dev_release(struct device *dev){

12     printk('

13 }

14   

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

16 struct device my_dev = {

17     .bus = &my_bus_type,

18     .parent = &my_bus,        //父目录为my_bus

19     .release = my_dev_release,

20 };

21 

22 ssize_t mydev_show(struct device *dev,struct device_attribute *attr,char *buf){

23     return sprintf(buf, '%sn', 'This is my device');

24 }

25 

26 //产生后面的 dev_attr_dev 结构体

27 static DEVICE_ATTR(dev,S_IRUGO,mydev_show,NULL);

28 

29 static int __init my_dev_init(void){

30     int ret = 0;

31 

32     /* 初始化设备 以后看驱动与设备是否匹配就看这个名字 */

33       dev_set_name(&my_dev,'my_dev');

34 

35     /* 注册设备 */

36     ret = device_register(&my_dev);

37     if(ret)

38         printk('

39     /* 创建属性文件 */

40     if(device_create_file(&my_dev, &dev_attr_dev))

41         printk('

42 

43     return ret;

44 }

45 

46 static void my_dev_exit(void){

47     device_remove_file(&my_dev, &dev_attr_dev);

48     device_unregister(&my_dev);

49 }

50 

51 module_init(my_dev_init);

52 module_exit(my_dev_exit);

53 

54 

55 MODULE_AUTHOR('Lover雪儿');

56 MODULE_LICENSE('GPL');


附上 MAKEFILE程序


 1 ifeq ($(KERNELRELEASE),)

 2     KERNELDIR ?= /home/study/system/linux-2.6.31

 3     PWD := $(shell pwd)

 4 modules:

 5     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

 6 modules_install:

 7     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

 8 clean:

 9     rm -rf *.o *~ core .depend  *.cmd *.ko *.mod.c .tmp_versions *.markers *.order *.symvers

10 

11 else

12     obj-m := mybus.o mydev.o

13 endif


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

相关文章

    力矩电机怎么控制转速和力矩_力矩电机和伺服电机区别;  力矩电机怎么控制转速和力矩   控制力矩电机的转速和力矩通常需要使用一些控制方法,下面介绍几种常见的控制方法:   变频控制:使用变频器对电机......
    伺服电机怎么测量好坏_伺服电机选型计算实例;  伺服电机怎么测量好坏   测量伺服电机好坏的方法主要有以下几种:   静态测试:静态测试通常使用负载测量仪或者力矩传感器,测量电机......
    伺服电机的型号是怎么划分的_伺服电机型号的含义;  伺服电机怎么看型号   伺服电机的型号通常由一串字母和数字组成,不同厂家的型号表现形式有所不同。以下是一些常见的伺服电机型号表示方法:   型号中含有电机......
    ,而不是用于交流伺服电机。   脉冲怎么控制交流伺服电机?   交流伺服电机可以通过PWM脉冲控制器来控制。PWM是脉冲宽度调制的缩写,可以通过改变信号的脉冲宽度来控制电机的速度和方向。具体......
    PLC怎么控制伺服电机;在回答这个问题之前,首先要清楚伺服电机的用途,相对于普通的电机来说,伺服电机主要用于精确定位,因此大家通常所说的控制伺服,其实就是对伺服电机的位置控制。其实,伺服电机......
    PLC是怎么控制伺服电机的?;在回答这个问题之前,首先要清楚伺服电机的用途,相对于普通的电机来说,伺服电机主要用于精确定位,因此大家通常所说的控制伺服,其实就是对伺服电机的位置控制。其实,伺服电机......
    伺服电机抖动怎么办?伺服电机快速有抖动什么原因引起的;伺服电机抖动,怎么办? 伺服电机为珠海运控的,当上方连杆没装上时,一切看起来正常;一旦连杆装上以后,电机就自己左右摇摆,参数设置半天也没整好。注......
    伺服系统震动怎么解决?(经典问答之二);十一、伺服电机抖动,怎么办? 伺服电机为珠海运控的,当上方连杆没装上时,一切看起来正常;一旦连杆装上以后,电机就自己左右摇摆,参数设置半天也没整好。注:未接......
    步进电机怎么接线_步进电机正反转接线图;  步进电机四根线怎么接   随着步进电机的应用越来越广泛,生产的厂家也随之多了起来,一些小品牌出的步进电机,也没有一些说明书,图纸这些,从而导致了,一部......
    伺服电机和步进电机哪个精度高外观怎么区分;  伺服电机和步进电机哪个精度高   伺服电机和步进电机都可以达到高精度的要求,但是伺服电机通常比步进电机具有更高的精度。这是因为伺服电机......

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

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

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

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

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

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

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