LED子系统和驱动简介_第1页
LED子系统和驱动简介_第2页
LED子系统和驱动简介_第3页
LED子系统和驱动简介_第4页
LED子系统和驱动简介_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第1* LED子糸统和題动简介本章导读LED是嵌入式系统中最常用,也是最简单的外设备之一。上一章介绍了实现LED字符设 备的多种方法。本章介绍如何通过LED子系统史方便地实现LED驰动,并实现更多更灵活的 功能。1-11 LED子系统驱动简介参考上册“EasyARM-i.MX283A入门实操”章节的“LED使用”小节,Lmux内核的 LED子系统为每个LED设备都在/sys/class/leds/目录提供了操作接I I。LED设备町以通过设 置不同的触发方式而具有不同的功能。通过LED子系统,程序员可以通过很简便的方法添加/删减LED设备。这些LED设备 在使用过程中,用户可以随意设置LED设

2、备的功能。1.12 LED子系统的分层结构LED子系统的町以分为三部分:触发器、LED设备和核心模块,如图1.1所示。图1/1 LED子系统的分层结构LED设备町设置的各种触发方式都是由LED子系统里各触发器实现的。触发器的代码 文件为vdnvers/ledsb目录下的ledtng-*.c,例如ledtng-heaitbeat.c文件是心跳触发器的代码 文件。这些触发器的代码文件的主要任务是初始化各自的触发器,然后注册到核心模块。LED子系统需要为每个LED硬件都实现-个LED设备。这些LED设备在/sys/class/leds/ 冃录下都有操作接II,并且可以设置自己的触发器。实现LED设备

3、的代码文件为 dnvers/leds/目录卜的leds-*.c.例如leds-mxs.c为1MX28系列处理器的LED设备驰动代 码。这些LED设备的实现代码文件的主要任务肚工成LED设备,然后注册到核心模块。核心模块的代码文件为dii-ers/leck led-class.c。核心模块的任务右: 维护LED子系统的所自触发器,为触发器的注册/注销提供操作函数; 维护LED子系统的所有LED设备,并为每个LED设备在/sys/class/leds/目录卜实 现操作接口;为LED设各的注册/注销提供操作函数.文库资料©2017 Guangzhou ZHIYUAN Electronics

4、 Stock Co., Ltd.文章源自广州致远电子有限公司,转载或引用请注明岀处1.关键的数据结构LED子系统的每个LED设备都是用led_classdev结构体描述。该结构体定义在 <linux/leds h>文件.如程序清单1.1所示。程序涪单led classdev结构体的定义struct led_cla$dev const char*name;intbrightness;mtinax_ voidflags:(*bnglitness_set)($truct led_classder *led_cdevw enum led_bnghtness b

5、rightness);enumledbnglitness (*bnghtness_getXstnict led_classde- *led_cdev).int(blmksetXstruct led_clasde,拿led_cdev. unsigned long *delay_on. unsigned long delay_off).stmct device*dev;stnict list_lieadnode;const char *default_trigger;struct nvsemaphore tngger_lock;tngjist:*trigger_data.stnict ledjng

6、ger * trigger;stnict list_head void;卜面介绍该结构体的部分成员:name该成员为LED设备的名字。当一个LED设备注册成功后,其名字将出现在 /sys/class/leds/ 目录下。biiglitness该成员表示LED、耳前的亮度。LED的亮度町取值如程序淸单1.2所示。程序淸单2 LED的亮度取值enum led_brightness LED_OFF= 0,严 LED 关闭拿/LED_HALF=127.广 LED 半亮拿/LED_FULL=255,广 LED 全亮/;max brightness该成员表示LED的Al高亮度值。brightness_se

7、t该成员是设置LED点亮/熄灭的方法。当LED设备的LED点亮/熄灭的 实现函数被调用时,会传入LED设备参数和需要设宜的亮度参数。在实现函数中,需要根 据这些参数把指定的LED设置到指定的亮度。defaultJrigger该成员表不LED设备在注册后.默认使用的触发益名字。文库资料©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.文章源自广州致远电子有限公司,转载或引用请注明岀处3幔入式ARM工控机善7广州致远电子有限公司当LED设备的led classdev结构体初始化完成后,就町以调用led_classdev_register

8、()前 数注册:mt led_classdev_register(stnict device *parent,struct led classdev,led_cdev):在该函数中,parent町取值为NULLo led classdev registerO Xl数调用成功后,将返冋0 值;否则返回非0值。调用led_classdev_iuiregisterO函数IJf以注销己经注册的LED设备:void led_classde _unregister(struct led_classdev *led_cdev):2. LED设备实现示例这里以EasyARNl-i.NIX283A开发套件的ER

9、R LED为例,说明如何在LED子系统实现 一个LED设备。该实现示例程序文件为leds-test.co在leds-test.c模块文件中,需要为ERR LED实现一个LED设备,如程序清单1.3所示。程序淆单1.3为ERR LED实现LED设备代码struct led_cla$dev led_de- = name = Mled-examplewt/* 设佑名称为 ledexample*/bnghtness_set = nixs_led_bnghtness_set,_default_tngger = ,none,/* 默认使用 none 触发器*/;ERR LED的点亮/熄灭的实现函数为mxs

10、ed_bnghmess_set(),如程序清单L4所示。当 该函数被调用时,根据传入的亮度参数直接设置到ERR LED即可。程序清单1 4mxsed_bughtness_set()函数的实现#define LED_GPIO MXS_PIN_TO_GPIO(PINID_LCD_D23)/ ERR LED 的 GPIO/static void mxsed_bnghtness_set(stnict led_classdev "pled.enun】 led_bnghtness value)gpio_direction_output(LED_GPIO. lvalue);)在模块的初始化函数中,

