驱动开发作业2

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

驱动开发作业2

LED.H

#ifndef __LED_H__
#define __LED_H__
//1:PE10  2:PF10  3:PE8
#define LED_ON _IOW('l',1,int)
#define LED_OFF _IOW('l',0,int)

#endif

MYCDEV.C

 #include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>
#include<linux/fs.h>
#include<linux/io.h>
#include<linux/device.h>
#include"led.h"
 
int major;
char kbuf[128]={0};
// gpio_t *vir_led1;
// gpio_t *vir_led2;
// gpio_t *vir_led3;
//unsigned int *vir_rcc;
struct class *cls;
struct device *dev;
 
int gpiono1;  //led1
int gpiono2;  //led2
int gpiono3;  //led3
struct device_node *dnode;
int mycdev_open(struct inode *inode, struct file *file)
{
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    return 0;
}
 
long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    int which;
    int ret=copy_from_user(&which,(void *)arg,4);
    if(ret)
    {
        printk("copy_from_user filed\n");
        return ret;
    }
    switch(cmd)
    {
        case LED_ON://开灯
            switch(which)
            {
                case 1:
                     gpio_set_value(gpiono1,1);
                    break;
                case 2:
                     gpio_set_value(gpiono2,1);
                    break;
                case 3:
                     gpio_set_value(gpiono3,1);
                    break;       
            }
            break;
        case LED_OFF://关灯
            switch(which)
            {
                case 1:
                     gpio_set_value(gpiono1,0);  
                     break;
                case 2:
                     gpio_set_value(gpiono2,0);  
                     break;
                case 3:
                     gpio_set_value(gpiono3,0);  
                     break;           
            }
            break;
    }
    return 0;
}
int mycdev_close(struct inode *inode, struct file *file)
{
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    return 0;
}
 
