历史上的今天
返回首页

历史上的今天

今天是:2025年06月05日(星期四)

正在发生

2018年06月05日 | 基于linux2.6.30.4的s3c2440寄存器的虚拟地址和物理地址的关系

2018-06-05 来源:eefocus


想一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-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  


推荐阅读

史海拾趣

Deltron公司的发展小趣事

Deltron公司成立于XXXX年,初期以生产基础电子元器件为主。创始人XXX凭借其对电子技术的深刻理解和对市场趋势的敏锐洞察,带领团队进行了一系列技术创新。通过引进先进的生产设备和研发技术,Deltron成功开发出了一系列具有竞争力的产品,逐渐在电子行业中崭露头角。

Focus公司的发展小趣事

Focus科技股份有限公司(虚构)在深耕外贸电商领域的同时,也敏锐地捕捉到了教育与医疗行业的数字化转型机遇。公司利用自身在互联网技术和大数据分析方面的优势,研发了智慧教育平台和移动医疗应用。智慧教育平台通过提供个性化学习资源和在线互动教学服务,有效提升了教育资源的利用率和学生的学习效果;移动医疗应用则通过远程医疗咨询、健康管理等功能,为用户提供了便捷的医疗服务体验。这些跨界融合的产品不仅丰富了公司的业务线,也进一步提升了公司的品牌影响力和市场竞争力。

Bals Elektrotechnik GmbH & Co KG公司的发展小趣事

在1948年,Günter Bals在完成了建筑公司的学徒实习后,决定创立自己的运输公司。他凭借自己的勤奋和才智,很快建立起了一支由14辆卡车组成的运输队伍,并在德国本地开展货运代理业务。这一阶段的创业经历不仅锻炼了Bals的商业头脑,也为他日后在电子行业的发展积累了宝贵的资金和经验。

Bliley Technologies Inc公司的发展小趣事

二战期间,Bliley迎来了其历史上的一个重要时刻。由于战争对通信设备的巨大需求,Bliley的产品成为军事通信领域的关键组件。政府的大量采购合同使得Bliley的销售额直线上升,员工数量也急剧增加。为了满足战争期间的巨大需求,Bliley不得不扩建工厂,并实行昼夜不停的生产制度。这段时期,Bliley不仅在军事通信领域取得了显著成就,同时也为其在战后的发展奠定了坚实基础。

博众电气(BOZHONG ELECTRIC)公司的发展小趣事

在快速发展的电子行业,创新能力是企业保持竞争力的关键。博众电气深知这一点,因此始终注重研发团队的建设和新品开发。

公司组建了一支专业的自动化设备开发团队和一流的新品研发技术团队。这些团队成员都拥有丰富的行业经验和深厚的技术功底,能够迅速响应市场需求,开发出具有竞争力的新产品。

在新品开发方面,博众电气始终坚持创新引领、质量至上的原则。公司不断推出具有创新性和实用性的新产品,赢得了客户的广泛认可和好评。

HSMC公司的发展小趣事

HSMC深知技术创新是企业发展的核心驱动力。公司不仅拥有丰富的14纳米及7纳米以下节点FinFET先进逻辑工艺与晶圆级先进封装技术经验,还持续投入研发,瞄准世界先进的制程工艺。通过与全球各大科研院所的合作,HSMC不断储备行业专利,增强自身的技术壁垒。这种对技术创新的执着追求,为公司的长远发展奠定了坚实基础。

问答坊 | AI 解惑

高校综合性嵌入式无线实验箱有奖问卷调查

成都无线龙成立以来,一直致力于嵌入式无线的开发和研究,几年来已经积累丰富的技术资源和研究开发/学习系统的经验。为了更好的适应目前嵌入式无线的市场需求,也为了对无线龙技术进行有效的整合,把它们完全奉献给无线领域。无线龙决定开发一套 ...…

查看全部问答>

用于低成本声音定位系统

之前用cortex m-3做小区域声音定位,现想尝试用更低成本的LPC1114实现。…

查看全部问答>

请教:串口显示!!

要求:以2400bps从计算机发送任一字节数据,当单片机收到该数据后, 在此数据前加上一序号然后连同此数据一起发送至计算机, 当序号超过255时归零 i的值在0—255之间递增,但是串口调试助手显示的却是 : ASC码+输入的数据!(串口调试助手以字 ...…

查看全部问答>

X86板之NTC929板子测评

拿到了心仪已久的X86系列的NTC929板子,打开包装,给人的感觉总是那么舒心和愉悦。拿到手了,进行简单测评一下。 本板式一款高性能、低功耗3.5’的嵌入式工业主板,该板采用了Intel Siliverthorn+Poulsbo芯片组,板载IntelSilverthorn(Intel Atom ...…

查看全部问答>

WINCE打印问题?求解

我的WINCE系统 可以PING通局域网内其他PC的IP 但是 连接外网的时候就不行, 我主要是想在局网内打印(特性目录中PCL Print driver添加进去了) ,打印IE浏览器的时候 点 file/print 没反应!  我用的是HP的激光打印机支持PCL的!是不是 ...…

查看全部问答>

WM5.0的菜单问题

程序在WM5.0的设备上运行时,如果菜单项超过两项时,菜单栏的颜色就会变成淡蓝色,而不是原来默认的颜色。 请问有没有办法是菜单栏的颜色不改变或是将菜单栏的颜色设置一下呢?? 用C++…

查看全部问答>

activesync4.2无法通过usb连接pc与wince5.0

我使用致远(周立功) MagicARM2410教学实验开发平台及配套光盘中的wince镜像 按照试验指导书安装evc4.0 及activesync4.2及相关软件 但pc机始终无法使用activesync4.2通过usb与wince建立连接 pc端的activesync4.2会显示正在连接 但约一分钟后 会显 ...…

查看全部问答>

8962不能调试

我用IAR v6.0编译下载EasyArm第四章实验程序的bootloader例程到EasyArm8962开发板上,但是下载后没有出现实验指导书上的结果。再试其它的程序(原来都成功了)时,IAR一进入调试就死机了,死得非常彻底,我等了近二个小时也没有提示出现。 请问这 ...…

查看全部问答>

用stm32l152芯片控制mma7455l遇到的一个问题!

我使用stm32l152模拟IIC接口控制mma7455l加速的传感器。 iic驱动程序,对加速的传感器的0x16控制寄存器的访问是完全正确,例如先向0x16寄存器写入0x45,然后可以正确的读取到0x45。 但是读取数据寄存器0x06、0x07、0x08和地址寄存器0x0d的时候却不 ...…

查看全部问答>