MIPS 平台下 I/O 端口的读写--以龙芯为例



MIPS 下,I/O 端口是直接映射到地址空间的,不像x86下有专用的 I/O 空间,使用专用的 in/out 指令访问之。

故而 MIPS 上访问 I/O 端口直接使用访存指令访问对应的地址即可。

但是各种控制器的寄存器映射到地址空间的何处,具体的平台就不一样了。下面以龙芯2E为例说明之。


龙芯2E 下使用 C语言读写 8259A 的 0x20 端口

char *p_port;
char data;

p_port = (char *)(0xbfd00000+0x20);   /* 64位模式下为 0xffff ffff bfd0 0000 */

data = *p_port;     /* read io port */

data |= 0x1;

*p_port = data;     /* write io port */


现龙芯2E的IO基地址映射在0xbfd00000(64位为0xffffffffbfd00000)处,为了和IBM PC的IO端口地址空间保持某种程度上的对应,常用的控制器的IO端口地址只要在原来的基础上加上这个基地址就可以了。

如8042 键盘控制器的0x60,0x61,0x64端口,CMOS RTC/RAM(兼容MC146818)的 0x70,0x71端口,8259a的0x20,0x21,0xa0,0xa1等等,现在loongson2e下访问之,只要加上0xbfd00000, 就是其IO地址。读写端口方式与内存读写方式一致。

另外,由于龙芯2E下IO地址空间映射在KSEG1(0xA0000000~0xC0000000),访问该地址空间需要在核心态下。


PS: 北桥bonito内的一些控制器映射在0xBFE00000处。

如 0xBFE00000+0x130 处映射为bonito之INTENSET寄存器

0xBFE00000+0x134 处映射为bonito之INTENCLR寄存器

0xBFE00000+0x138 处映射为bonito之INTEN寄存器

0xBFE00000+0x13c 处映射为bonito之INTISR寄存器

尚有INTEDGE(映射到0xBFE00124)、INTSTEER(映射到0xBFE00128)、INTPOL(映射到0xBFE0012C)

详细用途参见: 《龙芯2E体系结构之异常、中断》




### 龙芯2K设备上的PWM输入配置 对于龙芯2K系列处理器,在其上配置PWM输入涉及到多个方面的工作,包括但不限于硬件寄存器的操作以及相应的软件驱动编写。针对具体的PWM输入配置过程,可以参考如下内容: #### 寄存器操作层面 在某些情况下,为了启用特定功能如PWM输入,可能需要直接操控GPIO对应的特殊功能选择寄存器来设定引脚的功能模式。如,在迅为龙芯2K1000开发板中,通过设置地址`0xbfe10420`处的第12位能够将指定的GPIO配置成为PWM0输出端口[^3]。 然而值得注意的是上述子描述的是PWM输出而非输入的情况;对于PWM输入而言,则需依据具体芯片手册找到负责接收脉宽调制信号的相关控制寄存器,并按照需求调整这些寄存器中的相应字段以完成初始化工作。 #### 软件驱动层面上 当考虑基于Linux系统的环境时,如果希望支持PWM输入特性,则通常会涉及对内核源码里的Device Tree文件做出适当更改以便正确描述硬件连接关系,并且确保所使用的内核版本包含了必要的PWM子系统框架及其底层实现代码。此外还需要确认是否已加载了合适的平台级或通用型PWM驱动模块。 考虑到龙芯2K架构下的特殊情况,比如存在专门面向该系列CPU优化过的PWM驱动程序(如Loongson2k PWM support),那么应当优先尝试开启并测试这类专用的支持选项而不是仅依赖于标准MIPS体系结构所提供的基础服务[^1]。 至于实际编程接口部分,现代Linux发行版往往提供了sysfs接口让用户空间应用程序可以直接访问PWM资源而无需深入理解复杂的内部机制。这意味着开发者可以通过简单的文件读写方式轻松获取当前占空比周期等参数值。 ```bash echo 0 > /sys/class/pwm/pwmchip0/export # 启用PWM通道0 echo mode_input > /sys/class/pwm/pwmchip0/pwm0/enable # 切换至输入模式(假设此命令有效) cat /sys/class/pwm/pwmchip0/pwm0/duty_cycle # 查询当前占空比 ``` 以上示仅供参考,因为并非所有系统都完全遵循相同的路径命名约定,而且并不是所有的PWM控制器都能被配置成真正的“输入”状态——这取决于物理硬件设计本身能否允许双向通信能力的存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值