很简单的问题,如何给一个寄存器赋值

guan323333 2009-12-30 02:59:55
小弟最近在尝试学写驱动,有个很简单的问题,比如我想往某个寄存器里(地址0x9000000)写入0001,应该怎么写,给个代码 谢谢
...全文
1740 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
guan323333 2010-01-06
  • 打赏
  • 举报
回复
谢谢大家的回答,如4L 5L所说,需要先IOREMAP下,不过还是谢谢1L
joyself 2009-12-30
  • 打赏
  • 举报
回复
如楼上所说,需要先映射到虚拟地址

至于读写,推荐使用__raw_readl 和 __raw_writel之类的函数/宏
帅得不敢出门 2009-12-30
  • 打赏
  • 举报
回复
这个不一定吧
如果寄存器地址需要先映射呢?
那么只有映射后才可操作的

对于其地址最好不要直接操作 而是用相应的 read write系列函数操作

Wenxy1 2009-12-30
  • 打赏
  • 举报
回复

const volatile unsigned int *reg_1=(unsigned int *)0x9000000; /* 这样更安全 */
*reg_1 = 0x0001;
deep_pro 2009-12-30
  • 打赏
  • 举报
回复
如果寄存器是32位的 就要改为
unsigned int *p=(unsigned int *)0x9000000;
*p=0x0001;

同时要注意大小端对齐
deep_pro 2009-12-30
  • 打赏
  • 举报
回复
unsigned char *p=(unsigned char *)0x9000000;
*p=0x0001;
发那科机器⼈寄存器Ar_FANUC发那科⼯业机器⼈位置寄存器 的使⽤特点 位置寄存器 位置寄存器 位置寄存器指令是进⾏位置寄存器的算术运算指令,位置寄存器PR[i]和位置号码P[i]的不同在于,位置号码P[i]是不可以被赋值的,⽽位置 寄存器PR[i]是可以被赋值的。 同时位置号码P[i]在使⽤时基本上是基本⽆限制的,其数量受限于⼯业机器⼈所配置的内存⼤⼩,位置寄存器PR[i]只有100个,可以通过 DATA按键随时去查看位置寄存器PR[i]的值。 位置寄存器的特点 位置寄存器的特点 位置寄存器PR[i]只⽀持⼿动设置、赋值以及加减运算。 ⼿动赋值时可以通过DATA按键选择PR[i]后进⾏修改,同时也可以对每⼀个PR[i]进⾏注释说明。 位置寄存器PR[i]赋值运算⽀持以上六种赋值: 1. 位置寄存器PR[i]可以相互直接赋值运算; 2. 位置值P[i]赋值给位置寄存器PR[i]; 3. LPOS代表当前位置值的直⾓坐标系; 4. JPOS代表当前位置的关节坐标系; 5. UFRAME[i]代表⽤户坐标系的值; 6. UTOOL[i]代表⼯具坐标系的值; 加减运算特点 加减运算特点 位置寄存器PR[i]只⽀持加减运算,其它的运算它全部都不⽀持。对于PR的加减运算⽽⾔,它还是每⼀个元素进⾏单独的相加减,实际上是 属于⼀种⽮量的相加减。 位置寄存器PR[i]不仅⽀持两个变量的相加减,还⽀持同时多个变量的相加减,可以将位置信息P[i]与PR[i]同时进⾏运算也是可以的。 对于FANUC发那科机器⼈的设计特点,这⾥也是有防呆设计,也就是说不会让你出现语法错误,若是系统不⽀持的命令就不会在⽰教器中 显⽰出来,当然逻辑错误就没办法进⾏保护了,需要操作⼈⼈员留⼼。 应⽤案例 应⽤案例 在绘制这个圆弧的时候,⾸先第⼀步想到的是,还是要⽰教⼀个安全点,也就是我们的P[1 : home]这个点,在绘制这个圆弧时以C命令为 例。 因为C命令只能绘制半个圆弧,所以需要有两个经过点,为了计算PR[3]、PR[4]、PR[5]还需要使⽤到哪些变量?其中我们可以看到PR[3] 实际上相对于P[2]⽽⾔,它移动了X和Y上的两个值,⽽P[4]只移动了X上⾯的值,⽽P[5]也是改变了X、Y上⾯两个值,⽽每个值的⼤⼩都 是固定的为25,因此可以设置两个中间量PR[1]和PR[2]分别为图⽚上所⽰,⾄于PR[3]、PR[4]、PR[5]就可以分别进⾏设置。 但是这种⽅法就⽤掉了5%的位置寄存器,所以该⽅法我们并不推荐使⽤,那么有没有更好的⽅法去解决这个问题呢? 且看下回分解~
设备树(device tree)机制是Linux内核从linux-3.x版本开始引进的一种机制,目的是解决内核源码的arch/arm目录下代码混乱的问题:随着ARM生态的快速发展,在内核源码的arch/arm目录下,存放着几十种arm芯片和几百个开发板相关的源文件,很多开发板和处理器的中断、寄存器等相关硬件资源都在这个目录下以.c或.h的文件格式定义。而对于内核来说,与这些硬件耦合,会导致内核代码混乱不堪,每个开发板上运行的内核镜像都必须单独编译配置,无法通用。什么时候Linux内核能像Windows镜像那样,无论你的电脑什么配置,一个Windows安装包,都可以直接下载安装运行呢?设备树机制,实现了Linux内核和硬件平台的解耦:每个硬件平台的硬件资源使用一个设备树文件(xxx.dts)来描述,而不是在arch/arm下以.c 或 .h 文件来定义。Linux内核是一个通用的内核,在启动过程中,在通过解析设备树中的硬件资源来初始化某个具体的平台。 引入设备树后,很多和内核驱动开发的工作也发生了变化:以往驱动工程师关注的头文件宏定义、寄存器定义,现在这些基本上不用关注,关注的重点则转向了如何根据硬件平台去配置和修改设备树文件。很多驱动的编程接口也发生了变化,开始慢慢使用device tree提供的编程接口去开发驱动。本期课程主要面向嵌入式开发人员,分享Linux下驱动开发所需要的设备树知识和必备技能

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