驱动开发day2

任务:使用模块化编译安装驱动实现三盏LED灯的亮灭

驱动程序

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>#define PHY_RCC 0X50000A28
#define PHY_LED1_MODER 0x50006000
#define PHY_LED2_MODER 0x50007000
#define PHY_LED1_ODR 0x50006014
#define PHY_LED2_ODR 0x50007014unsigned int major;
char kbuf[128] = "";unsigned int *vir_rcc;
unsigned int *vir_moder1;
unsigned int *vir_odr1;unsigned int *vir_moder2;
unsigned int *vir_odr2;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)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);unsigned long ret;ret = copy_to_user(ubuf,kbuf,size);if(ret){printk("copy_to_user_failed\n");return -EIO;}return 0;
}ssize_t mycdev_write(struct file *file,const char *ubuf,size_t size,loff_t *lof)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);unsigned long ret;ret = copy_from_user(kbuf,ubuf,size);if(ret){printk("copy_from_user_failed\n");return -EIO;  }   if(kbuf[0] == '0'){//关闭LED1灯printk("LED1 OFF\n");(*vir_odr1) &= (~(0x1 << 10));}else if(kbuf[0] == '1'){//打开LED1灯printk("LED1 ON\n");(*vir_odr1) |= (0x1 << 10);        }if(kbuf[1] == '0'){//关闭LED2灯printk("LED2 OFF\n");(*vir_odr2) &= (~(0x1 << 10));}else if(kbuf[1] == '1'){//打开LED2灯printk("LED2 ON\n");(*vir_odr2) |= (0x1 << 10);        }if(kbuf[2] == '0'){//关闭LED3灯printk("LED3 OFF\n");(*vir_odr1) &= (~(0x1 << 8));}else if(kbuf[2] == '1'){//打开LED3灯printk("LED3 ON\n");(*vir_odr1) |= (0x1 << 8);        }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,"mydev",&fops);if(major < 0){printk("字符设备注册失败\n");return major;}else{printk("字符设备注册成功,major=%d\n",major);}//物理地址映射到虚拟地址上vir_rcc = ioremap(PHY_RCC,4);if(vir_rcc == NULL){printk("映射失败 : %d\n",__LINE__);return -EFAULT;}//LED1/3vir_moder1 = ioremap(PHY_LED1_MODER,4);if(vir_moder1 == NULL){printk("映射失败 : %d\n",__LINE__);return -EFAULT;}vir_odr1 = ioremap(PHY_LED1_ODR,4);if(vir_odr1 == NULL){printk("映射失败 : %d\n",__LINE__);return -EFAULT;}//LED2vir_moder2 = ioremap(PHY_LED2_MODER,4);if(vir_moder2 == NULL){printk("映射失败 : %d\n",__LINE__);return -EFAULT;}vir_odr2 = ioremap(PHY_LED2_ODR,4);if(vir_odr2 == NULL){printk("映射失败 : %d\n",__LINE__);return -EFAULT;}printk("映射成功\n");//串口初始化(*vir_rcc) |= (0x3 << 4);//LED1初始化(*vir_moder1) &= (~(0x3 << 20));(*vir_moder1) |= (0x1 << 20);(*vir_odr1) &= (~(0x1 << 10));//LED2初始化(*vir_moder2) &= (~(0x3 << 20));(*vir_moder2) |= (0x1 << 20);(*vir_odr2) &= (~(0x1 << 10));//LED3初始化(*vir_moder1) &= (~(0x3 << 16));(*vir_moder1) |= (0x1 << 16);(*vir_odr1) &= (~(0x1 << 8));printk("LED初始化成功\n");return 0;
}static void __exit mycdev_exit(void)
{//取消映射iounmap(vir_rcc);iounmap(vir_moder1);iounmap(vir_odr1);iounmap(vir_moder2);iounmap(vir_odr2);unregister_chrdev(major,"mydev");
}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 fd=open("/dev/mychrdev",O_RDWR);if(fd < 0){printf("文件打开失败\n");return -1;}else{printf("文件打开成功\n");}char buf[128]="";while(1){memset(buf,0,sizeof(buf));printf("请输入LED1/2/3的状态(1:ON/0:OFF)>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';if(buf[0]=='q'){break;}write(fd,buf,sizeof(buf));memset(buf,0,sizeof(buf));read(fd,buf,sizeof(buf));printf("buf : %s\n",buf);}close(fd);return 0;}

串口现象:

开发板现象:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络中的反向传播:综合指南

塔曼纳 一、说明 反向传播是人工神经网络 &#xff08;ANN&#xff09; 中用于训练深度学习模型的流行算法。它是一种监督学习技术&#xff0c;用于调整网络中神经元的权重&#xff0c;以最小化预测输出和实际输出之间的误差。 在神经网络中&#xff0c;反向传播是计算损失函数…

基于 Qt UDP通信局域网通信

前言 该例程经过实际验证可以正常使用,只简单的使用UDP中的单播模式(一对一), 所用测试系统在同一局域网,其中: QT版本:5.12 PC端UDP模式:单播 UDP通信目标:基于STM32F4+LWIP协议的以太网接口 调试助手: 虚拟串口+串口助手+UDP和TCP调试助手[编程人员必备]一、UDP通…

MySQL数据库下载与安装使用

文章目录 MySQL数据库下面是各个版本完整的生命周期。下载MySQL安装包安装和使用MySQL一些基础MySQL使用命令 MySQL数据库 这里我选择的是免安装绿色解压版本 现在各位开发者使用的MySQL&#xff0c;大部分版本都是 5.7&#xff0c;根据官方说明&#xff0c;MySQL 5.7 将于 202…

18.项目开发之前端项目搭建测试

项目开发之前端项目搭建测试 解压文件&#xff0c;将前端项目目录&#xff0c;拖拽到HBuilder中 前端项目QuantTrade_vue地址&#xff1a;传送门 后端项目QuantTrade地址&#xff1a; https://pan.baidu.com/s/1GF45B0QepApH8JbRIOLY7w?pwd1016 开启idea的项目&#xff0c;先…

智慧油气田方案:视频+AI识别,助力油气田生产与管理智能化转型

一、背景与挑战 根据《“十四五”能源领域科技创新规划》指出&#xff0c;要推动核心技术创新突破&#xff0c;推动煤炭、油田、电厂、电网等传统行业与数字化、智能化技术深度融合。我国油田产业已经摆脱了早期粗放式增长的阶段&#xff0c;需要更加精细化、智慧化、科学化的…

PyQt学习笔记-获取Hash值的小工具

目录 一、概述1.1 版本信息&#xff1a;1.2 基本信息&#xff1a;1.2.1 软件支持的内容&#xff1a;1.2.2 支持的编码格式 1.3 软件界面图 二、代码实现2.1 View2.2 Controller2.3 Model 三、测试示例 一、概述 本工具居于hashlibPyQtQFileDialog写的小工具&#xff0c;主要是…

django建站过程(2)创建第一个应用程序页面

创建第一个应用程序页面 设置第一个页面【settings.py,urls.py,views.py】settings.pyurls.pyviews.py django是由一系列应用程序组成&#xff0c;协同工作&#xff0c;让项目成为一个整体。前面已创建了一个应用程序baseapp,使用的命令 python manage.py startapp baseapps这…

机器学习,神经网络中,自注意力跟卷积神经网络之间有什么样的差异或者关联?

如图 6.38a 所示&#xff0c;如果用自注意力来处理一张图像&#xff0c;假设红色框内的“1”是要考虑的像素&#xff0c;它会产生查询&#xff0c;其他像素产生 图 6.37 使用自注意力处理图像 键。在做内积的时候&#xff0c;考虑的不是一个小的范围&#xff0c;而是整张图像的…

发展新能源汽车加快充换电基础设施建设实施方案-安科瑞黄安南

摘要&#xff1a;为深入贯彻落实《国务院办公厅关于印发新能源汽车产业发展规划&#xff08;2021—2035年&#xff09;的通知》&#xff08;国办发 ﹝2020﹞39号&#xff09;、《国家发展改革委等部门关于进一步提升电动汽车充电基础设施服务保障能力的实施意见》&#xff08;发…

【电子通识】USB接口三大类型图册

基本概念 不同时期的USB接口有不同的类型&#xff0c;USB接口分为插头和插座&#xff1a; 插头&#xff0c;plug&#xff0c;对应的也叫公口&#xff0c;即插别人的。 插座&#xff0c;receptacle&#xff0c;对应也叫做母口&#xff0c;即被插的。 USB的接口类型&#xff0…

VMware下linux中ping报错unknown host的解决办法

一、错误截图 二、解决办法 2.1 按照步骤查看本机虚拟IP 依次点击&#xff1a;【编辑】》【虚拟网络编辑器】&#xff0c;选中NET模式所属的行&#xff0c;就能看到子网地址。 比喻&#xff0c;我的子网地址是&#xff1a;192.168.18.0 那么&#xff0c;接下来要配置的linux…

根据pid查看jar包(windows)

打开jdk/bin/jvisualvm.exe,根据pid找到jar包的主启动类,jdk14以后不再默认使用,官网下载,也可以使用老版本的查看

如果Domino上的邮件无法直接发送到@outlook.com

大家好&#xff0c;才是真的好。 目前将Domino仅仅作为邮件服务器的企业用户还不少。如果Domino服务器版本比较新&#xff08;例如版本为11.0.x、12.0.x等&#xff09;&#xff0c;外发邮件时&#xff0c;没有通过邮件网关中转邮件&#xff0c;而是直接发送到Internet互联网上…

未来数字化转型发展的前景如何,企业又该怎么实现?

商业世界有一个认识&#xff0c;互联网只用看中国和美国&#xff0c;其他国家已经被远远甩在了后边&#xff0c;移动互联网的出现更是将互联网的跨地域、跨国、互联等属性发挥到了极致&#xff0c;让众多互联网巨头开启了争夺世界各国市场的脚步。 移动互联网的飞速发展以及物…

VMware——Window11安装VMware17(图解版)

目录 一、VMware17百度云下载二、安装三、注册 一、VMware17百度云下载 下载链接&#xff1a;https://pan.baidu.com/s/1dv_Y7ig2LUFxeHvrG2rOTA 提取码&#xff1a;elih 二、安装 下载 VMware-workstation-full-17.0.2-21581411.exe 安装包后&#xff0c;右键以管理员身份运…

软考-访问控制技术原理与应用

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 访问控制概念 访问控制是计算机安全的一个重要组成部分&#xff0c;用于控制用户或程序如…

PHP的学习入门建议

学习入门PHP的步骤如下&#xff1a; 确定学习PHP的目的和需求&#xff0c;例如是为了开发网站还是为了与数据库交互等。学习PHP的基础语法和程序结构&#xff0c;包括变量、数据类型、循环、条件等。学习PHP的面向对象编程&#xff08;OOP&#xff09;概念和技术。学习与MySQL…

测试用例编写详解

一、前言 测试用例的编写需要按照一定的思路进行&#xff0c;而不是想到哪写到哪&#xff0c;一般测试机制成熟的公司都会有公司自己自定义的测试用例模板&#xff0c;以及一整套的测试流程关注点&#xff0c;当然我们自己在测试生涯中也应当积累一套自己的测试框架&#xff0…

【Proteus仿真】【Arduino单片机】蜂鸣器

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;蜂鸣器播放音乐。 二、软件设计 /* 作者&#xff1a;嗨小易&#xff08;QQ&#x…

S4系统编辑屏幕报错 报错 RFC callback call rejected by whitelist

点击 Dialog 的布局 直接报错 经过检查&#xff0c;发现正式机和开发机在 SM59 TCP/IP链接 的 EU_SCRP_WN32不一样 把开发机的数据维护到生产机&#xff0c;就可以用了 RS_SCRP_GF_PROCESS_640RFC_GET_FUNCTION_INTERFACERS_SCRP_GF_PROCESS_640RS_SCRP_GF_RBUILDINFORS_SC…