基于platform驱动模型实现LED灯点亮

这篇具有很好参考价值的文章主要介绍了基于platform驱动模型实现LED灯点亮。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

驱动代码

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/mod_devicetable.h>
#include <linux/fs.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>

struct resource *res;
unsigned int irqno;
struct cdev *cdev;
int major;
struct class *cls;
struct device *dev;
struct gpio_desc *gpiono1;
struct gpio_desc *gpiono2;
struct gpio_desc *gpiono3;

int mycdev_open(struct inode *inode, struct file *file)
{
    return 0;
}
int mycdev_release(struct inode *inode, struct file *file)
{
    return 0;
}
long mycdev__ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    switch (cmd)
    {
    case _IOW('l', 1, int): // 开灯
        switch (arg)
        {
        case 1: // LED1
            gpiod_set_value(gpiono1,1);
            break;
        case 2:
            gpiod_set_value(gpiono2,1);
            break;
        case 3:
            gpiod_set_value(gpiono3,1);
            break;
        }
        break;
    case _IOW('l', 0, int): // 关灯
        switch (arg)
        {
        case 1: // LED1
            gpiod_set_value(gpiono1,0);
            break;
        case 2:
            gpiod_set_value(gpiono2,0);
            break;
        case 3:
            gpiod_set_value(gpiono3,0);
            break;
        }
        break;
    }
    return 0;
    return 0;
}

// 操作方法结构体指针
struct file_operations fops = {
    .open = mycdev_open,
    .unlocked_ioctl = mycdev__ioctl,
    .release = mycdev_release};

int pdrv_probe(struct platform_device *pdev)
{
    major = register_chrdev(0, "mychrdev", &fops);
    if (major < 0)
    {
        printk("字符设备驱动注册失败\n");
        return major;
    }
    // 向上提交目录
    cls = class_create(THIS_MODULE, "mychrdev");
    if (IS_ERR(cls))
    {
        printk("向上提交目录失败\n");
        return -PTR_ERR(cls);
    }
    printk("向上提交目录成功\n");
    // 向上提交设备节点信息
    int i; // 向上提交三次设备节点信息
    for (i = 0; i < 3; i++)
    {
        dev = device_create(cls, NULL, MKDEV(major, i), NULL, "myled%d", i);
        if (IS_ERR(dev))
        {
            printk("向上提交设备节点失败\n");
            return -PTR_ERR(dev);
        }
    }
    printk("向上提交设备节点成功\n");
    gpiono1 = gpiod_get_from_of_node(pdev->dev.of_node, "led1-gpio", 0, GPIOD_OUT_LOW, NULL);
    if (IS_ERR(gpiono1))
    {
        printk("解析GPIO信息失败\n");
        return -PTR_ERR(gpiono1);
    }
    gpiono2 = gpiod_get_from_of_node(pdev->dev.of_node, "led2-gpio", 0, GPIOD_OUT_LOW, NULL);
    if (IS_ERR(gpiono2))
    {
        printk("解析GPIO信息失败\n");
        return -PTR_ERR(gpiono2);
    }
    gpiono3 = gpiod_get_from_of_node(pdev->dev.of_node, "led3-gpio", 0, GPIOD_OUT_LOW, NULL);
    if (IS_ERR(gpiono3))
    {
        printk("解析GPIO信息失败\n");
        return -PTR_ERR(gpiono3);
    }
    return 0;
}
int pdrv_remove(struct platform_device *pdev)
{
    // 销毁设备节点信息
    int i;
    for (i = 0; i < 3; i++)
    {
        device_destroy(cls, MKDEV(major, i));
    }

    // 销毁目录
    class_destroy(cls);
    // 注销字符设备驱动
    unregister_chrdev(major, "mychrdev");
    printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
    return 0;
}

// 构建设备树匹配表
struct of_device_id oftable[] = {
    {.compatible = "hqyj,myled"},
    {},
};
// 1.分配驱动信息对象
struct platform_driver pdrv = {
    .probe = pdrv_probe,
    .remove = pdrv_remove,
    .driver = {
        .name = "ccc",
        .of_match_table = oftable,
    },
};

module_platform_driver(pdrv);
MODULE_LICENSE("GPL");

应用程序

#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>


int main(int argc, char const *argv[])
{
    char buf[128]={0};
    int a,b;
    int fd=open("/dev/myled0",O_RDWR);
    if(fd<0)
    {
        printf("打开设备文件失败\n");
        exit(-1);
    }
    while(1)
    {
        //从终端读取
        printf("请输入要实现的功能 ");
        printf("0(关灯) 1(开灯)\n");
        printf("请输入>");
        scanf("%d",&a);
        printf("请选择要控制的灯:1(LED1)2(LED2) 3(LED3)\n");
        printf("请输入>");
        scanf("%d",&b);
        switch(a)
        {
            case 1:
                ioctl(fd,_IOW('l', 1,int),b);
                break;
            case 0:
                ioctl(fd,_IOW('l', 0,int),b);
                break;
        }
    }

    
    close(fd);

    return 0;
}