//定义操作方法结构体变量并赋值
struct file_operations fops={
    .open=mycdev_open,
   .unlocked_ioctl=mycdev_ioctl,
    .release=mycdev_close,
};
 
 
static int __init mycdev_init(void)
{
    int ret;
    //字符设备驱动注册
    major=register_chrdev(0,"mycdev",&fops);
    if(major<0)
    {
        printk("字符设备驱动注册失败\n");
        return major;
    }
    printk("字符设备驱动注册成功:major=%d\n",major);
    //向上提交目录
    cls=class_create(THIS_MODULE,"mycdev");
    if(IS_ERR(cls))
    {
        printk("向上提交目录失败\n");
        return -PTR_ERR(cls);
    }
    printk("向上提交目录成功\n");
    //向上提交设备节点信息
    dev=device_create(cls,NULL,MKDEV(major,0),NULL,"mycdev");
    if(IS_ERR(dev))
    {
        printk("向上提交设备节点失败\n");
        return -PTR_ERR(dev);
    }
    printk("向上提交设备节点成功\n");

   //解析设备树节点
   dnode=of_find_node_by_name(NULL,"myleds");
   if(dnode==NULL)
   {
       printk("解析设备树节点失败...\n");
       return -ENOMEM;
   }
   printk("解析设备树节点成功...\n");
 
   //根据设备树节点解析出gpio编号
   /***************LED1*******************/
   gpiono1=of_get_named_gpio(dnode,"led1",0);
   if(gpiono1<0)
   {
       printk("解析设备号%d失败...\n",gpiono1);
       return -EIO;
   }
    printk("解析设备号%d成功...\n",gpiono1);
 
    //申请gpio编号
    ret=gpio_request(gpiono1,NULL);
    if(ret)
    {
        printk("申请GPIO编号%d失败...\n",gpiono1);
        return -EIO;
    }
        printk("申请GPIO编号%d成功...\n",gpiono1);
        //设置管脚为输出
        gpio_direction_output(gpiono1,0);
 
    /***************LED2*******************/
   gpiono2=of_get_named_gpio(dnode,"led2",0);
   if(gpiono2<0)
   {
       printk("解析设备号%d失败...\n",gpiono2);
       return -EIO;
   }
        printk("解析设备号%d成功...\n",gpiono2);
 
        //申请gpio编号
        ret=gpio_request(gpiono2,NULL);
        if(ret)
        {
            printk("申请GPIO编号%d失败...\n",gpiono2);
            return -EIO;
        }
            printk("申请GPIO编号%d成功...\n",gpiono2);
            //设置管脚为输出
            gpio_direction_output(gpiono2,0);
            
         /***************LED3*******************/
   gpiono3=of_get_named_gpio(dnode,"led3",0);
   if(gpiono3<0)
   {
       printk("解析设备号%d失败...\n",gpiono3);
       return -EIO;
   }
        printk("解析设备号%d成功...\n",gpiono3);
 
        //申请gpio编号
        ret=gpio_request(gpiono3,NULL);
        if(ret)
        {
            printk("申请GPIO编号%d失败...\n",gpiono3);
            return -EIO;
        }
            printk("申请GPIO编号%d成功...\n",gpiono3);
            //设置管脚为输出
            gpio_direction_output(gpiono3,0);
      
    return 0;
}
static void __exit mycdev_exit(void)
{

    //销毁设备节点信息
    device_destroy(cls,MKDEV(major,0));
    //销毁目录空间
    class_destroy(cls);
    //注销字符设备驱动
    unregister_chrdev(major,"mychrdev");
 
    //释放编号
    gpio_free(gpiono1);                      //led1
    gpio_free(gpiono2);                     //led2
    gpio_free(gpiono3);                      //led3
    //关灯
    gpio_set_value(gpiono1,0); 
    gpio_set_value(gpiono2,0); 
    gpio_set_value(gpiono3,0); 
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

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

#include"led.h"
#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>
#include <sys/ioctl.h>
 
int main(int argc, char const *argv[])
{
    int a,b;
    char buf[128]={0};
    int fd=open("/dev/mycdev",O_RDWR);
    if(fd<0)
    {
        printf("打开设备文件失败\n");
        exit(-1);
    }
    while(1)
    {
        printf("请输入:1(开灯) 0(关灯)>");
        scanf("%d",&a);
        printf("请输入控制的灯:1(LED1) 2(LED2) 3(LED3)>");
        scanf("%d",&b);
        switch(a)
        {
            case 1:
                ioctl(fd,LED_ON,&b);//开灯
                break;
            case 0:
                ioctl(fd,LED_OFF,&b);//关灯
                break;
        }
    }
    close(fd);
    
    return 0;
}

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

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

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

相关文章

  • 在C++中控制调试信息的输出通常通过预处理指令(如 #define)和条件编译指令(如 #ifdef、#ifndef、#endif)来实现。

    在C++中,控制调试信息的输出通常通过预处理指令(如 #define )和条件编译指令(如 #ifdef 、 #ifndef 、 #endif )来实现。这种方法提供了一种灵活的方式来包含或排除调试代码,而无需对代码本身进行大量修改。以下是实现这一功能的一种常见方法: 定义一个宏用于控制调试

    2024年02月02日
    浏览(30)
  • 详解驱动开发中内核PE结构VA与FOA转换

    摘要: 本文将探索内核中解析PE文件的相关内容。 本文分享自华为云社区《驱动开发:内核PE结构VA与FOA转换》,作者: LyShark 。 本章将探索内核中解析PE文件的相关内容,PE文件中FOA与VA、RVA之间的转换也是很重要的,所谓的FOA是文件中的地址,VA则是内存装入后的虚拟地址

    2024年02月08日
    浏览(29)
  • 【Linux 驱动篇(二)】LED 驱动开发

    Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器。所以本章的 LED 灯驱动最终也是对 I.MX6ULL 的 IO 口进行配置,与裸机实验不同的是,在 Linux 下编写驱动要符合 Linux 的驱动框架。I.MX6U-ALPHA 开发板上的 LED 连接到 I.MX6ULL 的 GPIO1_IO03 这个引脚上,因此本章实验的重点就

    2024年02月12日
    浏览(48)
  • 驱动开发 day4 (led灯组分块驱动)

    //编译驱动(注意Makefile的编译到移植到开发板的内核)         make arch=arm //清除编译生成文件         make clean //安装驱动         insmod mycdev.ko //卸载驱动         rmmod mycdev //编译fun.c 函数(用到交叉工具编译)         arm-linux-gnueabihf-gcc fun.c head.h  mycdev.c fun.c Makefile

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

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

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

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

    2024年02月17日
    浏览(34)
  • STM32MP157驱动开发——LED驱动(原始架构)

    LED 的驱动方式,常见的有四种。 ① 使用引脚输出 3.3V 点亮 LED,输出 0V 熄灭 LED。 ② 使用引脚拉低到 0V 点亮 LED,输出 3.3V 熄灭 LED。 ③ 使用引脚输出 1.2V 点亮 LED,输出 0V 熄灭 LED。 ④ 使用引脚输出 0V 点亮 LED,输出 1.2V 熄灭 LED。 有的芯片为了省电等原因,其引脚驱动能力

    2024年02月03日
    浏览(28)
  • 驱动开发 day2 (led模块化驱动操控)

    head.h fun.c mycdev.c Makefile

    2024年02月15日
    浏览(39)
  • Linux -- 字符设备驱动--LED的驱动开发(初级框架)

    看原理图确定引脚,确定引脚输出什么电平才能点亮 / 熄灭 LED 看主芯片手册,确定寄存器操作方法:哪些寄存器?哪些位?地址是? 编写驱动:先写框架,再写硬件操作的代码 注意 :在芯片手册中确定的寄存器地址被称为 物理地址 ,在 Linux 内核中无法直接使用。 需要使

    2024年04月28日
    浏览(22)
  • Linux 驱动开发基础知识——认识LED驱动程序 (二)

     个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755@qq.com 🦉个人WeChat:Vir2021GKBS 🐼 本文由妄北y原创,首发CSDN 🎊🎊🎊 🐨座右铭:大多数人想要改造这个世界,但却罕有人想改造自己。 专栏导

    2024年01月21日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包