Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 何时通过I2C使用平台_驱动程序?_Linux Kernel_I2c - Fatal编程技术网

Linux kernel 何时通过I2C使用平台_驱动程序?

Linux kernel 何时通过I2C使用平台_驱动程序?,linux-kernel,i2c,Linux Kernel,I2c,我正在寻找一个xxx设备的代码是一个使用I2C通信的IC。不知何故,它是使用平台设备编写的。为了与IC通信,它使用“microp_i2c_write()”(请参考以下函数write_xxx_register())。我认为这段代码很难在不同的平台上维护。这是一款导航产品 问题: 1.我想我的问题是如何包含struct i2c_client*客户端?在这种情况下?因此,通过这种方式可以更容易地移植到不同的linux/andriod内核? 2.为什么和何时首选平台驱动程序?有什么特别的原因吗 stat

我正在寻找一个xxx设备的代码是一个使用I2C通信的IC。不知何故,它是使用平台设备编写的。为了与IC通信,它使用“microp_i2c_write()”(请参考以下函数write_xxx_register())。我认为这段代码很难在不同的平台上维护。这是一款导航产品

问题: 1.我想我的问题是如何包含struct i2c_client*客户端?在这种情况下?因此,通过这种方式可以更容易地移植到不同的linux/andriod内核? 2.为什么和何时首选平台驱动程序?有什么特别的原因吗

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;

}
静态结构平台\u驱动程序xxx\u设备\u驱动程序={
.probe=xxx_探头,
.remove=\uu devexit\u p(xxx\u remove),
.司机={
.name=XXX_name,
.owner=此_模块,
}
};
静态无效写入xxx寄存器(uint8\u t reg,uint8\u t val)
{
uint8_t数据[突发数据大小];
数据[0]=reg;
数据[1]=val;
microp_i2c_写入(OJ_寄存器_写入,数据,2);
}
静态int设备XXX探头(结构平台设备*pdev)
{
结构XXX_平台_数据*oj=pdev->dev.platform_数据;
INTERR;
int i;
err=-ENOMEM;
my_oj=oj;
初始化工作(&oj->WORK,XXX\u WORK\u func);
XXX_uuwq=创建单线程工作队列(“XXX_uuwq”);
如果(!XXX_uuwq){
err=-ENOMEM;
走向失败;
}
oj->input_dev=input_allocate_device();
如果(!oj->input\u dev){
printk(KERN_ERR“无法为OJ分配设备”\n);
err=-ENOMEM;
走向失败;
}
oj->input_dev->name=“XXX_u-oj”;
oj->input_dev->evbit[0]=位掩码(EV_键)|位掩码(EV_ABS)|位掩码(EV_SYN)|位掩码(EV_REL);
输入设置功能(oj->input\u dev,EV\u键,BTN\u鼠标);
输入设置功能(oj->输入开发、EV键、BTN触摸);
oj->input_dev->relbit[0]=位掩码(REL_X)|位掩码(REL_Y);
oj->input_dev->absbit[0]=位掩码(ABS_X)|位掩码(ABS_Y);
输入设置abs参数(oj->input dev,abs X,8,4024-8,0,0);
输入设置abs参数(oj->input dev,abs Y,416604-41,0,0);
输入设置abs参数(oj->输入偏差,abs压力,0,255,0,0);
输入设置abs参数(oj->input dev,abs工具宽度,0,15,0,0);
输入设置参数(oj->input dev,abs\U HAT0X,8,4024-8,0,0);
输入设置abs参数(oj->input dev,abs_HAT0Y,416604-41,0,0);
输入设置abs参数(oj->输入开发,abs安装位置X,8,4024-8,0,0);
输入设置abs参数(oj->输入开发,abs安装位置Y,416604-41,0,0);
输入设置abs参数(oj->input dev,abs MT TOUCH MOUR,0,255,0,0);
输入设置abs参数(oj->input dev,abs MT WIDTH,0,15,0,0);
设置位(EV\U SYN,oj->input\U dev->evbit);
设置_位(EV_键,oj->input_dev->evbit);
设置位(BTN\U触摸,oj->input\u dev->keybit);
设置位(EV\U ABS,oj->input\U dev->evbit);
对于(i=0;iinput\u dev->keybit);
err=输入\寄存器\设备(oj->输入\设备);
如果(错误){
printk(KERN_ERR“无法注册%s输入设备”,oj->input_dev->name);
走向失败;
}
err=request\u irq(my\u oj->irq,XXX\u irq\u处理程序,
IRQF\u触发器\u无,XXX\u名称,oj);
如果(误差<0){
err=-ENOMEM;
printk(KERN_ERR“request_irq failed\n”);
走向失败;
}
正常时间=我的工作时间->正常时间;
xy_比率=我的_oj->xy_比率;
间隔=我的工作时间->间隔;
轮询延迟=我的工作时间->延迟时间;
debugflag=my_oj->debugflag;
应付账款代码=我的应付账款代码->应付账款代码;
printk(KERN_INFO“已加载驱动程序”\n);
返回0;
}

如果设备连接到I2C总线,则应注册I2C_驱动程序结构,而不是平台_驱动程序结构。grep用于驱动程序/输入/触摸屏/中的i2C_驱动程序。例如。

如果设备连接到i2C总线,则应注册i2C_驱动程序结构,而不是平台_驱动程序结构。例如,驱动程序/输入/触摸屏中的i2C_驱动程序的grep