文章来源地址https://www.toymoban.com/news/detail-735188.html

到了这里,关于基于platform驱动模型实现LED灯点亮的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习笔记|LED点亮原理|STC32G单片机视频开发教程(冲哥)|第四集-下:点亮LED

    新建工程时待选择的Device:如 STC32G12K128 Seies,需要先在下拉菜单中选择“STC MCU Database”,然后可以选择STC32G12K128 Seies了。 当前以上节课的代码为基础,经过精简后的代码(裸板未添加任何头文件): 需手工下载至开发板(屠龙刀三.1版)。 当前已实现功能:点亮P2^1端口的板

    2024年02月13日
    浏览(55)
  • 韦东山嵌入式Liunx入门驱动开发一(Hello 驱动编程、GPIO基础知识、LED驱动、总线设备驱动模型)

    本人学习完韦老师的视频,因此来复习巩固,写以笔记记之。 韦老师的课比较难,第一遍不知道在说什么,但是坚持看完一遍,再来复习,基本上就水到渠成了。 看完视频复习的同学观看最佳! 基于 IMX6ULL-PRO 参考视频 Linux快速入门到精通视频 参考资料 :01_嵌入式Linux应用

    2024年04月25日
    浏览(81)
  • 驱动开发 字符设备驱动分部注册实现LED灯

    head.h 驱动文件 应用文件 现象实现

    2024年02月19日
    浏览(39)
  • Linux下LED设备驱动开发(LED灯实现闪烁)

    前面我们介绍了Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统等,大家看这篇文章之前需要提前知道的基础都在这篇文章中: Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统介绍 有部分函数没有涉及到的最后会讲解

    2024年02月17日
    浏览(43)
  • 野火stm32指南者开发板点亮LED

    目录 1.芯片手册中的LED电路图 2.官网手册 3.代码演示 3.1 stm32f10x.h 头文件 3.2 点亮绿灯 3.3 点亮蓝灯 3.4 点亮红灯 3.5 LED灯闪烁,绿灯闪烁 。 3.6 红绿蓝三色LED灯切换闪烁 3.1 stm32f10x.h 头文件 3.2 点亮绿灯 3.3 点亮蓝灯 3.4 点亮红灯 3.5 LED灯闪烁,绿灯闪烁 。 3.6 红绿蓝三色LED灯切

    2024年02月13日
    浏览(43)
  • 驱动开发 day8 (设备树驱动,按键中断实现led亮灭)

    //编译驱动  (注意Makefile的编译到移植到开发板的内核)         make arch=arm //清除编译生成文件         make clean ****************************************** //安装驱动         insmod mycdev.ko //卸载驱动         rmmod mycdev   需要在内核路径/arch/arm/boot/dts/  修改 stm32mp157a-fsmp1a-dts 文件 *

    2024年02月14日
    浏览(42)
  • 012——LED模块驱动开发(基于I.MX6uLL)

    目录 一、 硬件原理图 二、 驱动程序 三、 应用程序 四、 Makefile 五、操作         又是非常经典的点灯环节 ,每次学新语言第一步都是hello world,拿到新板子或者学习新的操作系统,第一步就是点灯。         LED 的驱动方式,常见的有四种。 ① 使用引脚输出 3.3V 点

    2024年04月13日
    浏览(48)
  • 基于Step-Mxo2-LCP点亮LED灯

    目的:         使用FPGA控制简单外设,利用按键和开关控制8个LED灯的亮和灭。 LED灯的原理图:         基于Step-Mxo-LCP核心板上有8个红色的LED灯,LED1~8信号直接连接到FPGA的引脚,作为FPGA输出信号控制,FPGA输出低电平时,LED亮;否则LED状态为灭。 按键的原理图: 核心板上

    2024年04月28日
    浏览(31)
  • [驱动开发]gpio子系统及中断实现led亮灭

    编写LED灯的驱动,使用GPIO子系统,里面添加按键的中断处理 1.应用程序发送指令控制发光二极管亮灭 2.按键1按下,led1电位反转;按键2按下,led2电位反转;按键3按下,led3电位反转   

    2024年02月14日
    浏览(78)
  • STM32--基于固件库(Library Faction)的led灯点亮

    目录  一、STM32芯片的简单介绍  二、基于固件库(Library Faction)的led灯点亮         这是一个学习stm32的开端,我们由简入难,之前学过C51/52或是其他型号的一般都是从led开始,也就是简单的输入输出端口的应用。( 想学的一定要跟我一起坚持下去,不要半途而废 )  

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包