历史上的今天
今天是:2025年06月05日(星期四)
2018年06月05日 | 基于linux2.6.30.4的s3c2440寄存器的虚拟地址和物理地址的关系
2018-06-05 来源:eefocus
1
想一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-R表示启动递归处理。
刚开始学字符设备驱动,感觉最难的是驱动和底层硬件的连接。linux上的驱动程序,是基于操作系统之上的,他并不直接和底层的硬件打交道,但是我们写的驱动必须能使硬件“跑”起来,即与硬件紧密相连。
就拿最简单的LED驱动来说,我们的驱动程序是在虚拟的内存上面跑的,但是最终,LED的点亮还是必须靠GPIO管脚的高低电平来控制。那么,我们的虚拟的内存怎么才能和实际的硬件上面的寄存器对应起来呢?
这篇要写的就是ioremap这个映射函数,他可以将我们硬件上面的寄存器,映射为虚拟的内存,从而使驱动程序在我们的虚拟的内存中运行。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
2
#include
#include
#include
//#include
volatile unsigned long virt, phys;//用于存放虚拟地址和物理地址
volatile unsigned long *GPBCON, *GPBDAT, *GPBUP;//用与存放三个寄存器的地址
void led_device_init(void)
{
// 0x56000010 + 0x10 包揽全所有的IO引脚寄存器地址
phys = 0x56000010; // 0x56000010=GPBCON
//在虚拟地址空间中申请一块长度为0x10的连续空间
//这样,物理地址phys到phys+0x10对应虚拟地址virt到virt+0x10
virt =(unsigned long)ioremap(phys, 0x10);
GPBCON = (unsigned long *)(virt + 0x00);//指定需要操作的三个寄存器的地址
GPBDAT = (unsigned long *)(virt + 0x04);
GPBUP = (unsigned long *)(virt + 0x08);
}
//led配置函数,配置开发板的GPIO的寄存器
void led_configure(void)
{
*GPBCON &= ~(3 << 10)&~(3<<12)&~(3 << 16)&~(3<<20);//GPB12 defaule 清零
*GPBCON |= (1 << 10)|(1<<12)|(1<<16)|(1<<20); //output 输出模式
*GPBUP |= (1 << 5)|(1 <<6)|(1 <<8)|(1 <<10); //禁止上拉电阻
}
void led_off(void) //点亮led
{
*GPBDAT &= ~(1 << 5)&~(1 << 6)&~(1 << 8)&~(1 << 7);
}
void led_on(void) //灭掉led
{
*GPBDAT |= (1 << 5)|(1 << 6)|(1 << 8)|(1 << 7);
}
static int __init led_init(void) //模块初始化函数
{
led_device_init(); //实现IO内存的映射
led_configure(); //配置GPB5 6 8 10为输出
led_on();
printk("hello ON!\n");
return 0;
}
static void __exit led_exit(void) //模块卸载函数
{
led_off();
iounmap((void *)virt); //撤销映射关系
printk("led OFF!\n");
}
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("litingting<>");
MODULE_VERSION("2015-5-26");
3 makefile
ifneq ($(KERNELRELEASE),)
obj-m :=vir.o
else
KERNELDIR :=/home/litingting/gec2440/linux-2.6.30.4
all:
make -C $(KERNELDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.o *.ko *.mod.o *.mod.c *.symvers modul* *.*~
endif
史海拾趣
|
成都无线龙成立以来,一直致力于嵌入式无线的开发和研究,几年来已经积累丰富的技术资源和研究开发/学习系统的经验。为了更好的适应目前嵌入式无线的市场需求,也为了对无线龙技术进行有效的整合,把它们完全奉献给无线领域。无线龙决定开发一套 ...… 查看全部问答> |
|
拿到了心仪已久的X86系列的NTC929板子,打开包装,给人的感觉总是那么舒心和愉悦。拿到手了,进行简单测评一下。 本板式一款高性能、低功耗3.5’的嵌入式工业主板,该板采用了Intel Siliverthorn+Poulsbo芯片组,板载IntelSilverthorn(Intel Atom ...… 查看全部问答> |
|
我的WINCE系统 可以PING通局域网内其他PC的IP 但是 连接外网的时候就不行, 我主要是想在局网内打印(特性目录中PCL Print driver添加进去了) ,打印IE浏览器的时候 点 file/print 没反应! 我用的是HP的激光打印机支持PCL的!是不是 ...… 查看全部问答> |
|
程序在WM5.0的设备上运行时,如果菜单项超过两项时,菜单栏的颜色就会变成淡蓝色,而不是原来默认的颜色。 请问有没有办法是菜单栏的颜色不改变或是将菜单栏的颜色设置一下呢?? 用C++… 查看全部问答> |
|
activesync4.2无法通过usb连接pc与wince5.0 我使用致远(周立功) MagicARM2410教学实验开发平台及配套光盘中的wince镜像 按照试验指导书安装evc4.0 及activesync4.2及相关软件 但pc机始终无法使用activesync4.2通过usb与wince建立连接 pc端的activesync4.2会显示正在连接 但约一分钟后 会显 ...… 查看全部问答> |
|
用stm32l152芯片控制mma7455l遇到的一个问题! 我使用stm32l152模拟IIC接口控制mma7455l加速的传感器。 iic驱动程序,对加速的传感器的0x16控制寄存器的访问是完全正确,例如先向0x16寄存器写入0x45,然后可以正确的读取到0x45。 但是读取数据寄存器0x06、0x07、0x08和地址寄存器0x0d的时候却不 ...… 查看全部问答> |




