Drivers de dispositivos Linux - A função de teste não é chamada, mas o driver está sendo adiado

2

Eu tenho tentado fazer com que um controlador de lata MCP2515 trabalhe em um barramento spi-gpio na árvore de dispositivos, mas a função de teste do driver MCP251x nunca parece ser realmente chamada. Estranhamente, porém, alguma função de teste em algum lugar está sendo chamada porque retorna -EPROBE_DEFER .

Eu modifiquei /drivers/base/dd.c com várias chamadas de impressão dev_dbg para descobrir de onde eu estava retornando.

link

Na linha 416 é onde a sonda do driver está sendo adiada

 else if (drv->probe) {
    ret = drv->probe(dev);
    if (ret)
        goto probe_failed;
}

Se eu adicionar uma instrução de depuração a isso, posso ver que o nome da variável drv é MCP251x, que corresponde ao driver.

dev_dbg(dev, "%s line %d ret: %d\n", drv->name, __LINE__,ret);

Então, adiciono algumas instruções de depuração à função mcp251x_can_probe do driver MCP251x link

Eu nunca vejo nenhuma das impressões de depuração da função de teste do MCP251x. Por quê? Não consigo descobrir por que essa função de teste não está sendo chamada, mas algo está conseguindo retornar -EPROBE_DEFER .

Eu não sei se há alguma função de spi probe intermediária sendo chamada que eu não conheço ou o que, mas ela nunca chega na sonda do MCP251x.

Aqui está o snippet relevante da minha árvore de dispositivos, só por precaução.

spi1{
    compatible = "spi-gpio";
    status="okay";

    #address-cells = <0x1>;
    ranges;

    gpio-sck = <&gpio0 4 0>;
    gpio-miso = <&gpio0 5 0>;
    gpio-mosi = <&gpio0 19 0>;
    cs-gpios = <&gpio0 18 1>;
    num-chipselects = <1>;

    can0: mcp2515@0 {
        compatible = "microchip,mcp2515";
        reg = <0>;
        status = "okay"; 

        clocks = <&mcp2515_clk>;
        interrupt-parent = <&gpio0>;
        interrupts = <11 0x2>; //falling edge
        spi-max-frequency = <10000000>; 
        mcp2515_clk: oscillator {
            #clock-cells = <0>;
            compatible = "fixed-clock";
            clock-frequency = <8000000>; //8MHz
        }; 
    };
};
    
por MechaMarinara 06.09.2018 / 22:23

1 resposta

0

Estou tentando obter um MCP2515 em execução em um Xilinx Zynq no Linux.

Encontrei seu post enquanto sofria exatamente do mesmo problema.

Eu estava indo exatamente na mesma rota que você e sujou o driver mpc251x com o printk esperando encontrar onde o teste falhou, mas ele não foi chamado também.

Em vez disso, a função probe no driver spi.c foi chamada para mim, a partir de dd.c.

O erro deferido foi retornado de:

link

Que no meu caso foi devido à interrupção que defini não ser encontrada.

Para mim, foi tão simples quanto o driver do controlador de interrupção não foi carregado e, portanto, a interrupção não pôde ser encontrada.

Construí o driver do controlador de interrupção e vi todos os meus printk's no driver mcp251x ganhar vida.

Espero que ajude!

Boa sorte,

Phil

    
por 07.12.2018 / 14:30