流程分析
1、第一步:使用gpio_request申请要使用的一个GPIO、
#define X210_LED_OFF 1 // X210中LED是正极接电源,负极节GPIO
#define X210_LED_ON 0 // 所以1是灭,0是亮
#define GPIO_LED1 S5P6442_GPJ0(1)
if(gpio_request(GPIO_LED1,“led1_gpj0_3”))
{
printk(KERN_ERR “gpio_request failed\n”); ///request失败
}
else
{
//设置输出模式 输出1为灭
gpio_direction_output(GPIO_LED1,1); //返回0 request 成功
}
2、第二步:gpio_direction_input/gpio_direction_output设置输入/输出模式
3、第三步:设置输出值,使用__gpio_set_value,获取IO值gpio_get_value
static void s5pv210_led1_set(struct led_classdev *led_cdev, enum led_brightness value)
{
printk(KERN_INFO “s5pv210_led1_set\n”);
// 在这里根据用户设置的值来操作硬件
// 用户设置的值就是value
if (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 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);
}
// led1
mydev1.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;
}
return 0;
}
static void __exit s5pv210_led_exit(void)
{
led_classdev_unregister(&mydev1);
gpio_free(GPIO_LED1);
}
module_init(s5pv210_led_init);
module_exit(s5pv210_led_exit);
最后,通过mount -t debugfs /tmp挂载调试设备,然后cat /tmp/gpio即可得到gpio的所有信息,使用完后umount /tmp 卸载掉debugfs