重庆生活网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 生活 重庆
查看: 1051|回复: 0
打印 上一主题 下一主题

【从0教学嵌入式Linux】第二十四集(下)

[复制链接]
跳转到指定楼层
楼主
发表于 2020-3-13 16:47:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前面我们说了如何I2C用户模式驱动,这种驱动基于I2C子系统,但是他对于Linux下主机控制器驱动,大多数是BSP提供的,这里不多说,主要说一下i2c总线结构定义了一些总线相关的方法,这里我们关心的是i2c_drivi2c_register_board_info(intbusnum,st这个结构我们不需要操作,是操作系统即核心代码自动完成,这个过程其实是在注这个函数负责注册i2c_driver并匹配到了对应的i2c_client




第24課:I2C驱动程序及应用程序开發(二)


(三)I2C子系统下的字符驅动
前面我们说了如何I2C用戶模式驱动,這种驱动基于I2C子系统,但是他对于應用程序开发人员的要求较高,需要应用程序开發人员了解硬件的一些东西,比如时序、地址等等,而多数时候应用程序开发人員是按照操作文鍵的方法操作設備,所以我們更希望用一些更简单的接口去访問,也就是我們今天的内容——基于I2C子系统的字符驱动。
I2C子系统的代码分为三部分:
Host:主机控制器驱动
Device:设备驱動代码
Core:核心代码,提供设备与控制器的接口
一、主机控制器驱动
Linux下主机控制器驱动,大多数是BSP提供的,这里不多说,主要说一下他是干什么的。I2C主机控制器在内核里又叫适配器,用結構i2c_adapter描述

   


其中master_xfer就是我们给设備提供的接口,这部分内容按照芯片手册中寄存器的操作實现数据的收发。
最终我们将i2c_adapter注册到系统中使用如下函數:
int i2c_add_numbered_adapter(struct i2c_adapter*);
二、核心代码
刚才我们介紹的函数全是核心代码提供,它主要是提供標准的统一的接口。
三、设备代码

   


基于I2C
的字符驅動的编写首先我们需要了解几个特定的結构。
1.i2c_bus_type
i2c總線结构定义了一些總線相关的方法,這里我們关心的是i2c_driver和i2c_client的配备規則,为什么匹配呢,i2c_client携带硬件信息,而i2c_driver只负責操作设备,而不管操作的是哪个设备,他需要的硬件信息有i2c_client提供,所以需要i2c_client和i2c_driver协同操作,而一个系统中i2c_driver和i2c_client都可能有多个,如何得到自己的另一半就是我们所說的匹配规則,i2c_bus_type匹配規则如下:

   


我们发現i2c总线的匹配规则是id或name两種,id優先级高。
2.板级结構

   


板子上没有一个I2C的设备,我们就要注冊一個这样的结构体到内核里面,这部分代碼一般添加在平台代码里面,注冊函數如下:
i2c_register_board_info(int busnum,struct i2c_board_info const *info,unsigned n)
busnum现在很多cpu有多条I2C總线,这个参數表示第幾条总线
Info是一个结构体数据,表示我們要注册的I2C设备
n表示我們注冊了幾个I2C设备
通过上面函数就能把设备注册到系统中,结构如圖:

   


3.I2c_client
这个结構我們不需要操作,是操作系统即核心代码自动完成,这個过程其實是在注册i2c_adapter的时候完成的,即在函数i2c_add_numbered_adapter中完成,最终i2c_client攜带著i2c_board_info和i2c_adapter的信息。
4.i2c_driver
这部分代码主要负责注册i2c_driver和匹配相应的i2c_client。I2c_driver定义如下:

   


注册函数如下:
int i2c_add_driver(struct i2c_driver *driver);
這個函數负责注冊i2c_driver并匹配到了对應的i2c_client,probe函數被执行,并且i2c_client被擬参数的形式傳递過来。我们可以通过i2c_client提供的硬件信息和操作接口操作我们想要的設备
5.数据传输
數据传输结构:

   


消息的封装与上節用户模式驅动相似,封装好消息使用如下函数提交给核心代码,最終通過控制器驱动发送给具体的设备。
int i2c_transfer(struct i2c_adapter *adap,struct i2c_msg *msgs,int num);
adap适配器,由client->adapter获得
msgs 消息
num 消息个数
通过上面内容我们就可以构建我們的基于Linux下i2c子系统的设备驱动了,例程如下:
平台代码添加:

   


驱動代码:

   



   



   



   


(四)S5PV210,具体添加方法:
1.編辑文件kernel/arch/arm/mach-s5pv210/mach-smdkv210.c

   


2.建立设備驱動的基本信息

   


3.CPU带有三条I2C總线,硬件如果鏈接的是I2C1的话,在i2c_devs1中添加i2c_board_info信息

   


4.这時,我们的I2C设备就会自動挂载到I2C总线上了

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|联系我们|重庆生活网

GMT+8, 2024-5-6 19:19 , Processed in 0.156250 second(s), 17 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表