11、需要为ERR LED注册LED设备和巾请GPIO,其实现函数为 led_init()o该函数的实现代码如程序清单1.5所示。程序清单1.5ledmt()函数的实现代码static int _init led_imi(void)int ret = 0;ret = led_dassdev_regisier(NULL &led_dev);户 注册 LED 设备拿/if (ret) pnntk(Mregister led device faile n°);rernm -1; gpio_request(LhD_GPIO.Ted”);/* 申请 GPIOT文库资料©2017 G

12、uangzhou ZHIYUAN Electronics Stock Co., Ltd.文童源自广州致远电子有限公司,转载或引用请注明岀处#嵌入式ARM工控机module_imt(led_init);在模块的移除函数中,需要为ERR LED注销LED S备和释放GPIO,其实现函数为 led_ext()°该函数的实现代码为程序清单1.6所示。程序淸单1.6 led_exit()毬数的实现static void _exit led_exit(void)*注销LED设备 */ /* 释放 GPIO*/led_classdex_i.mregister (&led_dev); gpi

13、oj&ee(LED_GPIO);module_exit(led_exit);把leds-test.c模块编译成leds-test ko模块文件,并卜载到EasyARM 1.MX283A开发套件 中。输入下面命令加载模块:# msmod leds-test ko加载完成后.在/sys/class/leds/B录下生成新的led-example 0录,如图1.2所示。roottEasyARM-iMX28x Is /sys/class/leds/ beeplederrled-example led-run图1.2新添加的LED目录至于LED子系统的设备接【I的操作方法,请参考前面的"

14、;EasyARMMX283A入门实 操”章节的“LED使用”小节中,这里不再多述。1.1.4 i.MX28平台的LED设备实际上相当一部分的处理器平台在vdnvers/led>目录下提供了自己的LED设备模块代 码文件,并不需要程序员编写,仅需要程序员提供LED®件信息即4o<diivers/leds/leds-inxs.c> 文件足为1.NIX28处埋器实现LED设备的模块文件。在leds-mxs.c文件实现了一个名字为“mxs-leds"的平台驱动(platfoiui dnver对象,)。 若系统中注册了名字也为“mxsleds”的平台设备(platf

15、onn_deivce的对象),将被这个平台 驰动探测到。该平台驱动将在新注册的平台设备的私有数据中,获取所有LED设备信息, 然后根据每个LED设备信息都生成一个led_classdev对象并注册。内核源码为1NIX28系列处理器定义了 mxs_led结构体用于描述LED设备信息,其定义 如程序清单1.7所示。程序清单1.7 mxs_led结构体的定义 struct nixs_led struct led_classdex dev:const char *name.char adefault_tngger;unsigned mdex;文库资料©2017 Guangzhou ZHIYU

16、AN Electronics Stock Co., Ltd.文章源自广州致远电子有限公司,转载或引用请注明出处4广州致远电子有限公司嵌入式ARM工控机mt (aled_set) (unsigned pimd. int value);下面介绍mxs_led结构体的部分成员:name该成员表示LED设备的名字。default_trigger该成员表示LED设备默认设置的触发器字符串。index该成员表示LED设备的索引值。 led_set该成员是实现LED点亮/熄灭的函数的指针。内核源码定义了 mxs_leds_plat_data结构体用于描述nixs_led数组的信息,其定义如程 序清单1.8所

17、示。一 一程序清单1.8 mxs_leds_plat_data结构体的定义stnict mxs_led$_plat_data unsigned int num;stnict mxs_led *leds;在inxs_leds_plat_data结构体中,leds成员指向mxs led类型的数组;mini为数组的长 度。在内核源码的varch/ann inach-mx2 8/mx28e-k.c文件中,定义了 mx28evk_led数组用于 描述系统所有的LED信息设备信息,如程序清单1.9所示。一程序清单1.9mx28evkjed数组的实现代码static struct mxs_led mx28e

18、vk_led = 0 = name = "ledmT,.defaultjngger = MheartbeatM,.index = 0.led set 一 mxs led set,MB,1 = name = *,led-errH.index = 1,led_set = mxs_led_set.,;在 mx28e-k_led 数组中,描述 了 EasyARM-1.MX283A 开发套件上 ERR LED 和 RUN LED 的设备信息。这两个LED的控制函数都是mxs_led_setO»该函数实现在varch/arm/mach-28/ mx28evk_pms.c文件,其代码可参

19、考程序清单1.10所示。/控制 RUN LED 的 GPIO */ /扌空制 ERR LED 的 GPIO /程序清单1.10 mxsed_set()的函数参考代码static unsigned mxs_leds= PINID_LCD_D22, PINID_LCD_D23.文库资料©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.文章源自广州致远电子有限公司,转载或引用请注明岀处mt nixs_led_set(iinsigned index, int -alue)gpio_direction_output(MXS_PIN_TO_GP

20、IO(mxs_ledsindex), !mlue):renirn 0;当mxs_led_set()函数被调用时,传入参数index为LED设备的索引值;value为LED的 控制值,其皿石如程序清单L2所示。在 mx28evk_puis.c 源码文件中,还需要使用 mxs_leds_plat_data 类型的 mx28evk_led_data 变量维护mx28evk_led数组的信息,如程序清单L1I所示。_程序淸单1.11mx28evk_led_data的实现代码stmct inx$_leds_pht_data mx28e*k_led_data = num = ARRAY_SIZE(mx28evk_led),leds = mx2Sevk_led,;在 mx28evk_pi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论