【IT专家】RK3066 实现LED闪烁的代码分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

254 for (i = i - 1; i i--)
255 delete_gpio_led( priv- leds[i]);
256 kfree(priv);
257 return ret;
258 }
259 }
260 } else {
261 priv = gpio_leds_create_of(pdev);
111 */
112 led_dat- = template- name;
本文由我司收集整编,推荐下载,如有疑问,请与我司联系
113 led_dat- cdev.default_trigger = template- default_trigger; 114 led_dat- gpio = template- gpio; 115 led_dat- can_sleep = gpio_cansleep(template- gpio); 116 led_dat- active_low = template- active_low; 117 led_dat- blinking = 0; 118 if (blink_set) { 119 led_dat- platform_gpio_blink_set = blink_set; lse 126 state = (template- default_state == LEDS_GPIO_DEFSTATE_ON); 127 led_dat- cdev.brightness = state ? LED_FULL : LED_OFF; 128 if (!template- retain_state_suspended) 129 led_dat- cdev.flags |= LED_CORE_SUSPENDRESUME; 130 131 re9 goto err; 140 141 return 0; 142 err: 143 gpio_free(led_dat- gpio); 144 return ret; 145 } 247 /** 248 * led_classdev_register - register a new object of led_classdev class. 249 * @parent: The device to register. 250 * @led_cdev: the led_classdev structure for this device. 251 */ 252 int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
本文由我司收集整编,推荐下载,如有疑问,请与我司联系
RK3066 实现 LED 闪烁的代码分析
实现 LED 灯的闪烁,需要在驱动里添加一个定时器函数,具体实现涉及到了 LED GPIO 驱动,用户空间程序调用驱动程序。 1.首先来看 LED 设备驱动注册过程,代码位于../kernel/drivers/leds/led-gpio.c 中, 297 static int __init gpio_led_init(void) 298 { 299 return platform_driver_register( gpio_led_driver); 300 } 285 static struct platform_driver gpio_led_driver = { 286 .probe = gpio_led_probe, 287 .remove = __devexit_p(gpio_led_remove), 288 .driver = { 289 .name = “leds-gpio”, //与 platform_device 结构体 rk29_device_gpio_leds(见后 面的添加过程)中定义的.name 一致,platform 总线通过 name 将两者关联; 290 .owner = THIS_MODULE, 291 .of_match_table = of_gpio_leds_match, 292 }, 293 }; driver 中的 probe 函数,其中 pdev 对应于 ../kernel/arch/arm/mach-rk30/boardrk30sdk-box.c 中定义的 platform_device 结构体 rk29_device_gpio_leds,其中.name = “leds-gpio” 235 static int __devinit gpio_led_probe(struct platform_device *pdev) 236 { 237 struct gpio_led_platform_data *pdata = pdev- dev.platform_data; 238 struct gpio_leds_priv *priv;
262 if (!priv)
263 return -ENODEV;
264 }
本文由我司收集整编,推荐下载,如有疑问,请与我司联系

265
266 platform_set_drvdata(pdev, priv);
267
268 return 0;
269 }
93 static int __devinit create_gpio_led(const struct gpio_led *template,
244 if (!priv)
245 return -ENOMEM;
246
247 priv- num_leds = pdata- num_leds;
248 for (i = 0; i priv- num_leds; i++) {
249 ret = create_gpio_led( pdata- leds[i],
250 priv- leds[i],
251 pdev- dev, pdata- gpio_blink_set); //创建具体的设备,对应结构体 rk29_leds 中
的 LED1,LED2,HDMI-sw
252 if (ret 0) {
253 /* On failure: unwind the led creations */
239 int i, ret = 0;
本文由我司收集整编,推荐下载,如有疑问,请与我司联系
240
241 if (pdata pdata- num_leds) {
242 priv = kzalloc(sizeof_gpio_leds_priv(pdata- num_leds),
243 GFP_KERNEL);
98
99 led_dat- gpio = -1;
100
101 /* skip leds that aren’t available */
102 if (!gpio_is_valid(template- gpio)) {
103 printk(KERN_INFO “Skipping unavailable LED gpio %d (%s)\n”,
104 template- gpio, template- name);
105 return 0;
106 }
107 /*
108 ret = gpio_request(template- gpio, template- name);
109 if (ret 0)
110 return ret;
94 struct gpio_led_data *led_dat, struct device *parent,
95 int (*blink_set)(unsigned, int, unsigned long *, unsigned long *))
96 {
97 int ret, state;
相关文档
最新文档