mini2440-i2c驱动分析

发布者:baiyuguoji最新更新时间:2021-11-22 来源: eefocus关键字:mini2440  i2c  驱动分析 手机看文章 扫描二维码
随时随地手机看文章

在s3c2440的i2c驱动框架中, 分2个部分的内容, 一部分是i2c-adapter初始化, 一部分是i2c-driver的初始化. 针对s3c2440自带的eeprom, 走读一下代码, 看看哪些东西值的我们学习和借鉴.


s3c2440上有若干个i2c-adapter, 每一个对应一条i2c总线, 每个总线上可以挂多个i2c 设备, 读写这些设备的方式是操作i2c-adapter的寄存器.挂在同一个i2c-adapter下的i2c设备通过同一个 adapter的发送算法对数据进行操作.


换言之: 一个adapter对应一条总线, 对应一组算法, 操作这条总线下的设备.


那么很容易理解, 要操作i2c设备, adapter的初始化至关重要. 而adapter是用平台设备注册到系统


adapter的平台设备 mach-mini2440.c

对于熟悉平台设备的人说, 这段代码非常简单, 定义一个平台设备, 定义了i2c-adapter物理内存地址和中断线, 需要注意是,并把它注册到平台设备链表上.


这些是资源, 但是i2c还需要有一个属性信息需要定义, 

下面这个结构体, 定义了i2c-adapter使用的总线号, 从地址(如果做从需要使用), 工作频率, 延时信息,

这些信息注册为平台设备的平台数据, 以便驱动程序使用.


adapter的平台驱动  i2c-s3c2440.c

通过平台总线的match过程, 调用probe函数


s3c24xx_i2c_probe中, 主要完成以下几个工作:


首先定义了一个s3c24xx_i2c, 此结构体用于描述一个adapter, 其中初始化此adapter的数据传输算法

获取i2c系统时钟, 并使能

ioremap映射物理地址, 及申请中断


设置adapter的设备关系(父设备是平台设备), 及初始化(gpio设置,  根据平台设备的平台数据设置CON频率, 设置S3C2410_IICADD地址寄存器)

设置总线, 并扫描总线上的i2c设备, 生成i2c client设备描述结构体, 并把i2c client注册称为adapter的子设备

设备平台设备的私有数据为

从整个过程看, 就是注册adapter, 并初始化的过程. 比较特殊的是, 当adapter初始化完成后, 还需要扫描所属这个总线的i2c设备, 并注册成为自己的子设备. i2c设备注册, 同样是通用的设备模型, 那么在同样存在match和probe的过程.


通过上述这样的操作, 系统就使能了某个adapter, 以及使能了内置在__i2c_board_list下, 并且属于这条总线的i2c设备


数据传输过程(发送和接收):


内核定义了一个函数:

只要i2c client和i2c driver可以匹配成功, 那么adapter默认就在i2c-client中, i2c驱动中,只需要构造msgs指定msgs的num就可以完成数据发送


最后奉献一张自己画的图, 一张图抵过千言万语:

理解了这些, 那么就可以从头开始暴力写一个自己的驱动框架了:

1)定义一个struct i2c_adapter, 初始化,调用i2c_register_adapter加入到i2c bus

2) 定义i2c_devinfo用于描述一个i2c cient, 调用i2c_new_device创建i2c client

3) 写一个i2c driver, 注册到i2c 总线

关键字:mini2440  i2c  驱动分析 引用地址:mini2440-i2c驱动分析

上一篇:Linux的I2C 设备驱动 -- mini2440 上i2c接口触摸屏驱动
下一篇:Linux I2C驱动完全分析(一)

推荐阅读最新更新时间:2024-11-12 15:45

几种LED驱动电路设计组合分析
  LED 驱动电路除了要满足安全要求外,另外的基本功能应有两个方面,一是尽可能保持恒流特性,尤其在电源电压发生±15%的变动时,仍应能保持输出电流在±10%的范围内变动。二是驱动电路应保持较低的自身功耗,这样才能使LED 的系统效率保持在较高水平。   传统的低效率LED驱动电路:      图1   图1 是传统的低效率电路,电网电源通过降压变压器降压;桥式整流滤波后,通过电阻限流来使3 个LED 稳定工作,这种电路的致命缺点是:电阻R 的存在是必须的,R 上的有功损耗直接影响了系统的效率,当R 分压较小时,R 的压降占总输出电压的40%,输出电路在R 上的有功损耗已经占40%,再加上变压器损耗,系统效率小于50%。当电源电
