历史上的今天
返回首页

历史上的今天

今天是: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;

推荐阅读

史海拾趣

AVAGO公司的发展小趣事

随着技术的不断进步,AVAGO公司开始致力于研发更先进的半导体技术。其中,一次重大的技术突破发生在光纤通信领域。公司成功研发出了一种高性能的光纤收发器,这一创新不仅提高了数据传输的速度和稳定性,还极大地推动了光纤通信技术的发展。这一产品迅速在市场上获得了广泛应用,为AVAGO公司带来了可观的收益。

Bivar公司的发展小趣事

随着技术的不断发展和市场的日益扩大,Bivar公司意识到国内市场的局限性,开始积极拓展国际市场。公司派遣专业团队前往海外进行市场调研,了解当地需求和竞争态势。通过定制化的产品和灵活的销售策略,Bivar成功打入多个海外市场,并获得了可观的收益。

Fagor Electrónica公司的发展小趣事

如今,Fagor Electrónica已经成为电子和数字领域的领军企业之一。展望未来,公司将继续秉承创新驱动的发展理念,加大在人工智能、物联网等新兴领域的投入。同时,Fagor Electrónica还将积极参与全球市场竞争,拓展更广阔的市场空间。相信在不久的将来,Fagor Electrónica将会创造更加辉煌的业绩。

GREATECS公司的发展小趣事

1959年,Fagor Electrónica在电子领域崭露头角,当时它还只是Ulgor, S. Coop.公司旗下的一个电子部门。这一年,公司开始制造硒板和整流器,这标志着其电子制造业务的开始。尽管初始规模不大,但Fagor Electrónica凭借其高质量的产品和卓越的客户服务,迅速在市场上赢得了声誉。

Gigavac LLC公司的发展小趣事

如今,Fagor Electrónica已经成为电子和数字领域的领军企业之一。展望未来,公司将继续秉承创新驱动的发展理念,加大在人工智能、物联网等新兴领域的投入。同时,Fagor Electrónica还将积极参与全球市场竞争,拓展更广阔的市场空间。相信在不久的将来,Fagor Electrónica将会创造更加辉煌的业绩。

DCD [Digital Core Design]公司的发展小趣事

在快速变化的市场环境中,创新成为DCD公司持续发展的关键。公司不断加大研发投入,鼓励员工提出创新性的想法和建议。同时,公司还积极引进国内外先进的技术和管理经验,为公司的发展注入了新的活力。在创新驱动下,DCD公司不断推出具有竞争力的新产品和解决方案,赢得了客户的广泛赞誉和市场的持续认可。

问答坊 | AI 解惑

电梯对讲系统

一、KRS二芯总线制电梯专用五方对讲系统1、 真正的二线总线制,布线成本低: 每24台电梯只需布一根二芯RVV0.75总线到值班室,布线成本不到传统四线制的1/48(例如:一个24台电梯的小区,按传统通话系统的布线须布96根以上线从电梯至值班室,而采用本 ...…

查看全部问答>

hef4094 应用

HEF4094 八位移位存储寄存器 ,我想用它来驱动数码管,做个计数器,可不知在51单片机中,怎么写程序控制它, 哪位高手指点一二,谢谢了。…

查看全部问答>

有支持WINDOWS VISTA 操作系统的编程器么?

本人使用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键来降低电机的转速。本例程的扩展部分:将按键用外接的电位器来控制,类似于汽车转动方向盘,电机就转到,转动角度越大,转动的速度就越大 ...…

查看全部问答>

有关STM32的LSE晶震的问题.

看大家老有人说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放到这个目录下,就可以了。 [ 本 ...…

查看全部问答>