Linux I/O 映射(ioremap)和writel/readl
在裸奔代码中,如果要控制gpio,直接控制gpio寄存器地址即可;
在linux系统中,所有操作的地址都是虚拟地址,都是由linux内核去管理,所以需要将物理地址转换成内核可识别的虚拟地址。
1、ioremap 和 iounmap
// 功能:将物理地址映射为虚拟地址
// 参数1:需要映射的物理地址
// 参数2:需要映射的地址长度
// 返回值:映射后的虚拟地址(例:void*reg_base = ioremap(0x12345678, 4);)
void *ioremap(cookie, size);
// 功能:取消映射
// 参数:需要取消的虚拟地址
void iounmap(cookie);
2、虚拟地址操作
// 功能:将虚拟地址中的值读出来
// 参数:需要读取的虚拟地址
__raw_readl(addr); 等同于 readl(addr);
// 功能:将数据写入虚拟地址
// 参数1:数据
// 参数2:需要写入的虚拟地址
__raw_writel(data, addr); 等同于 writel(data, addr);
// 从虚拟地址读取4个字节数据
unsigned int readl(unsigned int addr);
// 往虚拟地址写入4个字节数据
void writel(unsigned int data, unsigned int addr);
// 从虚拟地址读取2个字节数据
unsigned short readw(unsigned int addr);
// 往虚拟地址写入2个字节数据
void writew(unsigned short data, unsigned int addr);
// 从虚拟地址读取1个字节数据
unsigned char readb(unsigned int addr);
// 往虚拟地址写入1个字节数据
void writeb(unsigned char data, unsigned int addr);
void led_on(void)
{
void *reg_base;
unsigned int temp;
reg_base = ioremap(0x12345678, 4); temp = __raw_readl(reg_base);
temp &= ~(0xff<<12);
temp |= (0x11<<12); __raw_writel(temp, reg_base);
}
Linux I/O 映射(ioremap)和writel/readl的更多相关文章
- Linux内核访问外设I/O--动态映射(ioremap)和静态映射(map_desc) (转载)
[转](转)Linux内核访问外设I/O资源的方式-静态映射(map_desc)方式 Linux内核访问外设I/O资源的方式 Author: Dongas Date: 08-08-02 我们知道默认外 ...
- writel(readl(&pwm_timer->tcfg0) | 0xff, &pwm_timer->tcfg0);
解析这句代码什么意思! 神说:选定预分频器0 为什么? 神说:因为实验中选的是timer1,在预分频器0下: 若选择timer4,该如何写这句代码? 首先看tcfg0中选择预分频器1,在看tcfg1里 ...
- 查看Linux服务器被映射的公网ip
查看Linux服务器被映射的公网ip 现在云服务器非常流行,不仅企业甚至是个人都可能拥有自己的云服务器,但是目前的云服务器厂商提供的公网IP大都是映射而来,所以在Linux服务器上执行ifconf ...
- Linux下内存映射文件的用法简介
由于项目需要,所以学习了一下Linux下内存映射文件的用法,在这里共享一下自己的收获,希望大家提出宝贵意见,进行交流. 简介: 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区 ...
- Linux共享文件夹映射到Windows磁盘
摘自:https://www.jianshu.com/p/4a06121450e5 1.1方案背景 本方案就是在解决磁盘不足的问题而产生的,利用映射盘的原理将Linux共享文件夹映射到Windows磁 ...
- linux 内存映射-ioremap和mmap函数
最近开始学习Linux驱动程序,将内存映射和ioremap,mmap函数相关资料进行了整理 一,内存映射 对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器 ...
- Linux 字符设备驱动—— ioremap() 函数解析
一. ioremap() 函数基础概念 几乎每一种外设都是通过读写设备上的相关寄存器来进行的,通常包括控制寄存器.状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址.根据CPU体系结构的不同, ...
- linux kernel内存映射实例分析
作者:JHJ(jianghuijun211@gmail.com)日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex ...
- Linux动态DMA映射
1. 几种地址类型 虚拟地址 Linux内核使用的地址是虚拟地址,数据类型为void *.例如,kmalloc()和vmalloc()函数返回值就是虚拟地址. 物理地址 处理器真实地址总线上的地址,数 ...
随机推荐
- Linux 一键安装最新内核并开启 BBR 脚本
原文链接 https://teddysun.com/489.html 请到原文链接仔细阅读后操作.建议查看过脚本内容后操作,方便理解运行过程. 使用root用户登录,运行以下命令: wget -- ...
- LeetCode——Word Break
Question Given a string s and a dictionary of words dict, determine if s can be segmented into a spa ...
- 将 sql 数据库 编码 改成 Chinese_PRC_CS_AS
use master go ) drop procedure [dbo].[p_killspid] GO create proc p_killspid ) --要关闭进程的数据库名 as ) ) de ...
- angularjs实现星星评分
angularjs实现星星评分 自定义指令 app.directive('myStars', function () { return { require : '?ngModel', // ?ngMo ...
- Shell 自定义函数
语法: function fname() { 程序段} 例子: #!/bin/bash ## 定义函数,分子除以分母,算利润.占有率等## 参数1:分子## 参数2:分母 function divfu ...
- C++ 学习使用
1.C++已经不太建议用#define const用法 定义小函数,不改变内部成员的可以用inline 2.namespace使用 3.C语言预处理 #define这些的使用 #pragma once ...
- MYSQL变量和状态
mysql设置变量是在my.cnf文件里,修改配置文件后需要重启mysql的服务,才能生效.但是在线上服务器是不允许随便重启的,我们可以用命令直接修改变量值,使其生效.然后再修改配置文件中的值,以防止 ...
- saltstack技术入门与实践
基本原理 SaltStack 采用`C/S`模式,server端就是salt的master,client端就是minion,minion与master之间通过`ZeroMQ`消息队列通信. minio ...
- 查bug受气了,反思
昨天改bug了一天,上午出现bug的原因是Boolean和boolean使用BeanUtils等工具无法自动赋值.我们写的时候注意大小写. 下午查了一个下午没有找到任何原因. 但是我受了气,因为报错点 ...
- Week03-Java学习笔记第三次作业
Week03-面向对象入门 1.本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系. ...