когда использовать platform_driver поверх I2C? - PullRequest
1 голос
/ 21 ноября 2011

Я ищу код Устройство xxx - это микросхема, использующая I2C для связи. Как-то это написано с помощью устройства платформы. Для связи с IC он использует «microp_i2c_write ()» (пожалуйста, обратитесь к следующей функции write_xxx_register ()). Я думаю, что этот код трудно поддерживать на другой платформе. это навигационный продукт.

Вопрос: 1. Я считаю, что мой вопрос заключается в том, как включить клиент struct i2c_client *? в этот сценарий? Так проще ли портировать на разные ядра linux / andriod? 2. Почему и когда предпочтительнее platform_driver? какая-то конкретная причина?

static struct platform_driver xxx_device_driver = {
.probe    = xxx_probe,
.remove   = __devexit_p(xxx_remove),
.driver   = {
    .name   = XXX_NAME,
    .owner  = THIS_MODULE,
}
};

static void write_xxx_register(uint8_t reg, uint8_t val)
{
uint8_t data[BURST_DATA_SIZE];

data[0] = reg;
data[1] = val;
microp_i2c_write(OJ_REGISTER_WRITE, data, 2);
 }

static int __devinit XXX_probe(struct platform_device *pdev)
{
struct XXX_platform_data *oj = pdev->dev.platform_data;
int err;
int i;

err = -ENOMEM;
my_oj = oj;

INIT_WORK(&oj->work, XXX_work_func);

XXX__wq = create_singlethread_workqueue("XXX__wq");
if (!XXX__wq) {
    err = -ENOMEM;
    goto fail;
}

oj->input_dev = input_allocate_device();
if (!oj->input_dev) {
    printk(KERN_ERR "Unable to allocate device for OJ\n");
    err = -ENOMEM;
    goto fail;
}

oj->input_dev->name = "XXX_-oj";
oj->input_dev->evbit[0] = BIT_MASK(EV_KEY) |  BIT_MASK(EV_ABS)| BIT_MASK(EV_SYN )|BIT_MASK(EV_REL) ;
input_set_capability(oj->input_dev, EV_KEY, BTN_MOUSE);
input_set_capability(oj->input_dev, EV_KEY, BTN_TOUCH);
oj->input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
oj->input_dev->absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y);
input_set_abs_params(oj->input_dev, ABS_X, 8, 4024-8 , 0, 0);
input_set_abs_params(oj->input_dev, ABS_Y, 41, 6604-41, 0, 0);
input_set_abs_params(oj->input_dev, ABS_PRESSURE, 0, 255, 0, 0);
input_set_abs_params(oj->input_dev, ABS_TOOL_WIDTH, 0, 15, 0, 0);
input_set_abs_params(oj->input_dev, ABS_HAT0X, 8, 4024-8, 0, 0);
input_set_abs_params(oj->input_dev, ABS_HAT0Y, 41, 6604-41, 0, 0);
input_set_abs_params(oj->input_dev, ABS_MT_POSITION_X, 8, 4024-8, 0, 0);
input_set_abs_params(oj->input_dev, ABS_MT_POSITION_Y, 41, 6604-41, 0, 0);
input_set_abs_params(oj->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
input_set_abs_params(oj->input_dev, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0);

set_bit(EV_SYN, oj->input_dev->evbit);
set_bit(EV_KEY, oj->input_dev->evbit);
set_bit(BTN_TOUCH, oj->input_dev->keybit);
set_bit(EV_ABS, oj->input_dev->evbit);

for(i = 0; i < ARRAY_SIZE(keymap); i++)
    set_bit(keymap[i], oj->input_dev->keybit);

err = input_register_device(oj->input_dev);
if (err) {
    printk(KERN_ERR "Unable to register %s input device\n", oj->input_dev->name);
    goto fail;
}

err = request_irq(my_oj->irq, XXX_irq_handler,
          IRQF_TRIGGER_NONE, XXX_NAME, oj);
if (err < 0) {
    err = -ENOMEM;
    printk(KERN_ERR "request_irq failed\n");
    goto fail;
}


normal_th = my_oj->normal_th;
xy_ratio = my_oj->xy_ratio;
interval = my_oj->interval;
polling_delay = my_oj->mdelay_time;
debugflag = my_oj->debugflag;
ap_code = my_oj->ap_code;

printk(KERN_INFO "driver loaded\n");
return 0;

}

1 Ответ

1 голос
/ 21 ноября 2011

Если ваше устройство подключено к шине I2C, вам следует зарегистрировать структуру i2c_driver, а не структуру platform_driver.grep для i2C_driver в драйверах / ввод / сенсорный экран / например.

...