2010-06-10 9 views
6

Soy un novato en la escritura del controlador del dispositivo Linux, perdóneme si algo es estúpido y mi inglés pobre ^^
Estoy intentando escribir un controlador para un panel táctil, que se comunica con CPU a través de I2C.
Intenté agregar un controlador de dispositivo a la plataforma de Linux, y el registro fue exitoso, es decir, el controlador se cargó, pero la función de la sonda no se activó.Problema de la sonda al escribir un controlador de dispositivo I2C

Arriba está el código parcial del controlador que escribí.

static int i2c_ts_probe(struct i2c_client *client, const struct i2c_device_id * id) { 
    /* ... */ 
} 

static int i2c_ts_remove(struct i2c_client *client) { 
    /* ... */ 
} 

static const struct i2c_device_id i2c_ts_id[] = { 
    {"Capacitive TS", 0}, 
    { } 
}; 
MODULE_DEVICE_TABLE(i2c, i2c_ts_id); 

static struct i2c_driver i2c_ts = { 
    .id_table = i2c_ts_id, 
    .probe = i2c_ts_probe, 
    .remove = i1c_ts_remobe, 
    .driver = { 
     .name = "i2c_ts", 
    }, 
}; 

static int __init i2c_ts_init(void) { 
    return i2c_add_driver(&i2c_ts); 
} 

static int __init i2c_ts_exit(void) { 
    return i2c_del_driver(&i2c_ts); 
} 

module_init(i2c_ts_init); 
module_exit(i2c_ts_exit); 

código anterior es parcial en la plataforma (/kernel/arch/arm/mach-pxa/saarb.c) que se utiliza para registrar el dispositivo I2C.

static struct i2c_board_info i2c_board_info_ts[] = { 
    { 
     .type = i2c_ts, 
     .irq = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO0)), 
    }, 
}; 

static void __init saarb_init(void) { 
    ... 
    i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info_ts)); 
    ... 
} 

cualquier sugerencia y comentario serán bienvenidos, gracias ^^

+1

es i2c_ts_id ¿correcto? –

Respuesta

7

Para que el modelo de dispositivo Linux/conductor puede sondear su controlador, tiene que haber un dispositivo que solicita que: esto se logra mediante la comparación del nombre del controlador ("i2c_ts") y el tipo de dispositivo en la estructura i2c_board_info. En su caso, supongo que el tipo no es igual a "i2c_ts".

Así que le sugiero que utilice la macro I2C_BOARD_INFO para crear instancias de su dispositivo, como se documenta en Documentation/i2c/instantiating_devices.

static struct i2c_board_info i2c_board_info_ts[] = { 
    { 
     I2C_BOARD_INFO("i2c_ts", 0x12), 
     .irq = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO0)), 
    }, 
}; 

static void __init saarb_init(void) { 
    ... 
    i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info_ts)); 
    ... 
} 

Tampoco le ha dado una dirección a su dispositivo, y I2C_BOARD_INFO lo necesita. Lea la hoja de datos de su pantalla táctil para saber cuál es esa dirección.

Finalmente, como se sugirió anteriormente, asegúrese de que i2c_ts_id sea correcto. No estoy seguro de que desempeñe un papel en el mecanismo de asociación dispositivo/módulo en el kernel, pero diría que es mucho menos confuso, ya que todos comparten el mismo nombre.

1

El método de la sonda solo se ejecutará cuando el dispositivo coincida con el nombre del controlador. Como mencionó el nombre del controlador como 'i2c_ts', compruebe el nombre del dispositivo en el árbol de su dispositivo. Ambos deben ser iguales.

Cuestiones relacionadas