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

Я учусь писать встроенный драйвер Linux, и решил запустить несколько GPIO, чтобы убедиться, что я понимаю книгу(LDD3, глава 9.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()?

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

Ответы на вопрос(2)

Ваш ответ на вопрос