Я новичок в программировании ядра и теперь пытаюсь записать некоторые значения в 32-битный регистр GPIO в драйвере устройства. Ввод/вывод выполняется 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)
и ioremap()
.
Итак, мои вопросы:
- Правильно ли я сопоставил биты
[0:4]
с TIMER_CON_ADDR? - Если нет, то как мне правильно их сопоставить?
- После того, как я правильно сопоставил 4 бита, как мне использовать любую из функций
write(1|w|b)
для записи битов (0100
) в TIMER_CON_ADDR в правильном порядке? - Что делает
write(l|w|b)
под капотом для записи битов? - Есть ли какая-либо информация, которую я пропустил / ошибся?
Спасибо за вашу помощь заранее.
iounmap()
вызов. В драйверах все вышеперечисленное делается совсем по-другому, хотя и с использованием тех жеwritel()
,iomap()
/iounmap()
и им подобных. - person 0andriy   schedule 06.04.2017