device driver e ioctl [RESOLVIDO]

1. device driver e ioctl [RESOLVIDO]

Lucas
lucaslogan2

(usa Kurumin)

Enviado em 09/04/2008 - 16:32h

Olá pessoal,
estou tentando desenvolver algumas rotinas em C para uma aplicação em específico para uma placa de captura de vídeo.
Atualmente utilizo o Ubuntu em conjunto com um software chamado zoneminder para capturar as imagens.
o linux reconheceu a placa e instalou o driver etc etc (tanto que o software zoneminder exibe as imagens)

a minha dificuldade esta sendo em desenvolver uma aplicação que controle uma placa de IO que é junto com a placa de captura.

no SDK (se é que se pode chamar aquilo de SDK) fala apenas para que sejam chamadas as rotinas abaixo, variando a struct iei_gpio que é passada na função (conforme abaixo)

#define VIDIOC_IEI_SET_GPIO _IOW('v', 204, struct iei_gpio)

#define VIDIOC_IEI_GET_GPIO _IOR('v', 205, struct iei_gpio)

pesquisando descobri que o _IOW é uma função que interage diretamente com o Kernel e é relacionada ao ioctl();

mesmo seguindo esses passos, não obtenho exito na chamada então gostaria de saber.

1-) Como funciona a instalação de uma placa junto ao linux? Ele carrega o device driver relativo e é necessário interfacear com ele? como faço para fazer uma chamada do mesmo?

2-) como as rotinas de ioctl() são utilizadas? e qual a relaçao com o _IOW ou _IOR ?

3-) é possível que eu tenha de modificar o driver da placa para ativar esse recurso da placa de IO?


  


2. MELHOR RESPOSTA

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 24/01/2013 - 12:27h

Tente o blog do sergio prado.

Ele trabalha com device drivers e aprendi alguma coisa lendo o blog dele:

http://sergioprado.org/

Espero ajudar

3. Re: device driver e ioctl [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 24/01/2013 - 15:22h

Não conheço esse dispositivo de que você está falando, mas tipicamente ao driver da placa deve estar associada uma entrada no diretório /dev, que o seu programa deve abrir, por meio da chamada open(), para se comunicar com o dispositivo, recebendo um file descriptor (fd).

Trocas de dados representáveis como seqüências de bytes tipicamente são feitas por meio das chamadas read() e write() em cima desse fd. Contudo, a chamada ioctl() é necessária para interagir com dispositvos que não necessariamente trocam dados como uma série de bytes ou blocos de bytes ou que têm aspectos de controle fora do fluxo normal de dados.

_OIR e _IOW são macros que servem para definir operações que podem ser usadas com a chamada ioctl. O resultado daqueles defines que você mostrou são números de 32 bits que definem para o sistema, entre outras coisas, se a operação é de leitura ou escrita, e quantos bytes serão transferidos de/para o usuário a cada operação. Esses números são constantes e têm contrapartida no código do device driver, que, ao reconhecê-los no momento em que o usuário chama ioctl() em cima do fd, obtém ou preenche os dados nos demais argumentos.

Num programa em C, funciona mais ou menos assim.

int fd;
struct iei_gpio gpio_data;

fd=open("/dev/some_driver", O_RDWR, 0666);
result=ioctl(fd, VIDIOC_IEI_GET_GPIO, &gpio_data);
if(result!=-1){
/* ioctl() bem sucedida. Usa os dados recebidos em gpio_data. */
if(gpio_data.some_field==some_value){ /* ... */ }
}


Lembre-se que é possível que a entrada criada dentro de /dev possivelmente terá acesso restrito a root ou algum grupo de usuários específico. E talvez até mesmo você tenha de criá-la na mão (com mknod) se o driver não for suficientemente esperto.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts