求教linux驱动开发中,如何通过datasheet对寄存器进行操作?

kinbo 2011-10-19 11:01:06
刚开始学习x86驱动,水平有限一直在坛子水下学习,有个困惑一直没找到答案,向各位高人请教,

一个南桥的驱动,我已经知道要操作的对象是哪个管脚,需要通过软件给这个管脚高低电平,
有这个芯片的datasheet.

知道这个管脚的基地址存在哪个寄存器里,和相对于这个基地址的偏移量,

但是我怎么去读这个基地址?

比如说,我要对芯片上的GPIO 15引脚进行读写,因此我需要知道GPIO Base Address,然后用baseadd+0xf,应该就是这个管脚的地址了吧?

不知道我理解的和提问的是否正确,还请各位高人指点。


...全文
335 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kinbo 2011-11-19
  • 打赏
  • 举报
回复
知道原因了,谢谢各位哈,呵呵,结贴
小皓哥 2011-10-26
  • 打赏
  • 举报
回复
也可以重新映射进虚拟空间进行操作,很简单的字符设备
kinbo 2011-10-26
  • 打赏
  • 举报
回复
有没有可能在用户空间完成操作呢?

在ldd3里第九章看到用户空间访问io端口,但是实际操作总是有问题

另外,我读pci的deviceid和vendorid,如果我一个字一个字的读,就没问题,
比如,inw(0xcfc,0)读vendor id,结果为8086
inw(0xcfc,2)读device id,结果为3b0f
inl(0xcfc),结果为3b0f8086,但是我觉得应该是80863b0f啊,为什么不是呢?

这应该不是大小头的问题吧?
Frog1228 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bjtea 的回复:]
如果是裸机运行,大体就是你说的那样。
但是,在LINUX操作系统下(windows下也是如此),操作系统屏蔽了用户与硬件的直接联系。用户为了访问硬件,需要经过硬件驱动程序;
LINUX提供了很多具体的硬件驱动程序。即使针对没有提供的部分,你也需要按照驱动程序的开发步骤,自己开发出驱动程序,而后才能访问相应的硬件。
[/Quote]
那是不是具体对这些寄存器的读写,就不是像单片机里一样对具体的地址进行读写,而是通过BSP里提供的函数操作寄存器呢?
flyskyluck521 2011-10-25
  • 打赏
  • 举报
回复
硬件资源只有操作系统才能访问,所以你必须写一个可加载模块
可以是个简单的字符设备,通过这个字符设备来控制输出高低电平
网上很多资料的,随便找个字符设备模块修改就可以了
bjtea 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kinbo 的回复:]
多谢两位,

再具体一点,如果我已经知道baseaddress,是否可以用inb和outb之类的函数在用户空间访问寄存器?

因为在linux的应用程序的头定义里,也有inb和outb的实现。
[/Quote]
这两个函数是C的标准函数,与驱动无关。
kinbo 2011-10-24
  • 打赏
  • 举报
回复
多谢两位,

再具体一点,如果我已经知道baseaddress,是否可以用inb和outb之类的函数在用户空间访问寄存器?

因为在linux的应用程序的头定义里,也有inb和outb的实现。
bjtea 2011-10-19
  • 打赏
  • 举报
回复
如果是裸机运行,大体就是你说的那样。
但是,在LINUX操作系统下(windows下也是如此),操作系统屏蔽了用户与硬件的直接联系。用户为了访问硬件,需要经过硬件驱动程序;
LINUX提供了很多具体的硬件驱动程序。即使针对没有提供的部分,你也需要按照驱动程序的开发步骤,自己开发出驱动程序,而后才能访问相应的硬件。
terminalnt 2011-10-19
  • 打赏
  • 举报
回复
楼主理解的没错。
但不同的CPU,具体硬件设计可能不完全相同。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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