Linux下GPIO驱动(一) ----一个简单的LED驱动

发布者:EtherealGlow最新更新时间:2025-01-07 来源: cnblogs关键字:Linux  GPIO驱动  ED驱动 手机看文章 扫描二维码
随时随地手机看文章

/*******************************

 *

 *杂项设备驱动:miscdevice

 *majior=10;

 *

 * *****************************/



#include <linux/kernel.h>

#include

#include

#include

#include


//#include

//#include //kcalloc,kzalloc等内存分配函数


//---------ioctl------------

#include


//---------misc_register----

#include


//----------cdev--------------

#include


//----------delay-------------

#include


//----------GPIO---------------

#include gpio.h>

#include

#include



#define DEVICE_NAME 'leds'


static int led_gpios[] = {

    S5PV210_MP04(4),

    S5PV210_MP04(5),

    S5PV210_MP04(6),

    S5PV210_MP04(7),

};//4个LED


#define LED_NUM        ARRAY_SIZE(led_gpios)



static long fl210_leds_ioctl(struct file *filp, unsigned int cmd,

        unsigned long arg)

{

    switch(cmd) {

        case 0:

        case 1:

            if (arg > LED_NUM) {

                return -EINVAL;

            }


            gpio_set_value(led_gpios[arg], !cmd);//根据cmd设置LED的暗灭

            printk(DEVICE_NAME': %ld %dn', arg, cmd);

            break;


        default:

            return -EINVAL;

    }


    return 0;

}


static struct file_operations fl210_led_dev_fops = {

    .owner            = THIS_MODULE,

    .unlocked_ioctl    = fl210_leds_ioctl,

};


//----------------miscdevice------------------

static struct miscdevice fl210_led_dev = {

    .minor            = MISC_DYNAMIC_MINOR,

    .name            = DEVICE_NAME,

    .fops            = &fl210_led_dev_fops,

};

//--------------------------------------------



static int __init fl210_led_dev_init(void) {

    int ret;

    int i;


    for (i = 0; i < LED_NUM; i++) {

        ret = gpio_request(led_gpios[i], 'LED');//申请GPIO口

        if (ret) {

            printk('%s: request GPIO %d for LED failed, ret = %dn', DEVICE_NAME,

                    led_gpios[i], ret);

            return ret;

        }


        s3c_gpio_cfgpin(led_gpios[i], S3C_GPIO_OUTPUT);//设置GPIO口为输出

        gpio_set_value(led_gpios[i], 1);//初始化GPIO口的值

    }


    ret = misc_register(&fl210_led_dev);//注册杂项设备


    printk(DEVICE_NAME'tinitializedn');

    printk('led num is: %dn',LED_NUM);

    return ret;

}


static void __exit fl210_led_dev_exit(void) {

    int i;


    for (i = 0; i < LED_NUM; i++) {

        gpio_free(led_gpios[i]);//释放GPIO口

    }


    misc_deregister(&fl210_led_dev);//注销设备

}


module_init(fl210_led_dev_init);

module_exit(fl210_led_dev_exit);


MODULE_LICENSE('GPL');

MODULE_AUTHOR('');


S5PV210_MP04宏定义在linux/arch/arm/mach-s5pv210/include/mach/gpio.h


#define S5PV210_MP04(_nr) (S5PV210_GPIO_MP04_START + (_nr))


S5PV210_GPIO_MP04_START = S5PV210_GPIO_NEXT(S5PV210_GPIO_MP03),


#define S5PV210_GPIO_NEXT(__gpio) ((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1)


//这里的CONFIG_S3C_GPIO_SPAC是内核配置选项,在.config中可以找到,我的配置为:   CONFIG_S3C_GPIO_SPACE = 0


上述代码用到以下几个函数:


gpio_set_value();


s3c_gpio_cfgpin();


gpio_request();


gpio_free();


misc_register();


misc_deregister();


后面会逐个分析。


测试程序如下:


#include

//#include 'sys/types.h'

#include

#include

#include //read,write等等

//#include 'termios.h'

//#include 'sys/stat.h'

#include


#define LED2_ON 0x1

#define LED2_OFF 0x0


main(int argc,char *argv[])

{

    int fd;


    if ((fd=open('/dev/leds',O_RDWR /*| O_NDELAY | O_NOCTTY*/)) < 0)

    {

        printf('Open Device  failed.rn');

        exit(1);

    }

    else

    {

        printf('Open Device  successed.rn');

    }

    if (argc<3)

    {

        /* code */

        printf('Usage: %s n',argv[0]);

        exit(1);

    }

    if(!strcmp(argv[1],'on'))

    {

        printf('led1 will on!!n');

       if(ioctl(fd,LED2_ON,atoi(argv[2]))<0)

       {

           printf('ioctl err!!n');     

       }

    

    }

    if(!strcmp(argv[1],'off'))

    {

        printf('led1 will off!!n');

        if(ioctl(fd,LED2_OFF,atoi(argv[2]))<0)

        {

            printf('ioctl err!!n');

        }

    }

    close(fd);

}


关键字:Linux  GPIO驱动  ED驱动 引用地址:Linux下GPIO驱动(一) ----一个简单的LED驱动

上一篇:如何将驱动加入内核
下一篇:linux驱动(七)gpiolib库详解

推荐阅读最新更新时间:2026-03-21 10:56

LinuxGPIO驱动(一) ----一个简单的LED驱动
/******************************* * *杂项设备驱动:miscdevice *majior=10; * * *****************************/ #include linux/kernel.h #include linux/module.h #include linux/fs.h #include linux/types.h #include linux/init.h //#include linux/moduleparam.h //#include linux/slab.h //kcalloc,kzalloc等内存分配函数 //------
[单片机]
IMX257实现GPIO-查询按键驱动程序
前面我们介绍了简单的通用字符设备驱动程序,接下来,我们在它的基础上来实现GPIO的查询按键功能。 先附上驱动程序代码 1 /****************************** 2 linux key_query 3 *****************************/ 4 #include linux/module.h 5 #include linux/init.h 6 #include linux/kernel.h 7 #include linux/delay.h 8 #include linux/types.h 9 #include linux/ioctl.h 10 #
[单片机]
IMX257实现<font color='red'>GPIO</font>-查询按键<font color='red'>驱动</font>程序
IMX257实现GPIO-IRQ中断按键驱动程序
昨天我们已经实现了中断查询的方式实现GPIO按键驱动程序,但是,有一个缺点就是,当我们把应用程序放在后台执行时,即便没有按键,应用程序while循环中的read函数也不断的在运行,严重的导致了CPU资源的浪费。 本文中,我们在前面按键查询驱动程序的基础上来修改。 大概介绍一下设计思路吧: 和前面的差不多,当我们加载驱动时,首先在init函数中,对GPIO功能进行模式设置,都设置为GPIO模式,然后申请GPIO引脚的内存, 接着,当我们应用程序使用ioctl函数的gpio_input命令时,将所有的GPIO引脚设置为输入,并且22K上拉模式,当应用程序使用read函数读取时,如果按键没有按下,则会在r
[单片机]
IMX257实现<font color='red'>GPIO</font>-IRQ中断按键<font color='red'>驱动</font>程序
【改进】IMX257实现GPIO-IRQ中断按键获取键值驱动程序
一、使用struct pin_desc 管理按键的值 1.定义结构体 2.将前面我们申请中断时写的(void *)1修改为 &pins_desc 在ioctl中,设置中断中修改 在key_release中释放中修改 3.在中断程序中利用我们定义的struc pins_desc判断并得到按键的值 4.得到按键键值后,唤醒程序,在read函数中返回键值 附上驱动源程序: 1 /****************************** 2 linux key_query 3 *****************************/ 4 #include linux/module.h 5
[单片机]
【改进】IMX257实现<font color='red'>GPIO</font>-IRQ中断按键获取键值<font color='red'>驱动</font>程序
S3c2440裸机-spi编程-3.gpio模拟spi驱动OLED
操作OLED,通过三条线(SCK、DO、CS)与OLED相连,这里没有DI是因为2440只会向OLED传数据而不用接收数据。 gpio_spi.c来实现gpio模拟spi,负责spi通讯。对于OLED,有专门的指令和数据格式,要传输的数据内容,在oled.c这一层来实现,负责组织数据。 因此,我们需要实现以上两个文件。 1.SPI初始化 新建一个gpio_spi.c文件,实现SPI初始化SPIInt() 1.1 GPIO init(pinmux管脚等配置) 上图J3为板子pin2pin到OLED的底座。 GPF1作为OLED片选引脚,设置为输出; GPG4作为OLED的数据(Data)/命令(Command)选择引脚,设置
[单片机]
S3c2440裸机-spi编程-3.<font color='red'>gpio</font>模拟spi<font color='red'>驱动</font>OLED
迅为iTOP-4418/6818开发板-驱动-实现GPIO扩展
实现 GPIO 扩展,先弄清楚“复用”的概念,将调用这些 GPIO 的驱动去掉配置,重新编 译,加到自己的驱动中,就可以实现扩展的 GPIO 的输入和输出。 另外必须要先看文档“迅为iTOP-4418开发板和6818开发板-驱动-GPIO 输入输出和例程_V1.X”。 1 GPIO 扩展的内核配置 在底板上,引出的扩展口有 J6(camera 口),J38(GPIO/CAN/485),另外如果自己做 底板,假如不使用 WIFI 等模块,还可以将 WIFI 等模块的 IO 口扩展成 GPIO。 这里只介绍 J6 和 J38 上的方便扩展的 IO 口。 如下图所示,是摄像头接口。这里带有“SDA”,“SCL”字样的两个引脚为总
[单片机]
迅为iTOP-4418/6818开发板-<font color='red'>驱动</font>-实现<font color='red'>GPIO</font>扩展
STM8单片机GPIO口的驱动深度解析
上一节给大家介绍了STM8标准库的移植,本节课开始学习我们单片机的外设的驱动,单片机基本的外设资料包括GPIO、外部中断、定时器、串口等,本节先给大家介绍一下STM8单片机的GPIO口。 我们先不介绍STM8单片机GPIO口的内部资源,我们先从程序代码着手,再根据代码进一步分析GPIO对应的寄存器,这样才能更容易去理解GPIO的驱动原理。 这篇内容是无际单片机编程lora模块项目其中一节课内容,会配套有视频教程。 STM8单片机的标准库中,不仅包括了我们单片机库文件,还提供了外设的例程代码,供单片机软件程序开发参考. 如上图所示,标准库中包括了STM8单片机所有的外设历程,我们今天要学习的GPIO的驱动,所以我
[单片机]
STM8单片机<font color='red'>GPIO</font>口的<font color='red'>驱动</font>深度解析
STM8 GPIO 学习(驱动LED、Button)
STM8中GPIO寄存器有:输出寄存器(ODR),输入寄存器(IDR),方向寄存器(DDR),控制寄存器1(CR1)和控制寄存器2(CR2).后面三个寄存器组和可以配置为8种GPIO的模式 定义如下: /** * @brief General Purpose I/Os (GPIO) */ typedef struct GPIO_struct { __IO uint8_t ODR; /*! Output Data Register */ __IO uint8_t IDR; /*! Input Data Register */ __IO uint8_t DDR; /*! Data Direction Register
[单片机]
STM8 <font color='red'>GPIO</font> 学习(<font color='red'>驱动</font>LED、Button)
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved