software sistemas sistema raspberry programas para operativos operativo mejor instalar linux linux-kernel raspberry-pi driver gpio

linux - sistemas - ¿Por qué hay `gpio_request` en lugar de` request_region` en el driver raspberry pi?



sistemas operativos para raspberry pi 3 2018 (1)

En el libro LDD3 , si un controlador desea controlar los pines de la CPU, debe llamar a la función request_region() para declarar el uso de los puertos.

Sin embargo, cuando quiero implementar un módulo de controlador simple en mi Raspberry Pi, encontré en este ejemplo que la solicitud de puertos está implementada por la función gpio_request() .

¿Por qué y cuándo necesitamos usar gpio_request() lugar de request_region() ? Y, ¿cuál es la finalidad de la diferencia para estas dos funciones?

Por cierto: busqué LDD3 página por página, pero no puedo encontrar ninguna pista sobre GPIO ... ¿por qué no hay ninguna presentación de GPIO ? ¿Es por la versión 2.6 del kernel?


En el libro LDD3, si un controlador desea controlar los pines de la CPU, debe llamar a la función request_region () para declarar el uso de los puertos.

Primero, la palabra "puerto" es ambigua y requiere contexto. El puerto puede hacer referencia a un conector físico (por ejemplo, un puerto USB) o una conexión lógica (por ejemplo, un puerto TCP).

Su comprensión de request_region () es defectuosa. Esa rutina es para la administración del espacio de direcciones de E / S. Su pregunta está etiquetada con raspberry-p1 que utiliza un procesador ARM y no tiene espacio de direcciones de E / S para administrar. Los procesadores ARM usan registros de dispositivos mapeados en memoria. Utilizaría request_mem_region () en un controlador de dispositivo para las direcciones de memoria del bloque de registro de ese periférico.

Cada GPIO está controlado por una posición de bit en uno o más registros de control. Esos registros serían manejados por un subsistema general de GPIO. (También hay un controlador de control de pin de capa más baja (más cercano al HW) para los pines multiplexados, es decir, pines que pueden asignarse a un dispositivo periférico o utilizarse como GPIO).

El controlador para el subsistema GPIO (o control de pin) debe realizar una request_mem_region () para las direcciones de memoria de los registros de control GPIO del SoC. Un gpio_request () sería la gestión de un pin individual que está subordinado a la gestión de los registros.

Tenga en cuenta que el uso de request_mem_region () y gpio_request () no son mutuamente excluyentes en un controlador de dispositivo. Por ejemplo, el controlador para un controlador USB solicitaría_mem_region () las direcciones de memoria para sus registros de control. También puede tener gpio_request () para pin (s) que controlan la potencia de los conectores USB (suponiendo que así es como se controla la potencia con lógica externa al controlador).

¿Por qué no hay ninguna presentación de GPIO? ¿Es por la versión 2.6 del kernel?

Las convenciones para usar GPIO en Linux aparecieron en Documentation / gpio.h en 2007 con la versión 2.6.22. Soporte genérico (es decir, estandarizado en lugar de específico de la plataforma) GPIO apareció en el núcleo de Linux varios años después con la versión 2.6.3x (?). Antes de eso (e incluso después), cada plataforma (por ejemplo, el fabricante de SoC) tenía su propio conjunto de rutinas para acceder (y tal vez administrar) los GPIO.

LDD3 afirma ser actual a partir del kernel 2.6.10. También ese libro puede estar centrado en x86 (ya que Linux tiene orígenes x86), y los procesadores x86 normalmente no tienen GPIO.