终端输入

1亮LED1

2->LED2

3->LED3

0->关灯

chrdev.c:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include "myled.h"#define CNAME "mycdev"int major;              //定义变量接受主设备号
char kbuf[128]={};      //定义数组用于存放和用户之间拷贝的数据unsigned int *vir_moder;
unsigned int *vir_odr;
unsigned int *vir_rcc;unsigned int *vir2_moder;
unsigned int *vir2_odr;
unsigned int *vir2_rcc;
int mycdev_open(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
int mycdev_close(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
ssize_t mycdev_read(struct file *file, char __user *ubuf, size_t size, loff_t *loff)
{int ret;if(size > sizeof(kbuf)){size = sizeof(kbuf);}ret = copy_to_user(ubuf,kbuf,size);if(ret){printk("数据从内核向用户拷贝失败\n");return -EIO; }return size;
}
ssize_t mycdev_write(struct file *file, const char __user *ubuf, size_t size, loff_t *loff)
{int ret;if(size > sizeof(kbuf)){size = sizeof(kbuf);}ret = copy_from_user(kbuf,ubuf,size);if(ret){printk("数据从用户向内核拷贝失败\n");return -EIO; }if(kbuf[0] == '1')  //开灯{(*vir_odr) |= (1 << 10);}else if(kbuf[0] == '2'){(*vir2_odr) |= (1 << 10);}else if(kbuf[0] == '3'){(*vir_odr) |= (1 << 8);}else    //关灯{(*vir_odr) &= ~(1 << 10);(*vir2_odr) &= ~(1 << 10);(*vir_odr) &= ~(1 << 8);}return size;
}struct file_operations fops=
{.open=mycdev_open,.read=mycdev_read,.write=mycdev_write,.release=mycdev_close,
};static int __init demo_init(void)
{//注册字符设备驱动major=register_chrdev(0,CNAME,&fops);if(major < 0){printk("字符设备驱动注册失败\n");return major;}printk("字符设备驱动注册成功major=%d\n",major);//进行物理地址的映射vir_moder = ioremap(PHY_LED1_MODER,4);if(vir_moder == NULL){printk("vir_moder映射失败\n");return -ENOMEM;}printk("vir_moder映射成功\n");vir_odr = ioremap(PHY_LED1_ODR,4);if(vir_odr == NULL){printk("vir_odr映射失败\n");return -ENOMEM;}printk("vir_odr映射成功\n");vir_rcc = ioremap(PHY_LED1_RCC,4);if(vir_rcc == NULL){printk("vir_rcc映射失败\n");return -ENOMEM;}printk("vir_rcc映射成功\n");//进行物理地址的映射vir2_moder = ioremap(PHY_LED2_MODER,4);if(vir2_moder == NULL){printk("vir_moder映射失败\n");return -ENOMEM;}printk("vir2_moder映射成功\n");vir2_odr = ioremap(PHY_LED2_ODR,4);if(vir2_odr == NULL){printk("vir_odr映射失败\n");return -ENOMEM;}printk("vir2_odr映射成功\n");vir2_rcc = ioremap(PHY_LED2_RCC,4);if(vir2_rcc == NULL){printk("vir_rcc映射失败\n");return -ENOMEM;}printk("vir2_rcc映射成功\n");//寄存器的初始化//LED1(*vir_moder) &= ~(3 << 20);(*vir_moder) |= (1 << 20);(*vir_odr) &= ~(1 << 10);//LED2(*vir2_moder) &= ~(3 << 20);(*vir2_moder) |= (1 << 20);(*vir2_odr) &= ~(1 << 10);//LED3(*vir_moder) &= ~(3 << 16);(*vir_moder) |= (1 << 16);(*vir_odr) &= ~(1 << 8);(*vir_rcc) |= (1 << 4);(*vir_rcc) |= (1 << 5);return 0;
}static void __exit demo_exit(void)
{unregister_chrdev(major,CNAME);printk(KERN_ERR "kernel unload\n");
}module_init(demo_init);
module_exit(demo_exit);MODULE_LICENSE("GPL");

myled.h:

#ifndef __MYLED_H__
#define __MYLED_H__#define PHY_LED1_MODER 0x50006000
#define PHY_LED1_ODR   0x50006014
#define PHY_LED1_RCC   0x50000A28#define PHY_LED2_MODER 0x50007000
#define PHY_LED2_ODR   0x50007014
#define PHY_LED2_RCC   0x50000A28#define PHY_LED3_MODER 0x50007000
#define PHY_LED3_ODR   0x50007014
#define PHY_LED3_RCC   0x50000A28#endif

test.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{char buf[128]={};int fd=open("/dev/mycdev",O_RDWR);if(fd < 0){printf("打开失败\n");exit(-1);}    printf("设备文件打开成功\n");//终端输入while(1){printf("请输入控制命令 1:开LED1灯   2:开LED2灯  3:开LED3灯   0:关灯\n");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = '\0';write(fd,buf,sizeof(buf));}memset(buf,0,sizeof(buf));  //清空bufread(fd,buf,sizeof(buf));printf("读取的数据为%s\n",buf);close(fd);return 0;
}

驱动开发 LED灯驱动相关推荐

  1. Linux 自带的LED 灯驱动实验

    目录 Linux 内核自带LED 驱动使能 Linux 内核自带LED 驱动简介 LED 灯驱动框架分析 module_platform_driver 函数简析 gpio_led_probe 函数简析 ...

  2. STM32MP157驱动开发——Linux自带的LED灯驱动

    STM32MP157驱动开发--Linux自带的LED灯驱动 0.前言 一.Linux 内核自带 LED 驱动使能 二.驱动简介 1.LED灯驱动框架分析 2.module_platform_driv ...

  3. Linux 自带的 LED 灯驱动

    1 Linux 内核自带 LED 驱动使能 Linux 内核已经自带了 LED 灯驱动,要使用 Linux 内核自带的 LED 灯驱动首先得先配置 Linux 内核,使能自带的 LED 灯驱动,输入如 ...

  4. linux自带的LED灯驱动实验

    文章目录 一.linux内核自带LED驱动使能 二.linux内核自带LED驱动简介 1.LED灯驱动框架分析 2.module_platform_driver函数解析 3.gpio_led_prob ...

  5. Linux 内核自带的 LED 灯驱动

    系列文章 I.MX6ULL 手册查找使用方法 实战点亮LED(寄存器版) I.MX6ULL 手册查找使用方法 实战点亮LED(固件库版本) linux 字符设备驱动实战 linux LED设备驱动文件 ...

  6. 2022-10-20 Linux自带LED灯驱动gpio-leds 心跳呼吸灯heartbeat、定时器timer的使用

    一.测试环境:Android 9 系统 二.驱动文件在\kernel\drivers\leds\leds-gpio.c 三.dts的官方配置文档 kernel\Documentation\device ...

  7. Linux 自带的 LED 灯驱动实验

    目录 一.配置内核 二.设备树节点编写 1.确定compatible 属性值 2.编写节点 三.验证 测试 其实 Linux 内核已经自带了 LED 灯驱动,要使用 Linux 内核自带的 LED 灯 ...

  8. 系统移植 添加LED灯驱动 实现流程

    1.解压内核源码tar -vxf linux-5.10.61.tar.xz 2.进入linux内核源码cd linux-5.10.61/ 3.配置交叉编译工具链,打开Makefile文件,搜索:CRO ...

  9. I.MX6ULL ARM驱动开发---platfrom设备驱动

    引言   对IO进行最简单的读写操作,设备驱动都非常的简单.像I2C.SPI.LCD 等这些复杂外设的驱动就不能这么去写了,Linux 系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件 ...

最新文章

  1. linux系统学习之Linux打印文件和发送邮件
  2. Ubuntu/CentOS下使用脚本自动安装 Docker
  3. python语言有什么用-python语言为什么好呢?它有什么特点?
  4. ESP32开发 -- 试玩ESP32
  5. python 100实例_[Python] Python 100例
  6. fps200多正常不_AMD处理器扬眉吐气,腾讯游戏不再A黑!LOL最高FPS459平均200多
  7. 二流学校的计算机博士,“二流大学”的博士,值得读吗?想的尴尬症都犯了
  8. mysql 分表查询外连接_SQL多表连接查询实例(内连接外连接)
  9. {ubuntu}乱七八糟重命名为1 2 3.....png
  10. MDK5软件入门之——基础工程创建及下载和调试
  11. 关于Outline Effect 高亮插件不能生效-爻览SDK-MR混合现实开发日志
  12. 红米充电短路 红米note3充电短路 无法充电
  13. VB作业之生成随机数
  14. 基于XCVU9P+ C6678的100G光纤的加速卡
  15. 曾国藩:一勤天下无难事
  16. Linux内核中的Watchdog
  17. 利用形状图层绘制八卦图
  18. 硬盘突然变raw格式_磁盘分区变成RAW格式怎么办?手把手教你解决方法
  19. 三网合一”将给中国和中国经济带来什么
  20. 11.2 NOIP模拟赛 (morning)

热门文章

  1. 《痞子衡嵌入式半月刊》 第 41 期
  2. Blender入门级使用
  3. win10pe制作方法
  4. MC/SG集群系统概述
  5. 算法渣的我们,一起学学算法可好?
  6. 我的2005高考作文:出人意料和情理之中
  7. arcgis地形hgt数据转tif
  8. 一个简易的c语言病毒源码
  9. java.sql.SQLException: Access denied for user 'app '@'xxx.xxx.xxx.xxx' (using password: YES)
  10. 利用ASP在线维护数据库