Como eu sei qual opção de configuração do kernel ativou meu driver?

5

TL; DR:
Quando eu estava tentando compilar um driver para o dispositivo USB DAQ eu reconfigurei o kernel. O driver se recusou a compilar no kernel padrão da distro, mas tudo funciona com o meu kernel.

O driver consiste em 2 módulos do kernel. Eu sei quais opções eu mudei, mas quero saber qual opção de configuração específica ativou meu driver. Existe alguma maneira de descobrir isso sem tentar (configurar e compilar o kernel) todas as combinações possíveis das opções?

Mais longa história:
Eu tenho um dispositivo Advantech USB-4702 DAQ que vem com um driver para várias distros, por exemplo. openSUSE 11.4. Ele deve ser compilado a partir do código fonte e compilado bem nas distribuições suportadas (tentei o openSUSE 11.4 32bit com o kernel 2.6.37.6-24-desktop).

Quando eu estava tentando fazer funcionar sob o SLES 11 SP 3 (64 bits, kernel 3.0.76-0.11-default), recebi erros de compilação. Um deles foi causado por este trecho na origem:

#ifndef CONFIG_USB
#  error "This driver needs to have USB support."
#endif

Então eu dei uma olhada nas opções de configuração do kernel em execução (de /proc/config.gz) e encontrei o CONFIG_USB para ser ativado (eu acho que não seria capaz de usar meu teclado e mouse USB se ele estivesse desativado ). Então comecei a brincar com a configuração do kernel e habilitei (alguns como módulos) alguns deles. Eu compilei o kernel, instalei, reiniciei. Em seguida, o driver compilado sem erros ou avisos e eu posso usar o dispositivo agora.

A questão é, como posso descobrir qual opção específica "ativou" a compilação do driver? Eu sei quais opções foram alteradas, mas não quero ativar nada que não seja necessário para o motorista. E eu não quero passar pela configuração e compilação do kernel com todas as combinações possíveis das opções.

    
por Peter Kovac 05.09.2013 / 08:44

3 respostas

1

Após mais algumas experiências, posso confirmar minha reivindicação em um dos meus comentários: a opção CONFIG_USB precisa ter o valor Y ; m é "insuficiente". Aliás, o kernel no openSUSE 11.4 possui Y por padrão e o kernel no SLES11SP3 tem m .

É uma pena que a mensagem de erro não seja clara.

Uma maneira fácil de configurá-lo é por meio de make menuonfig e, em seguida, selecionando Y para a opção Suporte para USB no host em Drivers de dispositivo - > Suporte USB .

    
por 05.09.2013 / 16:55
4

Eu assumo que o driver em questão é compilado como um módulo. Se você também criou os pré-requisitos como módulos, poderá encontrá-los facilmente. Todos os módulos e suas opções correspondentes são anotados nos makefiles do kernel. Então você pode apenas usar o nome do módulo.

Mas primeiro, você precisa descobrir de quais módulos seu driver depende. Portanto, emita um lsmod e pesquise seu driver, especialmente na coluna Used by . Eu, por exemplo, uso o driver rt2800usb .

$ lsmod | grep rt2800usb
rt2800usb  15392   0  
rt2x00usb  8306    1  rt2800usb
rt2800lib  59262   1  rt2800usb
rt2x00lib  34431   3  rt2x00usb,rt2800lib,rt2800usb
usbcore    146570  7  rt2x00usb,rt2800usb

Isso me diz que meu driver precisa dos módulos rt2x00usb , rt2800lib , rt2x00lib e usbcore . Agora eu procuro os Makefiles para eles. Observe o espaço inicial e o .o nas sequências de pesquisa

$ fgrep -r --include=Makefile ' usbcore.o'
drivers/usb/core/Makefile:obj-$(CONFIG_USB) += usbcore.o

$ grep -Pr --include=Makefile ' rt2(x|8)00(usb|lib)\.o'
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2X00_LIB) += rt2x00lib.o
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2X00_LIB_USB) += rt2x00usb.o
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2800_LIB) += rt2800lib.o
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2800USB) += rt2800usb.o

E lá temos as opções de configuração necessárias para construir esses módulos. Se você não puder encontrar instantaneamente o culpado, tente ir mais fundo e procure pelas dependências das dependências ... Se você puder adivinhar o nome, isso pode ajudar também para objetos internos (ao contrário dos módulos).

(Todas as saídas de linha de comando nesta postagem foram levemente condensadas e reformatadas para melhor legibilidade).

    
por 05.09.2013 / 17:19
0

As informações e perguntas que você vê quando usa make config (ou make menuconfig ou make xconfig ) vêm de arquivos Kconfig na árvore de fontes. Há muitos deles; tente find . -name Kconfig do topo da árvore e dê uma olhada em um.

Aqui está um exemplo de 3.10.1 / drivers / misc / Kconfig:

config AD525X_DPOT_I2C
        tristate "support I2C bus connection"
        depends on AD525X_DPOT && I2C
        help
          Say Y here if you have a digital potentiometers hooked to an I2C bus.

          To compile this driver as a module, choose M here: the
          module will be called ad525x_dpot-i2c.

Há alguma discussão sobre os campos aqui , mas não é difícil ver o que está acontecendo se você usou menuconfig o suficiente; uma versão disso é geralmente dada com a "ajuda", e se você usar a função de busca (pressione / ) os resultados retornados também informam isso. Por exemplo, de make menuconfig pesquisando "AD525":

│ Symbol: AD525X_DPOT_I2C [=n]                                                                                                                                         │  
│ Type  : tristate                                                                                                                                                     │  
│ Prompt: support I2C bus connection                                                                                                                                   │  
│   Location:                                                                                                                                                          │  
│     -> Device Drivers                                                                                                                                                │  
│       -> Misc devices                                                                                                                                                │  
│ (1)     -> Analog Devices Digital Potentiometers (AD525X_DPOT [=n])                                                                                                  │  
│   Defined at drivers/misc/Kconfig:34                                                                                                                                 │  
│   Depends on: AD525X_DPOT [=n] && I2C [=y]   

"Tristate" indica que as opções são sim / não / módulo, também há os tipos "bool" e "int". Observe que "Depende de" aqui (que corresponde à origem do arquivo Kconfig) inclui uma indicação se eu tenho as dependências corretas selecionadas ( [=n] [=y] ). Esta é uma informação bastante útil, pois algumas coisas não aparecerão como escolhas até que você selecione os pré-requisitos corretos.

O ideal é que as pessoas que escreveram seu módulo incluam dados Kconfig para que possam ser inseridos na árvore de origem e configurados por meios normais. Dê uma olhada nisso e você poderá rastrear as dependências.

    
por 05.09.2013 / 10:57