我是内核编程的新手,现在尝试将一些值写入设备驱动程序中的 32 位 GPIO 寄存器。I/O 被ioremap()
编辑到一个内存地址。问题是,我不知道writel()
//如何将writeb()
位writew()
写入地址。
供应商文件说登记在上0xE5200000
。我必须写入的位是[0:3]
位,并将剩余的 28 位([4:31]
位)保留为零。
这是迄今为止我编写的设备驱动程序代码的一部分:
#define TCON_ADDR 0xE250000 // The address as provided by the vendor
static void *TIMER_CON_ADDR;
// I have to map and write to the address when the device is opened
static int on_dev_open(struct inode *inode, struct file *file) {
unsigned int data;
TIMER_CON_ADDR = ioremap(TCON_ADDR, 4); // Map the [0:4] bits to TIMER_CON_ADDR
data = 4; // 0100 in binary
writel(data, TIMER_CON_ADDR); // Write 0100 to TIMER_CON_ADDR
return 0;
}
上面的代码对你们来说可能是彻头彻尾的胡言乱语,但我不熟悉write(l|w|b)
and ioremap()
。
所以我的问题是:
- 我是否正确地将这些
[0:4]
位映射到 TIMER_CON_ADDR? - 如果没有,我该如何正确映射它们?
- 正确映射 4 位后,如何使用任何
write(1|w|b)
函数以正确的顺序将位 (0100
) 写入 TIMER_CON_ADDR? - 在引擎盖下做什么
write(l|w|b)
来写入位? - 有没有我错过/弄错的信息?
感谢您提前提供的所有帮助。