版权声明:本文为博主原创文章,转载请注明本博地址,谢谢! https://blog.csdn.net/u014443578/article/details/76790650
LINUX I2C驱动偶尔出现段错误原因之一
第一篇博客,来个好的开端。
在自己写 触摸屏 I2C 驱动程序(Linux 3.14)的时候,加载的时候会偶尔出现段错误,
我们都知道在加载驱动的时候会调用 i2c_register_Driver最终找到代码,通过 OOPS 代码回溯知道其最终会调用 of_driver_match_device 如下
static inline int of_driver_match_device(struct device *dev,
const struct device_driver *drv)
{
return of_match_device(drv->of_match_table, dev) != NULL;
}
const struct of_device_id *of_match_device(const struct of_device_id *matches,
const struct device *dev)
{
if ((!matches) || (!dev->of_node))
return NULL;
return of_match_node(matches, dev->of_node);
}
match = __of_match_node(matches, node);
for (; matches->name[0] || matches->type[0] || matches->compatible[0]; matches++) {
}
static const struct of_device_id gt818_of_match[] = {
{ .compatible = "fs4412,gt818", },
{},
};
.of_match_table = gt818_of_match,
驱动的 of_match_table 传入,加载时,进行匹配,如果没有空{} ;会造成越界,段错误;
所以,一开始对于 of_device_id 最后会有 {},感觉多余,但是现在来看不是多余的,为了代码安全,一定要加上
很小的一个初级知识点,不过不常见,特此记录。