readb(), readw(), readl(), __raw_readl

writel() 往内存映射的 I/O 空间上写数据,

wirtel()   I/O 上写入 32 位数据 (4字节)。

原型:引用#include <asm/io.h> 

void writel (unsigned char data , unsigned short addr )


readl() 从内存映射的 I/O 空间读取数据,

readl 从 I/O 读取 32 位数据 ( 4 字节 )。

原型:#include <asm/io.h> 

unsigned char readl (unsigned int addr )

注:变量    addr  是 I/O 地址。

返回值 : 从 I/O 空间读取的数值。


readb(), readw(), readl() 宏函数

功能
从内存映射的 I/O 空间读取数据。

readb  从 I/O 读取 8 位数据 ( 1 字节 );

readw 从 I/O 读取 16 位数据 ( 2 字节 );

readl 从 I/O 读取 32 位数据 ( 4 字节 )。

原型
#include <asm/io.h>

unsigned char readb (unsigned int addr )
unsigned char readw (unsigned int addr )
unsigned char readl (unsigned int addr )
       
变量

addr    I/O 地址。


返回值: 从 I/O 空间读取的数值。


__raw_readl和__raw_writel

Linux对I/O的操作都定义在asm/io.h中,相应的在arm平台下,就在asm-arm/io.h中。

#define __raw_readl(a)   (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a))
#define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a) = (v))

在include\linux\compiler.h中:

#ifdef __CHECKER__
……
extern void __chk_io_ptr(void __iomem *);
#else
……
# define __chk_io_ptr(x) (void)0
……
#endif

__raw_readl(a)展开是:((void)0, *(volatile unsigned int _force *)(a))。在定义了__CHECKER__的时候先调用__chk_io_ptr检查该地址,否则__chk_io_ptr什么也不做,*(volatile unsigned int _force *)(a)就是返回地址为a处的值。(void)xx的做法有时候是有用的,例如编译器打开了检查未使用的参数的时候需要将没有用到的参数这么弄一下才能编译通过。

CPU对I/O的物理地址的编程方式有两种:一种是I/O映射,一种是内存映射。__raw_readl和__raw_writel等是原始的操作I/O的方法,由此派生出来的操作方法有:inb、outb、_memcpy_fromio、readb、writeb、ioread8、iowrite8等。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是一个简单的GPIO控制函数,用于设置GPIO的输入/输出方向以及设置GPIO的值。 首先,让我们逐个解释每个函数的作用: 1. `gpio_direction_output(unsigned gpio, int value)`函数用于将指定的GPIO设置为输出方向,并设置输出的值。 - `gpio`参数表示要设置的GPIO引脚号。 - `value`参数表示要设置的输出值,非零值表示高电平,零值表示低电平。 - `gpio_request(gpio)`函数用于请求并配置指定的GPIO资源。 - `readl(GPIO_MODREG(gpio)) | (1 << GPIO_OFFSET(gpio))`用于将指定GPIO引脚的模式寄存器相应位设置为输出模式。 - `readl(GPIO_WDATAREG(gpio)) | (1 << GPIO_OFFSET(gpio))`用于将指定GPIO引脚的数据寄存器相应位设置为高电平。 - `readl(GPIO_WDATAREG(gpio)) & ~(1 << GPIO_OFFSET(gpio))`用于将指定GPIO引脚的数据寄存器相应位设置为低电平。 2. `gpio_direction_input(unsigned gpio)`函数用于将指定的GPIO设置为输入方向。 - `gpio`参数表示要设置的GPIO引脚号。 - `gpio_request(gpio)`函数用于请求并配置指定的GPIO资源。 - `readl(GPIO_MODREG(gpio)) & ~(1 << GPIO_OFFSET(gpio))`用于将指定GPIO引脚的模式寄存器相应位设置为输入模式。 3. `gpio_set_value(unsigned gpio, int value)`函数用于设置指定GPIO的值(仅适用于输出方向的GPIO)。 - `gpio`参数表示要设置的GPIO引脚号。 - `value`参数表示要设置的输出值,非零值表示高电平,零值表示低电平。 - `readl(GPIO_WDATAREG(gpio)) | (1 << GPIO_OFFSET(gpio))`用于将指定GPIO引脚的数据寄存器相应位设置为高电平。 - `readl(GPIO_WDATAREG(gpio)) & ~(1 << GPIO_OFFSET(gpio))`用于将指定GPIO引脚的数据寄存器相应位设置为低电平。 这些函数中的`gpio_request()`、`readl()`和`writel()`等函数可能是基于特定硬件平台或操作系统的底层操作函数。为了正确使用这些函数,您需要查看相关的文档或源代码,了解它们的具体实现和使用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值