当前位置: 首页 > news >正文

2023.10.20 LED驱动

驱动程序

#include<linux/init.h>
#include<linux/module.h>
#include<linux/fs.h>
#include<linux/uaccess.h>
#include<linux/io.h>
#include"head.h"unsigned int major;
unsigned int *vir_moder;
unsigned int *vir_odr;
unsigned int *vir_rcc;char kbuf[128] = {0};
int mycdev_open(struct inode *inode, struct file *file){printk("%s:%s:%d\n",__FILE__, __func__, __LINE__);return 0;
}
ssize_t mycdev_read(struct file *file, char *ubuf, size_t size, loff_t *lof){if( copy_to_user(ubuf, kbuf, size) ){printk("copy_to_user fail\n");}printk("%s:%s:%d\n",__FILE__, __func__, __LINE__);return 0;
}
ssize_t mycdev_write(struct file *file, const char *ubuf, size_t size, loff_t *lof){if( copy_from_user(kbuf, ubuf, size) ){printk("copy_from_user fail\n");}printk("%s:%s:%d\n",__FILE__, __func__, __LINE__);if(kbuf[0] == '0'){//灭灯(*vir_odr) &= ~(0x1 << 10);}else if(kbuf[0] == '1'){//亮灯(*vir_odr) |= (0x1 << 10);}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,.read = mycdev_read,.write = mycdev_write,.release = mycdev_close,};static int __init mycdev_init(void){major = register_chrdev(0,"mychrdev",&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("物理内存地址映射失败%d\n", __LINE__);return -1;}vir_odr = ioremap(PHY_LED1_ODR, 4);if(vir_odr == NULL){printk("物理内存地址映射失败%d\n", __LINE__);return -1;}vir_rcc = ioremap(PHY_RCC, 4);if(vir_rcc == NULL){printk("物理内存地址映射失败%d\n", __LINE__);return -1;}//初始化寄存器(*vir_rcc) |= (0x1 << 4);(*vir_moder) &= ~(0x3 << 20);(*vir_moder) |= (0x1 << 20);(*vir_odr) &= ~(0x1 << 10); //默认关灯return 0;
}static void __exit mycdev_exit(void){//取消内存映射iounmap(vir_moder);iounmap(vir_odr);iounmap(vir_rcc);//注销字符设备驱unregister_chrdev(major, "mychrdev");
}module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

应用程序

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include<string.h>
int main(int argc, void const *argv[]){char buf[128] = {0};int fd = open("/dev/mychrdev", O_RDWR);if(fd < 0){printf("打开设备文件失败\n");return -1;}printf("打开设备文件成功\n");while(1){printf("输入0灭灯,输入1亮灯>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;write(fd, buf, sizeof(buf));
/*bzero(buf,sizeof(buf));read(fd, buf, sizeof(buf));printf("buf:%s\n", buf);
*/}close(fd);return 0;
}

头文件

#ifndef __HEAD_H__
#define __HEAD_H__#define PHY_LED1_MODER 0X50006000
#define PHY_LED1_ODR 0X50006014
#define PHY_RCC 0X50000A28#endif

http://www.lryc.cn/news/199802.html

相关文章:

  • 【力扣刷题】回文链表、环形链表、合并两个有序链表
  • linux错误处理函数
  • vue2技能树(5)-条件渲染和列表渲染
  • MySQL基本操作之创建数据库
  • 8.对象贴地
  • AWS Lambda – 函数版本,别名,API网关,CodeDeploy协同
  • flutter doctor检测环境,出现CocoaPods installed but not working
  • Python 条件和 if 语句
  • 行业领先的三个企业正在利用聊天机器人变得更强
  • 「Git|场景案例」从项目中删除之前commit过的文件并且让git不追踪删除操作
  • 一款.NET Core开源的基于Vue+ElementUI开发的博客系统 - StarBlog
  • 用git stash暂存修改
  • 一个适合练手的接口测试实战项目——慕慕生鲜
  • window10/11 光学系统建模之Light Tools8.6 软件安装教程(亲测可用+附带免费资源可直接下载)
  • Vue3+ElementPlus el-date-picker时间选择器,设置最多选择60天区间内,必须选择大于今天
  • 2022年亚太杯APMCM数学建模大赛B题高速列车的优化设计求解全过程文档及程序
  • OSI网络分层模型
  • EOS区块链keosd的RPC API
  • React +AntD + From组件重复提交数据(已解决)
  • spring的简单使用(配合Druid操作数据库)
  • 10.20作业
  • 笔记1 Compute Shaders
  • IntelliJ IDEA 2023版本 Debug 时没有Force Step Into 按钮解决方法
  • 【2024秋招】用友后端BIP部门hr面-2023.8.31
  • [ Windows ] ping IP + Port 测试 ip 和 端口是否通畅
  • Golang协程的概念、用法、场景及案例
  • Redis 主从复制,哨兵,集群——(3)集群篇
  • Flink之Watermark水印、水位线
  • uni-app:对数组对象进行以具体某一项的分类处理
  • 顺序队列----数据结构