驱动学习8--gpiolib的使用

驱动

#include <linux/module.h>       // module_init  module_exit
#include <linux/init.h>         // __init   __exit
#include <linux/fs.h>
#include <linux/leds.h>         //struct led_classdev
#include <mach/regs-gpio.h>     //gpio virtual address
#include <mach/gpio-bank.h>     //gpio virtual address
#include <linux/io.h>
#include <linux/ioport.h>
#include <mach/gpio.h>          //S5PV210_GPxx(x)

#define GPIO_LED1   S5PV210_GPJ0(3)
#define GPIO_LED2   S5PV210_GPJ0(4)
#define GPIO_LED3   S5PV210_GPJ0(5)

static struct led_classdev led_cdev1;           // 定义结构体变量
static struct led_classdev led_cdev2;           // 定义结构体变量
static struct led_classdev led_cdev3;           // 定义结构体变量

static void s5pv210_led_set1(struct led_classdev *led_cdev,enum led_brightness value)
{
    if(value == LED_OFF)
        gpio_set_value(GPIO_LED1,1);
    else
        gpio_set_value(GPIO_LED1,0);
    printk(KERN_INFO "value = %d\n",value);
}

static void s5pv210_led_set2(struct led_classdev *led_cdev,enum led_brightness value)
{
    if(value == LED_OFF)
        gpio_set_value(GPIO_LED2,1);
    else
        gpio_set_value(GPIO_LED2,0);
    printk(KERN_INFO "value = %d\n",value);
}

static void s5pv210_led_set3(struct led_classdev *led_cdev,enum led_brightness value)
{
    if(value == LED_OFF)
        gpio_set_value(GPIO_LED3,1);
    else
        gpio_set_value(GPIO_LED3,0);
    printk(KERN_INFO "value = %d\n",value);
}


static int __init s5pv210_led_init(void)
{
    int ret = -1;

    ret = gpio_request(GPIO_LED1, "GPJ0");
    if(ret)
        printk("gpio_request1 fail\n");
    gpio_direction_output(GPIO_LED1, 1);

    ret = gpio_request(GPIO_LED2, "GPJ0");
    if(ret)
        printk("gpio_request2 fail\n");
    gpio_direction_output(GPIO_LED2, 1);

    ret = gpio_request(GPIO_LED3, "GPJ0");
    if(ret)
        printk("gpio_request3 fail\n");
    gpio_direction_output(GPIO_LED3, 1);


    led_cdev1.name = "led1";
    led_cdev1.max_brightness = 1000;/*设置最大亮度*/
    led_cdev1.brightness = 0;/*设置亮度初始值 */
    led_cdev1.brightness_set = s5pv210_led_set1;/*具体操控硬件*/
    ret = led_classdev_register(NULL, &led_cdev1);
    if (ret < 0) 
    {
        printk(KERN_ERR "led_classdev_register failed\n");
        return ret;
    }

    led_cdev2.name = "led2";
    led_cdev2.max_brightness = 1000;/*设置最大亮度*/
    led_cdev2.brightness = 0;/*设置亮度初始值 */
    led_cdev2.brightness_set = s5pv210_led_set2;/*具体操控硬件*/
    ret = led_classdev_register(NULL, &led_cdev2);
    if (ret < 0) 
    {
        printk(KERN_ERR "led_classdev_register failed\n");
        return ret;
    }

    led_cdev3.name = "led3";
    led_cdev3.max_brightness = 1000;/*设置最大亮度*/
    led_cdev3.brightness = 0;/*设置亮度初始值 */
    led_cdev3.brightness_set = s5pv210_led_set3;/*具体操控硬件*/
    ret = led_classdev_register(NULL, &led_cdev3);
    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(&led_cdev1);
    led_classdev_unregister(&led_cdev2);
    led_classdev_unregister(&led_cdev3);

    gpio_free(GPIO_LED1);
    gpio_free(GPIO_LED2);
    gpio_free(GPIO_LED3);
}

module_init(s5pv210_led_init);
module_exit(s5pv210_led_exit);


MODULE_LICENSE("GPL");/*描述模块的许可证*/
MODULE_AUTHOR("Xin-Ya Zhu<mhzhuxinya@outlook.com>");/*描述模块的作者*/
MODULE_DESCRIPTION("s5pv210 led driver");/*描述模块的介绍信息*/  
MODULE_ALIAS("s5pv210_leds");/*描述模块的别名信息*/

应用

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <sys/types.h>  //open close
#include <sys/stat.h>
#include <fcntl.h>


#define FILE "/sys/class/leds/led1/brightness"
#define LED_ON  "1"
#define LED_OFF "0"

int main(void)
{
    int fd = -1;
    char buf[100] = {0};

    fd = open(FILE,O_RDWR);
    if(fd<0)
    {
        printf("open error.\n");
        return -1;
    }

    write(fd,LED_ON,strlen(LED_ON));
    sleep(1);
    write(fd,LED_OFF,strlen(LED_OFF));
    sleep(1);
    write(fd,LED_ON,strlen(LED_ON));
    sleep(1);
    write(fd,LED_OFF,strlen(LED_OFF));
    sleep(1);

    close(fd);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值