驱动框架7——使用gpiolib完成led驱动
生活随笔
收集整理的這篇文章主要介紹了
驱动框架7——使用gpiolib完成led驱动
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下內容源于朱有鵬《物聯網大講堂》課程的學習整理,如有侵權,請告知刪除。
十四、使用gpiolib完成led驅動
1、流程分析
(1)第1步:使用gpio_request申請要使用的一個GPIO;
(2)第2步:gpio_direction_input/gpio_direction_output 設置輸入/輸出模式;
(3)第3步:設置輸出值gpio_set_value ?獲取IO口值gpio_get_value。
2、代碼實踐
(1)在led1上編寫代碼測試通過;
(2)擴展支持led2和led3、led4,可以分開注冊,也可以使用gpio_request_array去一次注冊;
(3)學習linux中查看gpio使用情況的方法
- 內核中提供了虛擬文件系統debugfs,里面有一個gpio文件,提供了gpio的使用信息(諸如誰被使用了,誰沒有被使用)。
- 使用方法:mount -t debugfs debugfs /tmp,然后cat /tmp/gpio即可得到gpio的所有信息,使用完后umount /tmp卸載掉debugfs
(4)代碼(驅動申請LED1資源而已)
#include <linux/module.h> // module_init module_exit #include <linux/init.h> // __init __exit #include <linux/fs.h> #include <linux/leds.h> #include <mach/regs-gpio.h> #include <mach/gpio-bank.h> #include <linux/io.h> #include <linux/ioport.h> #include <mach/gpio.h>#define GPIO_LED1 S5PV210_GPJ0(3) #define GPIO_LED2 S5PV210_GPJ0(4) #define GPIO_LED3 S5PV210_GPJ0(5)#define X210_LED_OFF 1 // X210中LED是正極接電源,負極節GPIO #define X210_LED_ON 0 // 所以1是滅,0是亮static struct led_classdev mydev1; // 定義結構體變量 static struct led_classdev mydev2; // 定義結構體變量 static struct led_classdev mydev3; // 定義結構體變量// 這個函數就是要去完成具體的硬件讀寫任務的 static void s5pv210_led1_set(struct led_classdev *led_cdev,enum led_brightness value) {printk(KERN_INFO "s5pv210_led1_set\n");//writel(0x11111111, GPJ0CON);// 在這里根據用戶設置的值來操作硬件// 用戶設置的值就是valueif (value == LED_OFF){// 用戶給了個0,希望LED滅//writel(0x11111111, GPJ0CON);// 讀改寫三部曲//writel((readl(GPJ0DAT) | (1<<3)), GPJ0DAT);gpio_set_value(GPIO_LED1, X210_LED_OFF);}else{// 用戶給的是非0,希望LED亮//writel(0x11111111, GPJ0CON);//writel((readl(GPJ0DAT) & ~(1<<3)), GPJ0DAT);gpio_set_value(GPIO_LED1, X210_LED_ON);} }static void s5pv210_led2_set(struct led_classdev *led_cdev,enum led_brightness value) {printk(KERN_INFO "s5pv2102_led_set\n");//writel(0x11111111, GPJ0CON);// 在這里根據用戶設置的值來操作硬件// 用戶設置的值就是valueif (value == LED_OFF){// 用戶給了個0,希望LED滅//writel(0x11111111, GPJ0CON);// 讀改寫三部曲//writel((readl(GPJ0DAT) | (1<<4)), GPJ0DAT);}else{// 用戶給的是非0,希望LED亮//writel(0x11111111, GPJ0CON);//writel((readl(GPJ0DAT) & ~(1<<4)), GPJ0DAT);} }static void s5pv210_led3_set(struct led_classdev *led_cdev,enum led_brightness value) {printk(KERN_INFO "s5pv210_led3_set\n");//writel(0x11111111, GPJ0CON);// 在這里根據用戶設置的值來操作硬件// 用戶設置的值就是valueif (value == LED_OFF){// 用戶給了個0,希望LED滅//writel(0x11111111, GPJ0CON);// 讀改寫三部曲//writel((readl(GPJ0DAT) | (1<<5)), GPJ0DAT);}else{// 用戶給的是非0,希望LED亮//writel(0x11111111, GPJ0CON);//writel((readl(GPJ0DAT) & ~(1<<5)), GPJ0DAT);} }static int __init s5pv210_led_init(void) {// 用戶insmod安裝驅動模塊時會調用該函數// 該函數的主要任務就是去使用led驅動框架提供的設備注冊函數來注冊一個設備int ret = -1;// 在這里去申請驅動用到的各種資源,當前驅動中就是GPIO資源if (gpio_request(GPIO_LED1, "led1_gpj0.3")) //這里是申請失敗{printk(KERN_ERR "gpio_request failed\n");} else //申請成功后{// 設置為輸出模式,并且默認輸出1讓LED燈滅gpio_direction_output(GPIO_LED1, 1);}// led1mydev1.name = "led1";mydev1.brightness = 0; mydev1.brightness_set = s5pv210_led1_set;ret = led_classdev_register(NULL, &mydev1);if (ret < 0) {printk(KERN_ERR "led_classdev_register failed\n");return ret;}// led2mydev2.name = "led2";mydev2.brightness = 0; mydev2.brightness_set = s5pv210_led2_set;ret = led_classdev_register(NULL, &mydev2);if (ret < 0) {printk(KERN_ERR "led_classdev_register failed\n");return ret;}// led3mydev3.name = "led3";mydev3.brightness = 0; mydev3.brightness_set = s5pv210_led3_set;ret = led_classdev_register(NULL, &mydev3);if (ret < 0) {printk(KERN_ERR "led_classdev_register failed\n");return ret;}return 0; }static void __exit s5pv210_led_exit(void) {led_classdev_unregister(&mydev1);led_classdev_unregister(&mydev2);led_classdev_unregister(&mydev3);gpio_free(GPIO_LED1); }module_init(s5pv210_led_init); module_exit(s5pv210_led_exit);// MODULE_xxx這種宏作用是用來添加模塊描述信息 MODULE_LICENSE("GPL"); // 描述模塊的許可證 MODULE_AUTHOR("aston <1264671872@qq.com>"); // 描述模塊的作者 MODULE_DESCRIPTION("s5pv210 led driver"); // 描述模塊的介紹信息 MODULE_ALIAS("s5pv210_led"); // 描述模塊的別名信息總結
以上是生活随笔為你收集整理的驱动框架7——使用gpiolib完成led驱动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编写网游客户端
- 下一篇: 通过anaconda下载 opencv的