Лучший способ получить доступ к периферийным устройствам, отображаемым в памяти, - использовать ядро ioremap
и его друзей.
Сначала объявите, что вы хотите использовать определенную область памяти для своего периферийного устройства:
struct resource *res = request_mem_region(0x50000000, region_size, "at91");
Когда вы выгрузите свой драйвер, вы захотите освободить эту область памяти.
release_mem_region(0x50000000, region_size);
Теперь вы можете переназначить регион ввода / вывода перед использованием.
void *ptr = ioremap(0x50000000, region_size);
Если вы хотите предотвратить кэширование этих регистров, используйте ioremap_nocache
. Вы также можете переназначить субрегион области памяти вашего устройства, только если используете только эту часть.
Теперь, когда у вас есть область iomapped, вы можете выполнять ввод-вывод в этой памяти.
iowrite8(value, (char *)ptr + reg);
unsigned int val = ioread8((char *)ptr + reg);
Как только вы закончите чтение и запись в эту область памяти, вы можете удалить ее из карты.
iounmap(ptr);
Надеюсь, это поможет. Я бы порекомендовал прочитать (или хотя бы использовать в качестве справки) Драйверы устройств Linux, 3-е издание , которые можно читать онлайн бесплатно.