历史上的今天
今天是:2024年11月24日(星期日)
2021年11月24日 | MINI2440i2c驱动学习二
2021-11-24 来源:eefocus
在测试函数中有个函数eeprom_open("/dev/i2c/0", 0x50, EEPROM_TYPE_8BIT_ADDR, &e);其中里面的调用如下
int eeprom_open(char *dev_fqn, int addr, int type, struct eeprom* e)
{
int funcs, fd, r;
e->fd = e->addr = 0;
e->dev = 0;
fd = open(dev_fqn, O_RDWR);
if(fd <= 0)
{
fprintf(stderr, "Error eeprom_open: %sn", strerror(errno));
return -1;
}
// get funcs list
if((r = ioctl(fd, I2C_FUNCS, &funcs) < 0))
{
fprintf(stderr, "Error eeprom_open: %sn", strerror(errno));
return -1;
}
当程序执行到fd = open(dev_fqn, O_RDWR);时就会调用驱动中的i2cdev_open(struct inode *inode, struct file *file)函数
static int i2cdev_open(struct inode *inode, struct file *file)
{
unsigned int minor = iminor(inode);
struct i2c_client *client;
struct i2c_adapter *adap;
struct i2c_dev *i2c_dev;
int ret = 0;
lock_kernel();
i2c_dev = i2c_dev_get_by_minor(minor);
if (!i2c_dev) {
ret = -ENODEV;
goto out;
}
adap = i2c_get_adapter(i2c_dev->adap->nr);
if (!adap) {
ret = -ENODEV;
goto out;
}
client = kzalloc(sizeof(*client), GFP_KERNEL);
if (!client) {
i2c_put_adapter(adap);
ret = -ENOMEM;
goto out;
}
snprintf(client->name, I2C_NAME_SIZE, "i2c-dev %d", adap->nr);
client->driver = &i2cdev_driver;
client->adapter = adap;
file->private_data = client;
out:
unlock_kernel();
return ret;
}
驱动做了些什么呢??
慢慢分析:
unsigned int minor = iminor(inode);
获得被打开的设备文件的次设备号,通过函数static inline unsigned iminor(const struct inode *inode)
{
return MINOR(inode->i_rdev);
}
i2c_dev = i2c_dev_get_by_minor(minor);
adap = i2c_get_adapter(i2c_dev->adap->nr);
获得i2c_dev和adap结构体主要是为了后面的client
client = kzalloc(sizeof(*client), GFP_KERNEL);
client->driver = &i2cdev_driver;
client->adapter = adap;
填充client.一个client结构体就表示一个i2c设备
file->private_data = client;
是为了在以后的操作中能通过file中的private_data获得client
同理,释放函数就是和open函数相反,在条用close()是static int i2cdev_release(struct inode *inode, struct file *file)
{
struct i2c_client *client = file->private_data;
i2c_put_adapter(client->adapter);
kfree(client);
file->private_data = NULL;
return 0;
}被调用,在这里释放了client结构体和file->private_data = NULL;
史海拾趣
|
本人使用VISTA 操作系统,在不更换操作系统的前提下,想问问有没有支持它的编程器,价格相对廉价的?主要用于烧写C51类的IC。 [ 本帖最后由 DIAG 于 2009-12-19 18:54 编辑 ]… 查看全部问答> |
|
我有个兄弟,三十一二了,突然问我他可以学编程搞编程吗?他没读过大学,没有任何基础,但他想拥有改变,不知道现不现实! 我有个兄弟,三十一二了,突然问我他可以学编程搞编程吗?他没读过大学,没有任何基础,但他想拥有改变,不知道现不现实! 他的担心有以下几点: 1。没有学历,就算把编程学好了,公司不一定给机会给他 2。岁数不小了,学编程能够学到怎样的程度 ...… 查看全部问答> |
|
想通过单片机里存的根据钢琴简谱的数组(又两部分组成:音符(1,2,3,4,5,6,7)和音长)输出曲子,想问一下有没有这样的芯片或是模块什么的,可以根据单片机7个io口(相当于音符1,2,3,4,5,6,7)输出的脉冲控制其发声(发1,2,3,4,5, ...… 查看全部问答> |
|
本程序主要实现了通过按键选择电机的正转或反转,选择完后,通过up键,加快电机的转速(增大占空比),down键来降低电机的转速。本例程的扩展部分:将按键用外接的电位器来控制,类似于汽车转动方向盘,电机就转到,转动角度越大,转动的速度就越大 ...… 查看全部问答> |
|
看大家老有人说LSE的晶体难选.让人觉得STM32的实时时钟真是一垃圾!但实际情况真是这样么?昨天终于要用STM32的RTC了, 我的晶体也是之前大量用的,没什么特别的. 电容焊了6pF.初始化RTC, 我靠,LSE连振都振不起来. 一查,原来 ...… 查看全部问答> |
|
那里有CIP(common industrial protocol)协议代码,那位同仁用过告诉下! 最近搞个项目,要用CIP应用层协议,但是代码找来找去就是没有,只有英文协议规范 。哪位用过,知道告诉下,谢谢!… 查看全部问答> |
|
ubuntu12.10 64位下安装CCS5.3.0.00090_linux许可证license简单操作 完整安装许可证了 方法如下:首先查看许可证的信息,如下图:有一个许可证存放目录/home/qinkai/ti。在这个目录下新建一个license目录,把我们在windows下常用的许可证CCSv5-China-University-Site_License放到这个目录下,就可以了。 [ 本 ...… 查看全部问答> |




