ARM驱动学习之 IOremap实现GPIO 读

devtools/2024/9/23 1:14:29/

                        ARM驱动学习之 IOremap实现GPIO 读

前面介绍了虚拟地址和物理地址。
读写GPIO,控制GPIO的寄存器都是使用系统做好的虚拟地址
本期介绍如何自己实现物理地址到虚拟地址的转化
iounmap和ioremap函数可以实现物理地址到虚拟地址的转化1.根据原理图找核心板对应的寄存器地址
1.硬件KP_COL0→GPL2_0datasheet物理地址GPL2CON = 0x1100_0000+0x0100 = 0x11000000+0x0100=0x11000100GPL2DAT = 0x11000104GPL2PUD = 0x11000108寄存器不一定都是32位的,也有16位和8位在前一次文件中修改:
1.修改文件名和Makefile.
2.将宏定义的驱动部分删除。
3.建立led_gpl2_init(),led_gpl2_exit();
4.led_gpl2_init() 定义gpl2_device_init();
5.gpl2_device_init();//实现gpio初始化;
6.gpl2_config();//实现Gpio输出模式;
7.gpl2_on();//实现led亮;
8.led_off();//实现led灭;
9.volatile unsigned long virt_addr,phys_addr;//定义存放虚拟地址和物理地址;
10.volatile unsigned long *GPL2CON,*GPL2DAT,*GPL2PUD;//定义存放三个寄存器地址
11.gpl2_device_init();定义物理起始地址和转换为虚拟地址;
phys_addr = 0x11000100;
virt_addr = ioremap(phys_addr,0x10);
12.指定操作的寄存器地址:
GPL2CON = (unsigned long *)(virt_addr + 0x00);
GPL2DAT = (unsigned long *)(virt_addr + 0x04);
GPL2PUD = (unsigned long *)(virt_addr + 0x08);
13.配置为输出模式,gpl2_config():
将*GPL2CON[0][3:0] = 0x1
将*GPL2PUD[0:7]    = 0x3
14.在将gpl2_on() 中*GPL2DAT |= 0x01;
15.在将gpl2_off() 中*GPL2DAT &= 0xfe;

源码:

#include <linux/init.h>
#include <linux/module.h>
#include <asm/io.h>volatile unsigned long virt_addr,phys_addr;//定义存放虚拟地址和物理地址;
volatile unsigned long *GPL2CON,*GPL2DAT,*GPL2PUD;//定义存放三个寄存器地址void gpl2_on(void)
{*GPL2DAT |= 0x01;
}void led_off(void)
{*GPL2DAT &= 0xfe;
}void gpl2_device_init(void)
{phys_addr = 0x11000100;virt_addr = (unsigned long)ioremap(phys_addr,0x10);GPL2CON = (unsigned long *)(virt_addr + 0x00);GPL2DAT = (unsigned long *)(virt_addr + 0x04);GPL2PUD = (unsigned long *)(virt_addr + 0x08); //配置GPIO为输出模式;*GPL2CON &= 0xfffffff1;*GPL2CON |= 0x00000001; //配置GPIO为Disables Pull-up;*GPL2PUD |= 0x0003;
}static int led_gpl2_init(void)
{printk("led_gpl2_init\r\n");gpl2_device_init();gpl2_on();return 0;
}static void led_gpl2_exit(void)
{printk("led_gpl2_exit\r\n");led_off();}module_init(led_gpl2_init);//这边打错了浪费半小时!!!
module_exit(led_gpl2_exit);MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("TOPEET");

Makefile:

#!/bin/bash
#通知编译器我们要编译模块的哪些源码
#这里是编译itop4412_hello.c这个文件编译成中间文件itop4412_hello.o
obj-m += dri_ioremap.o #源码目录变量,这里用户需要根据实际情况选择路径
#作者是将Linux的源码拷贝到目录/home/topeet/android4.0下并解压的
KDIR := /home/topeet/Android4.0/iTop4412_Kernel_3.0#当前目录变量
PWD ?= $(shell pwd)#make命名默认寻找第一个目标
#make -C就是指调用执行的路径
#$(KDIR)Linux源码目录,作者这里指的是/home/topeet/android4.0/iTop4412_Kernel_3.0
#$(PWD)当前目录变量
#modules要执行的操作
all:make -C $(KDIR) M=$(PWD) modules#make clean执行的操作是删除后缀为o的文件
clean:rm -rf *.o


http://www.ppmy.cn/devtools/115728.html

相关文章

【HTTP】请求“报头”,Referer 和 Cookie

Referer 描述了当前这个页面是从哪里来的&#xff08;从哪个页面跳转过来的&#xff09; 浏览器中&#xff0c;直接输入 URL/点击收藏夹打开的网页&#xff0c;此时是没有 referer。当你在 sogou 页面进行搜索时&#xff0c;新进入的网页就会有 referer 有一个非常典型的用…

2024“华为杯”中国研究生数学建模竞赛(A题)深度剖析_数学建模完整过程+详细思路+代码全解析

问题一详细解答过程 2. 简化疲劳损伤计算模型 2.1 累积损伤的Palmgren-Miner理论 根据Palmgren-Miner线性累积损伤理论&#xff0c;疲劳损伤是通过在一定的应力循环下累积的。对于给定应力幅值 S i S_i Si​&#xff0c;累积损伤值 D D D 是由经历的应力循环次数 n i n_i…

FRIDA-JSAPI:Java使用

Frida Frida.version 包含当前Frida版本信息的属性&#xff0c;以字符串形式表示。setImmediate(function (){console.log(Frida.version) })Java Java.perform(fn) 确保当前线程已附加到虚拟机&#xff0c;并调用 fn。 setImmediate(function (){Java.perform(function (){c…

WebLogic 靶场攻略

后台弱⼝令GetShell 步骤一&#xff1a;环境部署 cd vulhub-master/weblogic/weak_password docker-compose up -d docker ps 步骤二&#xff1a;漏洞复现 默认账号密码&#xff1a;weblogic/Oracle123 步骤二&#xff1a;进行登录 http://192.168.10.190:7001/console/…

高级I/O知识分享【5种IO模型 || select || poll】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;前文 2&a…

Java-Part 0

Advanced Java and Cutting-edge Applications Part 0: Course presentation Part 1 其实就是个括号匹配问题&#xff0c;Stack 经典问题&#xff0c;但是好久没用Java&#xff0c;有一点点生疏&#xff0c;感觉老师的版本要简洁的多 package tiei.ajp.test;import java.uti…

信安 实验1 用Wireshark分析典型TCP/IP体系中的协议

实验1 用Wireshark分析典型TCP/IP体系中的协议 实验目的 通过Wireshark软件分析典型网络协议数据包&#xff0c;理解典型协议格式和存在的问题&#xff0c;为后续学习和相关实验打下基础。 实验内容 &#xff08;1&#xff09;安装Wireshark&#xff0c;熟悉功能菜单。 &…

高速服务区生活废水处理设备产地货源

诸城市鑫淼环保小编带大家了解一下高速服务区生活废水处理设备产地货源 高速公路服务区生活污水处理设备是专门针对高速公路服务区产生的生活污水进行处理的设备。这些设备通常具备高效、稳定、环保等特点&#xff0c;以确保服务区产生的污水能够得到有效处理&#xff0c;达到排…