gpiolib库
1:什么是gpiolib,為什么要有g(shù)piolib?
linux中從2.6.35以后就開始有g(shù)piolib庫了,gpiolib的作用是對所有的gpio實(shí)行統(tǒng)一管理,因?yàn)轵?qū)動在工作的時(shí)候,會出現(xiàn)好幾個(gè)驅(qū)動共同使用同一個(gè)gpio的情況;
這會造成混亂。所以內(nèi)核提供了一些方法來管理gpio資源;
2:如何學(xué)習(xí)gpiolib
第一:gpiolib庫的建立;
第二:gpiolib庫的使用方法:申請、使用、釋放;
3:下面看一下常用的接口
gpio_request:驅(qū)動中要想使用某一個(gè)gpio,就必須先調(diào)用gpio_request接口來向內(nèi)核申請,得到允許后才可以去使用這個(gè)gpio
gpio_free: 對應(yīng)gpio_request,用來釋放申請后用完了的gpio
gpiochip_is_requested: 接口用來判斷某一個(gè)gpio是否已經(jīng)被申請了
gpio_direction_input/gpio_direction_output: 接口用來設(shè)置GPIO為輸入/輸出模式(不推薦直接設(shè)置寄存器)
gpio_get_value:接口用來獲取gpio當(dāng)前狀態(tài)
gpio_set_value:接口用來設(shè)置gpio當(dāng)前狀態(tài)
?
4:下面是gpiolib應(yīng)用的完整代碼
#include <linux/module.h> #include <linux/init.h> #include <linux/leds.h> #include <mach/gpio.h>#define GPIO_LED S5PV210_GPJ0(3)static struct led_classdev mydev;static void s5pv210_led_set(struct led_classdev *led_cdev, enum led_brightness value) {printk(KERN_INFO "s5pv210_led_set\n");/* 設(shè)置gpio狀態(tài) */if (value == LED_OFF)gpio_set_value(GPIO_LED, 1);elsegpio_set_value(GPIO_LED, 0); }static int __init s5pv210_led_init(void) {int ret = -1;/* 申請gpio資源 */if (gpio_request(GPIO_LED, "led_gpj0.3")){printk(KERN_ERR "gpio_request failed\n");return -EINVAL;}/* 設(shè)置gpio方向?yàn)檩敵?*/gpio_direction_output(GPIO_LED, 1);mydev.name = "led";mydev.brightness = 0; mydev.brightness_set = s5pv210_led_set;/* 注冊led設(shè)備 */ret = led_classdev_register(NULL, &mydev);if (ret < 0) {printk(KERN_ERR "led_classdev_register failed\n");return ret;}return 0; }static void __exit s5pv210_led_exit(void) {/* 注銷led設(shè)備 */led_classdev_unregister(&mydev);/* 釋放gpio資源 */gpio_free(GPIO_LED); }module_init(s5pv210_led_init); module_exit(s5pv210_led_exit);// MODULE_xxx這種宏作用是用來添加模塊描述信息 MODULE_LICENSE("GPL"); // 描述模塊的許可證 MODULE_AUTHOR("lsm"); // 描述模塊的作者 MODULE_DESCRIPTION("s5pv210 led driver"); // 描述模塊的介紹信息 MODULE_ALIAS("s5pv210_led"); // 描述模塊的別名信息?
5:查看led設(shè)備
安裝好led驅(qū)動之后,進(jìn)入/sys/class/leds/led
總結(jié)
- 上一篇: 收藏 | 来自微软大神的机器学习秘籍!
- 下一篇: 不敢相信!美国预测10年后的世界!