【Linux驱动】【手把手配置3568寄存器】点亮RK3568的一颗LED

【硬件】

3568的LED9 :引脚 GPIO0 B7

【配置GPIO的复用】

 找配置复用关系的寄存器基地址、偏移地址、对应配置的GPIO。

查找:io -r -4 0xfdc2000c 系统设置的默认值

结果为1,意思是只有bit 0是1,其他全都为0。所以系统默认就是配置GPIO功能,所以可以不用设置复用GPIO。

【配置GPIO的方向 Direction Register】

查找对应IO配置:io -r -4 0xfdd60008 的默认值(GPIO基地址为0xfdd60000,GPIOB地址偏移8位:0xfdd60008

结果为:0000c064

二进制 : 1100 0000 0110 0010

bit 15为1 ,所以默认已经配置为输出了

【配置GPIO数据寄存器】

查找对应IO配置:io -r -4 0xfdd60000 的默认值

结果为:8000c040

可知bit15 默认为1

PB7写1对应的数据寄存器地址:   8000c040

【问】B7的写使能位是哪一位?

bit31。

PB7写0对应的数据寄存器地址:80004040

PS   :   bit15设置为0(PB7写0),B7对应控制位bit31必须使能1(写使能) 

【驱动】 

#define GPIO_DR 0xFDD60000struct device_test{dev_t dev_num;static int major = 0;static int minor = 0;struct cdev cdev_test;struct class *class;struct device *device;char kbuf[32];  //模拟内核寄存器的数据/************************/unsigned int *vir_gpio_dr; //保存GPIO寄存器虚拟地址用的
};/* 然后定义结构体变量 */
struct device_test dev1;static int moduleparam_init()
{int ret;ret = alloc_chrdev_region(&dev1.dev_num,0,1,"HELLO");  if(ret<0){goto err_chrdev;}printk("alloc_chrdev_region ok\n");  dev1.major_num =MAJOR(dev1.dev_num); //将主设备号取出来dev1.minor_num = MINOR(dev1.dev_num);//将次设备号取出来printk("major_num = %d\n", dev1.major_num);//打印传入进来的主设备号printk("minor_num = %d\n", dev1.minor_num);//打印传入进来的次设备号dev1.cdev_test.owner = THIS_MODULE;cdev_init(dev1.cdev_test, &cdev_file_operations);ret = cdev_add(&dev1.cdev_test, dev1.dev_num, 1);if(ret<0){goto err_chradd;}dev1.class = class_creat(THIS_MODULE, "test");/* 判断创建类有没有失败 */if(IS_ERR(dev1,device)){ret = PTR_ERR(dev1,device);goto err_class_creat;           }dev1.device = device_creat( dev1.class,NULL, dev1.dev_num,,NULL,"test")  /* 判断创建类有没有失败 */if(IS_ERR(dev1.device)){ret = PTR_ERR(dev1,device);goto err_device_creat;           }                    return 0;dev1.vir_gpio_dr = ioremap(GPIO_DR, 4);if(IS_ERR(dev1.vir_gpio_dr)){ret = PTR_ERR(dev1.vir_gpio_dr);goto err_ioremap;           }                    err_ioremap:iounmap(GPIO_DR); //要取消虚拟映射的地址err_device_creat:  //设备添加失败,意味着设备类添加成功,就要把这个类删掉class_destroy( dev1.class);
err_class_creat: //类添加失败,意味着字符设备添加成功,就要把这个字符设备删掉cdev_del(& dev1.cdev_test);  //销毁字符设备        
err_chradd: //添加cdev失败,意味着添加设备号成功,就要释放这个设备号unregister_chrdev_region( dev1.dev_num,DEVICE_NUMBER);//注销设备号
err_chrdev:return ret;
}

关键:

static ssize_t cdev_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
{struct device_test *test_dev = (struct device_test *)file->private_data;test_dev->kbuf = {0};if(copy_from_user( test_dev->kbuf, buf ,sizeof(buf))!= 0);{printk("copy_from_user error !\n");return -1;}if(test_dev -> kbuf[0] == 1){*(test_dev->vir_gpio_dr) = 0x8000c040;else if{*(test_dev->vir_gpio_dr) = 0x80004040;        }   }return 0;            
}static void hello_exit(void)
{unregister_chrdev_region( dev1.dev_num,DEVICE_NUMBER);//注销设备号cdev_del(& dev1.cdev_test);  //销毁字符设备device_destroy( dev1.class, dev1.dev_num);class_destroy( dev1.class);iounmap(GPIO_DR);printk("gooodbye! \n");
}

