c - 在 linux 中与没有微控制器的 I2C 设备通信
问题描述
如果我不想使用 Raspberry 或 Arduino,如何访问 I2C 总线与设备通信。我看到了很多覆盆子的例子和很多 Arduino 的例子,但没有一个使用下面显示的代码。下面的代码探测并使用struct i2c_driver
. 该代码还在内核中初始化module_init
:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>
#include <linux/i2c.h>
#include <linux/i2c-id.h>
#include <linux/videodev2.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/log2.h>
#include <media/v4l2-ioctl.h>
#include <media/v4l2-device.h>
#include <media/v4l2-chip-ident.h>
#include <media/v4l2-subdev.h>
#include <media/soc_camera.h>
#include "adv7403_regs.h"
#define DRIVER_NAME "adv7403"
struct adv7403_state {
struct v4l2_subdev subdev;
};
static __devinit int adv7403_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct adv7403_state *state;
int ret;
/* Check if the adapter supports the needed features */
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
return -EIO;
v4l_info(client, "chip found @ 0x%02x (%s)\n",
client->addr << 1, client->adapter->name);
state = kzalloc(sizeof(struct adv7403_state), GFP_KERNEL);
if (state == NULL) {
ret = -ENOMEM;
goto err;
}
else{
printk(KERN_ERR DRIVER_NAME ": Detected %d\n");
}
err:
printk(KERN_ERR DRIVER_NAME ": Failed to probe: %d\n", ret);
return ret;
}
static __devexit int adv7403_remove(struct i2c_client *client)
{
struct v4l2_subdev *sd = i2c_get_clientdata(client);
v4l2_device_unregister_subdev(sd);
return 0;
}
static const struct i2c_device_id adv7403_id[] = {
{DRIVER_NAME, 0},
{},
};
MODULE_DEVICE_TABLE(i2c, adv7403_id);
static struct i2c_driver adv7403_driver = {
.driver = {
.owner = THIS_MODULE,
.name = DRIVER_NAME,
},
.probe = adv7403_probe,
.remove = adv7403_remove,
.id_table = adv7403_id
};
static int __init adv7403_mod_init(void)
{
printk(" ADV7403 Video Decoder Device Driver inserted to kernel \n");
return i2c_add_driver(&adv7403_driver);
}
static void __exit adv7403_mod_exit(void)
{
printk(" ADV7403 Video Decoder Device Driver removed from kernel \n");
i2c_del_driver(&adv7403_driver);
}
module_init(adv7403_mod_init);
module_exit(adv7403_mod_exit);
解决方案
(显然)有一种方法可以使用 python 和串行端口(通过光隔离器)或并行端口来形成 I2C 总线pyi2c
我不知道图书馆是否有效 - 但我认为它满足要求。每个 linux 主机至少有一个串口。
如果只有 USB 端口,那么 FTDI 和 Silicon Labs 制造的 USB-I2C/SPI/UART 桥接器在最近的内核中具有驱动程序支持。以后可以随时使用此策略添加 I2C 或 SPI 支持。
推荐阅读
- scripting - 上个季度的 Pine 脚本设置时间戳不起作用
- python - 接受 Youtube 的 cookie 同意
- python - 关键错误 22,当我想删除日期时间格式的行内容时出现获取 Loc 错误
- purescript - Purescript中遍历/绑定/折叠绑定效果的区别
- c - “警告:控制到达非无效函数的结尾”在一个简单的 for 循环(GCC)中
- php - Symfony 4.4 ContainerGWHmz1B\srcApp_KernelDevDebugContainer::getParameter(string $name) 声明必须兼容
- python-3.x - 如何用不同的输出替换第一行的输出
- matlab - 在 matlab 中为 Dicom_Picture 创建像素大小
- node.js - NODE / UPDATE / API / SEQUELIZE:UnhandledPromiseRejectionWarning:TypeError:无法读取null的属性“电子邮件”
- c++ - C++ 中的这个片段有什么作用?