Что на самом деле делает request_mem_region () и когда это необходимо?

Я изучаю написание встроенного драйвера для Linux, и решил запустить несколько GPIO, чтобы убедиться, что я понимаю книгу (LDD3, chap9.4.1) правильно.

Я могу контролировать правильные контакты GPIO, как и предполагалось (делая его высоким и низким, я проверял с помощью мультиметра); тем не менее, я протестировал 2 части кода, один с request_mem_region () и без него. Я ожидание того, что без него, потерпит неудачу, но оба работают нормально.

Код с request_mem_region :

if( request_mem_region( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF,DEVICE_NAME ) == NULL )
  {
    printk( KERN_ALERT
            "GPIO_140_141_conf_phys error:%s: unable to obtain I/O memory address 0x%08llX\n",
            DEVICE_NAME, PIN3_CONF_PHYS );

    return -EBUSY;
  }

pin3_conf = (u32)ioremap( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin4_conf = (u32)ioremap( PIN4_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin5_conf = (u32)ioremap( PIN5_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin6_conf = (u32)ioremap( PIN6_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
//-----------------------------------------------------------------
if( request_mem_region( GPIO_BANK5_PHYS, MAPPED_SIZE_GPIO_5,DEVICE_NAME ) == NULL )
  {
    printk( KERN_ALERT
            "error:%s: unable to obtain I/O memory address 0x%08llX\n",
            DEVICE_NAME, GPIO_BANK5_PHYS );

    return -EBUSY;
  }

gpio_virt = (u32)ioremap( GPIO_BANK5_PHYS, MAPPED_SIZE_GPIO_5 );

//some iowrite32() functions continue...

Код без request_mem_region () :

pin3_conf = (u32)ioremap( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin4_conf = (u32)ioremap( PIN4_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin5_conf = (u32)ioremap( PIN5_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin6_conf = (u32)ioremap( PIN6_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
gpio_virt = (u32)ioremap( GPIO_BANK5_PHYS, MAPPED_SIZE_GPIO_5 );
//some iowrite32() functions continue...

Единственное различие, которое я могу наблюдать в обоих случаях, - это результат выполнения cat / proc / iomem , тот, у которого есть request_mem_region () , отобразит дополнительную строку, показывающую 49056000-49056097: GPIO3 .

У меня вопрос: зачем нужен request_mem_region () , поскольку я все еще могу связываться с аппаратным адресом только с помощью ioremap () ? Итак, когда нам действительно нужно использовать request_mem_region () ?

Спасибо за любые ответы!

23
задан caf 7 October 2011 в 02:19
поделиться