[电源管理]
几种LED<font color='red'>驱动</font>电路设计组合<font color='red'>分析</font>
MINI2440启动配置文件/etc/init.d/rcS文件分析
Mini2440启动配置文件说明 对于mini2440,虽然root_qtopia这个文件系统的GUI是基于Qtopia的,但其初始化启动过程却是由大部分由busybox完成,Qtopia(qpe)只是在启动的最后阶段被开启。 由于默认的内核命令行上有init=/linuxrc, 因此,在文件系统被挂载后,运行的第一个程序是根目录下的linuxrc。这是一个指向/bin/busybox的链接,也就是说,系统起来后运行的第一个程序也就是busybox本身。这种情况下,busybox首先将试图解析/etc/inittab来获取进一步的初始化配置信息(参考busybox源代码init/init.c中的parse_inittab()函数
[单片机]
mini2440触摸屏驱动详解
#include linux/errno.h #include linux/kernel.h #include linux/module.h #include linux/slab.h #include linux/input.h #include linux/init.h #include linux/serio.h #include linux/delay.h #include linux/platform_device.h #include linux/clk.h #include linux/gpio.h #include asm/io.h #include asm/irq.h #include plat/regs-ad
[单片机]
适用于电机变速驱动的能量再生电路分析
  基于电压源逆变器的通用变速驱动器输入侧一般采用二极管整流,能量无法双向流动,在电动机制动期间,能量从电机侧反馈至直流侧,导致直流侧电压升高,通常的解决方法是在直流侧增加由电阻和功率器件组成的制动单元,由电阻消耗掉多余的能量[1],保持直流侧的功率平衡。这种方法实现简单,可靠性高,但是能量是以发热的形式被消耗掉,对于需要频繁制动和大功率的应用场合,会造成能量的浪费,降低了变速驱动系统的效率。   还有直流制动和电机耗能型制动的方法[2]。直流制动是在电机气隙中叠加静止的磁场,当转子线圈与此静止磁场相互作用时,线圈上感应的电压产生转子电流,与气隙磁场相互作用产生反方向的制动力矩,直流制动不需要额外的硬件投入,但在高转速时有效的制动
[电源管理]
适用于电机变速<font color='red'>驱动</font>的能量再生电路<font color='red'>分析</font>
Mini2440的LCD配置分析
用的是W35屏,就把W35的驱动摘出来说: #elif defined(CONFIG_FB_S3C2410_W320240) #define LCD_WIDTH 320 #define LCD_HEIGHT 240 #define LCD_PIXCLOCK 170000 #define LCD_RIGHT_MARGIN 0x44 #define LCD_LEFT_MARGIN 0x04 #define LCD_HSYNC_LEN 0x01 #define LCD_UPPER_MARGIN 10 #define LCD_LOWER_MARGIN 4 #define LCD_VSYNC_LEN 1 #def
[单片机]
<font color='red'>Mini2440</font>的LCD配置<font color='red'>分析</font>
汽车驱动电机结构原理及故障分析
电动汽车驱动 电机 是指应用于电动汽车上,用于驱动车轮运动的电机。(区别于 伺服电机 )
[嵌入式]
汽车<font color='red'>驱动</font>电机结构原理及故障<font color='red'>分析</font>
mini2440硬件篇之UART
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器。UART以全双工方式传输数据,最简单的连线只有2根,TxD用于发送,RxD用于接收,Gnd地。UART使用标准的TTL电平(0~3.3V或0~5V),表示高低电平,为了增加抗干扰能力,增加传输长度,通常将TTL电平转换为RS-232电平。3~12V表示0,-3~-12表示1。 平常数据引脚处于空闲1状态,发送数据时,TxD变低电平,表示一个起始信号。然后后面可以跟5、6、7、8位的数据,LSB低位优先。如果使用校验,数据发完后再发送一个校验位,最后发送1、2位停止位。 芯片手
[单片机]
<font color='red'>mini2440</font>硬件篇之UART
mini2440 dm9000 网卡驱动详解 (三)
*dm9000_get_drvinfo() 该函数去的设备的基本信息(设备名,版本,总线名)传给ethtool_drvinfo结构体变量。代码清单如下: static void dm9000_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { board_info_t *dm = to_dm9000_board(dev); /*to_dm9000_board实际上就是调用了netdev_priv(dev)*/ strcpy(info- driver, CARDNAME);
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved