Linux 设备树下的LED驱动框架

1、修改设备树文件

1.1 添加pinctrl节点

pinctrl 子系统主要工作内容如下:
①、获取设备树中 pin 信息。
②、根据获取到的 pin 信息来设置 pin 的复用功能
③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上 / 下拉、速度、驱动能力等。
根据数据手册和绑定文档添加pinctrl节点。

iomuxc 节点的 imx6ul-evk 子节点下创建一个名为“ pinctrl_led ”的子节点
 
1 pinctrl_led: ledgrp { 
2 fsl,pins = < 
3 MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0x10B0 /* LED0 */
4 >;
5 };

1.2 添加 LED 设备节点

gpio 子系统顾名思义,就是用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO为输入输出,读取 GPIO 的值等。
在根节点“/”下创建 LED 灯节点,节点名为“ gpioled
gpioled {
#address-cells = <1>;
#size-cells = <1>;
compatible = "alientek-gpioled";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_led>;
led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;
status = "okay";
};

1.3检查 PIN 是否被其他外设使用

①、检查 pinctrl 设置。

②、如果这个 PIN 配置为 GPIO 的话,检查这个 GPIO 有没有被别的外设使用。
2 LED 灯驱动程序框架
#define GPIOLED_CNT 1
#define GPIOLED_NAME "gpioled"

#define LEDOFF 0
#define LEDON 1

/*gpioled 设备结构体*/
struct gpioled_dev
{
    dev_t devid;
    int major;
    int minor;
    struct cdev cdev;
    struct class *class;
    struct device *device;
    struct device_node *nd;
    int led_gpio;
};


struct gpioled_dev gpioled; /*LED*/


static int led_open(struct inode *inode, struct file *filp)
{
    filp->private_data = &gpioled;
    return 0;
}

static int led_release(struct inode *inode, struct file *filp)
{
    struct gpioled_dev *dev = filp->private_data;
    return 0;
}

static ssize_t led_write(struct file *filp, const char __user *buf,
                         size_t count, loff_t *ppos)
{
    int ret;
    struct gpioled_dev *dev = filp->private_data;
    return 0;
}

/*操作集*/
static const struct file_operations led_fops = {
    .owner = THIS_MODULE,
    .write = led_write,
    .open = led_open,
    .release = led_release,
};

/*驱动入口函数*/
static int __init led_init(void)
{
    int ret = 0;


/********注册字符设备驱动*********/
    
    /* 1.创建设备号*/
    ...code...
    /* 2初始化cdev*/
    ...code...

    /* 3添加cdev*/
    ...code...
    /* 4创建类*/
    ...code...
    /* 5创建设备*/
    ...code...

     
/********GPIO相关操作*********/
    /*1,获取设备节点*/
    gpioled.nd = of_find_node_by_path("/gpioled");
    if (gpioled.nd == NULL)
    {
    }

    /*2,获取LED设备所对应的GPIO编号*/
    gpioled.led_gpio = of_get_named_gpio(gpioled.nd, "led-gpios", 0);
    if (gpioled.led_gpio < 0)
    {
      
    }

    /*3,申请GPIO引脚*/
    ret = gpio_request(gpioled.led_gpio, "led-gpio");
    if (ret)
    {
       
    }

    /*4,设置 GPIO1_IO03 为输出,并且输出高电平,默认关闭 LED 灯*/
    ret = gpio_direction_output(gpioled.led_gpio, 1);
    if (ret)
    {
       
    }

    /*5,输出低电平,点亮led灯*/
    gpio_set_value(gpioled.led_gpio, 0);

    return ret;
}

/*驱动出口函数*/
static void __exit led_exit(void)
{
    /*关灯*/
    gpio_set_value(gpioled.led_gpio, 1);

    /*注销字符设备驱动*/
...code...

    /*释放IO*/
    gpio_free(gpioled.led_gpio);
}

module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("supersmart");



 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要点亮LED,需要使用GPIO控制器驱动。以下是在Linux下使用GPIO驱动框架点亮LED的步骤: 1. 确定GPIO引脚编号 首先需要确定要使用哪个GPIO引脚,并获取该引脚的GPIO编号。可以通过查看设备树或者GPIO控制器的文档来确定GPIO编号。 2. 编写GPIO驱动程序 在Linux下使用GPIO驱动框架,可以通过编写内核模块来控制GPIO。以下是一个简单的GPIO驱动程序示例: ```c #include <linux/module.h> #include <linux/kernel.h> #include <linux/gpio.h> #include <linux/init.h> #define LED_GPIO 2 // GPIO引脚编号 static int __init led_init(void) { int ret; // 申请GPIO ret = gpio_request(LED_GPIO, "LED"); if (ret < 0) { printk(KERN_ERR "Failed to request GPIO\n"); return ret; } // 将GPIO设置为输出 ret = gpio_direction_output(LED_GPIO, 1); if (ret < 0) { printk(KERN_ERR "Failed to set GPIO direction\n"); gpio_free(LED_GPIO); return ret; } printk(KERN_INFO "LED driver initialized\n"); return 0; } static void __exit led_exit(void) { // 将GPIO设置为高电平 gpio_set_value(LED_GPIO, 1); // 释放GPIO gpio_free(LED_GPIO); printk(KERN_INFO "LED driver exited\n"); } module_init(led_init); module_exit(led_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("A simple GPIO driver for LED"); ``` 3. 编译内核模块并加载 将以上代码保存为led.c文件,并使用以下命令编译内核模块: ```sh $ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules ``` 然后使用以下命令加载内核模块: ```sh $ sudo insmod led.ko ``` 此时,LED应该会点亮。 4. 卸载内核模块 使用以下命令卸载内核模块: ```sh $ sudo rmmod led ``` 此时,LED应该会熄灭。 注意:在实际使用中,需要根据具体的硬件平台和GPIO控制器的型号进行相应的修改。另外,在使用GPIO控制器驱动时,需要特别注意GPIO的电气特性,以免损坏硬件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值