【APP】

int main(int argc, char *argv[])
{int fd;char buf[32] = {0};fd1 = open("/dev/test", HELLO);  /* 打开设备节点1 */if(fd < 0){perror("open error \n");return fd;   }   buf[0] = atoi(argv[1]);write(fd, buf, sizeof(buf));close(fd);  return 0;  
}

【实验效果】

./a.out 1 可以实现点灯

./a.out 0 可以实现灭灯

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

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

相关文章

前端使用axios下载文件

首先&#xff0c;axios实例在发起下载文件请求时&#xff0c;应该配置responseType: ‘blob’&#xff0c;例如&#xff1a; // axios发起下载文档请求 export const downloadDoc (id: string) > {return request.get(/downloadDoc?id${id}, {// 参考官方文档https://www…

资质升级路径:掌握建筑装饰乙级设计资质要求

建筑装饰乙级设计资质的升级路径及要求可以归纳如下&#xff1a; 一、基本要求 企业资历与信誉&#xff1a; 企业需具有独立法人资格。社会信誉良好&#xff0c;注册资本不少于100万元人民币。从事建筑设计业务4年以上&#xff0c;并独立承担过不少于3项工程等级为二级及以上的…

翻译《The Old New Thing》- What were ShellExecute hooks designed for?

What were ShellExecute hooks designed for? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080910-00/?p20933 Raymond Chen 2008年09月10日 ShellExecute 钩子是为什么设计的&#xff1f; 简要 ShellExecute钩子设计用于扩展可执行字…

比较PWM调光和无极调光

在比较PWM调光和无极调光哪种方式更节能时&#xff0c;需要综合考虑多个因素&#xff0c;如灯具类型、光源效率、调光范围以及使用场景等。 PWM调光系统通过调节LED驱动电流的占空比来实现LED亮度的调节&#xff0c;具有高精度、高稳定性、无闪烁现象以及适用范围广等优点。其节…

Python中的“点阵字体”

“点阵字体”是个啥&#xff1f;&#xff0c;在python中怎么使&#xff1f;在现在全面高清的 5 G 5G 5G时代&#xff0c;它还有用“武”之地&#xff1f; (笔记模板由python脚本于2024年06月01日 18:44:31创建&#xff0c;本篇笔记适合会基本编程的coder翻阅) 【学习的细节是欢…

一文搞懂DevOps、DataOps、MLOps、AIOps:所有“Ops”的比较

引言 近年来&#xff0c;“Ops”一词在 IT 运维领域的使用迅速增加。IT 运维正在向自动化过程转变&#xff0c;以改善客户交付。传统的应用程序开发采用 DevOps 实施持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;。但对于数据密集型的机器学习和人…

网络隔离后的跨网投递需求,要这样做才能让需求落地

为了保护企业的核心数字资产、隔离有害的网络安全威胁、保障数据信息在可信网络内进行安全交互&#xff0c;越来越多的企业在网络建设时&#xff0c;选择进行网络隔离。应用较为普遍的网络隔离手段包括物理隔离、协议隔离、应用隔离等&#xff0c;而常见的状态是企业进行内部网…

Lab_ Finding and exploiting an unused API endpoint

https://portswigger.net/web-security/learning-paths/api-testing/api-testing-identifying-and-interacting-with-api-endpoints/api-testing/lab-exploiting-unused-api-endpoint# 查看功能点&#xff1a; 在Burp的HTTP history中发现 /api路径 我们先尝试一下将API请求…

全网最全!场外个股期权的询价下单流程的详细解析

场外个股期权的询价下单流程 场外个股期权交易&#xff0c;作为在交易所外进行的个性化期权交易方式&#xff0c;为投资者提供了更加灵活和定制化的交易选择。以下是场外个股期权询价下单流程的详细步骤&#xff1a; 文章来源/&#xff1a;财智财经 第一步&#xff1a;明确交…

STM32——ADC篇(ADC的使用)

一、ADC的介绍 1.1什么是ADC ADC&#xff08;Analogto-Digital Converter&#xff09;模拟数字转换器&#xff0c;是将模拟信号转换成数字信号的一种外设。比如某一个电阻两端的是一个模拟信号&#xff0c;单片机无法直接采集&#xff0c;此时需要ADC先将短租两端的电…

AI日报|文生语音大模型国内外均有突破,Pika完成6亿新融资,视频大模型也不远了!

文章推荐 AI搜索哪家强&#xff1f;16款产品实战测评&#xff0c;效率飙升秘籍&#xff01; AI日报&#xff5c;智谱AI再降价&#xff0c;同时开源9B系列模型&#xff1b;国内外气象大模型竞逐升级 字节推出文本到语音模型家族Seed-TTS&#xff1a;擅长情感表达&#xff0c;…

27个适合上班摸鱼的网页游戏平台,游戏党必备

在繁忙的工作和学习生活中&#xff0c;我们总是在寻找一丝丝的娱乐和放松。而玩游戏无疑是一种轻松愉快的方式。那么&#xff0c;有没有想过在上班上课的时候&#xff0c;偷偷打开浏览器玩几局游戏呢&#xff1f;今天&#xff0c;我们就为大家推荐27个网页游戏平台&#xff0c;…

短视频矩阵系统----可视化剪辑独立开发(采用php)

短视频矩阵系统源头技术开发&#xff1a; 打磨短视频矩阵系统的开发规则核心框架可以按照以下几个步骤进行&#xff1a; 明确系统需求&#xff1a;首先明确系统的功能需求&#xff0c;包括短视频的上传、编辑、发布、播放等环节。确定系统的目标用户和主要的使用场景&#xff…

C++三大特性之继承,详细介绍

阿尼亚全程陪伴大家学习~ 前言 每个程序员在开发新系统时&#xff0c;都希望能够利用已有的软件资源&#xff0c;以缩短开发周期&#xff0c;提高开发效率。 为了提高软件的可重用性(reusability)&#xff0c;C提供了类的继承机制。 1.继承的概念 继承&#xff1a; 指在现有…

mysql数据库学习-mysql内存IO性能优化

Mysql内存性能优化 1 CPU模式优化 1.7、安装jemalloc,避免原生内存分配器带来的内存碎片问题. cp $basedir/lib/mysql/libjemalloc.so.1 /usr/lib64/libjemalloc.so 数据库配置文件添加如下 [mysqld_safe] malloc-lib/usr/lib64/libjemalloc.so 1.8、修改cpu模式 cat …

鸢尾花分类和手写数字识别(K近邻)

鸢尾花分类 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import pandas as pd import mglearn# 加载鸢尾花数据集 iris load_iris() X_train, X_test, y_train, y_test train_test_split(iris.data,iris.target,test_siz…

免费分享一套SpringBoot+Vue校园论坛(微博)系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue校园论坛(微博)系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue校园论坛(微博)系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue校园论坛(微博)系统 Java毕业设计…

【JAVA技术】mybatis 数据库敏感字段加解密方案

引言&#xff1a;自从有公司项目前2年做了三级等保&#xff0c;每年一度例行公事&#xff0c;昨天继续配合做等保测试。这2天比较忙&#xff0c;这里整理之前写的一篇等保技术文章。 正文&#xff1a; 现在公司项目基本用mybatis实现&#xff0c;但由于项目跨度年份比较久&…

chls.pro/ssl证书安装失败解决办法

我的手机是一台root&#xff0c;但未获取sustem分区的手机&#xff0c;在安装charles的 ssl证书时&#xff0c;发现在手机浏览器输入chls.pro/ssl&#xff0c;但证书一直无法下载。

数据中心网络架构设计与优化

数据中心是现代企业和组织的核心基础设施&#xff0c;它们用于存储、处理和传输大量的数据和信息。为了满足不断增长的数据需求和提供可靠的服务&#xff0c;设计和优化数据中心网络架构至关重要。 首先&#xff0c;数据中心网络架构设计需要考虑可扩展性。随着业务的增长&…