ARM-Linux s3c2440 之I2C分析

发布者:飘然出尘最新更新时间:2016-06-12 来源: eefocus关键字:ARM  Linux  s3c2440  I2C分析 手机看文章 扫描二维码
随时随地手机看文章
内核版本linux-2.6.30.4
I2C在Linux中是Bus下的一个子系统. 它由客户驱动(client driver),i2c-core核心,i2c适配器驱动(adapter driver) ,算法aglorithm组成。s3c2440中有两个i2c现适配器.作为platform_device设备在系统启动先时被注册和添加。下面我们分析i2c(设备,驱动,总线)的实现过程.
//填充设备资源
//struct resource结构体描述了挂接在cpu总线上的设备实体资源
//.start:i2c寄存器起始地址; .end:i2c寄存器结束地址; .flag:描述设备实体的共性和特性标志
 
  1. static struct resource s3c_i2c_resource[] = {  
  2. [0] = {//i2c-0  
  3. .start = S3C_PA_IIC,  
  4. .end   = S3C_PA_IIC + SZ_4K - 1,  
  5. .flags = IORESOURCE_MEM,  
  6. },  
  7. [1] = {//i2c-1   
  8. .start = IRQ_IIC,  
  9. .end   = IRQ_IIC,  
  10. .flags = IORESOURCE_IRQ,  
  11. },  
  12. };  
/i2c适配器初始化时数据
 
  1. static struct s3c2410_platform_i2c default_i2c_data0 __initdata = {  
  2. .flags = 0,  
  3. .slave_addr = 0x10,  
  4. .frequency = 100*1000,  
  5. .sda_delay = 100,   
  6. };  

//声明i2c适配器为platform_device

 

  1. struct platform_device s3c_device_i2c0 = {  
  2.     .name         = "s3c2410-i2c",  
  3. #ifdef CONFIG_S3C_DEV_I2C1  
  4.     .id       = 0,  
  5. #else  
  6.     .id       = -1,  
  7. #endif  
  8.     .num_resources    = ARRAY_SIZE(s3c_i2c_resource),  
  9.     .resource     = s3c_i2c_resource,  
  10. };  
  11.   
  12. static struct s3c2410_platform_i2c default_i2c_data0 __initdata = {  
  13.     .flags      = 0,  
  14.     .slave_addr = 0x10,  
  15.     .frequency  = 100*1000,  
  16.     .sda_delay  = 100,   
  17. };  

 

//添加i2c适配器:
 
  1. static struct platform_device *smdk2440_devices[] __initdata = {  
  2. ...  
  3. &s3c_device_i2c0,  
  4. ...  
  5. };  
//添加plat_from_data
 
  1. void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd)  
  2. {  
  3. struct s3c2410_platform_i2c *npd;  
  4.   
  5.   
  6. if (!pd)  
  7. pd = &default_i2c_data0;    
  8. npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL);  
  9. if (!npd)  
  10. printk(KERN_ERR "%s: no memory for platform data\n", __func__);  
  11. else if (!npd->cfg_gpio)  
  12. npd->cfg_gpio = s3c_i2c0_cfg_gpio;  //i2c引脚配置  
  13.   
  14.   
  15. s3c_device_i2c0.dev.platform_data = npd;  //挂接plat_form_data数据  
  16. }  
//定义好上面相关结构后,在smdk2440_machine_init()中被注册和添加成platform_device
  1. static void __init smdk2440_machine_init(void)  
  2. {  
  3. s3c24xx_fb_set_platdata(&smdk2440_fb_info);  
  4. s3c_i2c0_set_platdata(NULL);  
  5.        ...  
  6. //注册和添加platform_device  
  7. platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));  
  8. ...  
  9. }  
其中 smdk2440_machine_init在被赋值在MACHINE_START中
在start_kernel()-->setup_arch()时被调用,但值得注意的是i2c适配器并没有被初始化,因为还没有驱动!
通过下面可以知道platform_device_register()和device_register()的区别:
  1. platform_add_devices()-->platform_device_register()-->  
  2. platform_device_add()--> device-->add()  
platfrom_bus_init()时也将添加一个名叫platform的设备(struct device platform_bus):
 
  1. plat_form_bus_init()-->device_register()-->device_register()  
  2. -->device-->add()  
但这个设备是虚拟的,所有platform_device_add()后的设备都是在/devices/platform/下
因为所有plaform_device 的父母亲都是platform_bus,是在platform_device_add()中
 
  1. if (!pdev->dev.parent)  
  2. pdev->dev.parent = &platform_bus;  
我想这也就是platform_device_register()和device_register()区别吧
在reset_init()-->kernel_init()-->do_basic_setup()
-->driver_init()-->platform_bus_init()完成platform_bus总线的注册
但是现在i2c适配器并没有和驱动绑上,因为到系现在为止驱动还没有出现呢(初始化)
只有做好前面一些的准备功夫,i2c适配器驱动才能初始化,这个是需要按照顺序来的。
s3c2440-i2c适配器驱动的初始化在drivers/i2c/bus/i2c-s3c2410.c中实现
并且作为platform_driver注册。
//填充driver结构并完成相应probe,remove等函数
 
  1. static struct platform_driver s3c2440_i2c_driver = {  
  2. .probe = s3c24xx_i2c_probe,  
  3. .remove = s3c24xx_i2c_remove,  
  4. .suspend_late = s3c24xx_i2c_suspend_late,  
  5. .resume = s3c24xx_i2c_resume,  
  6. .driver = {  
  7. .owner = THIS_MODULE,  
  8. .name = "s3c2440-i2c", //  
  9. },  
  10. };  

//初始化并注册platform_driver

 

  1. static int __init i2c_adap_s3c_init(void)  
  2. {  
  3.     int ret;  
  4.   
  5.   
  6.     ret = platform_driver_register(&s3c2410_i2c_driver);//  
  7.     if (ret == 0) {  
  8.         printk("register s3c2440_i2c_driver.....\n");  
  9.         ret = platform_driver_register(&s3c2440_i2c_driver);  
  10.         if (ret)  
  11.             {  
  12.             printk("register s3c2410_i2c_driver.....\n");  
  13.             platform_driver_unregister(&s3c2410_i2c_driver);  
  14.             }  
  15.     }  
  16.   
  17.   
  18.     return ret;  
  19. }  
  20. subsys_initcall(i2c_adap_s3c_init);  

 

这样适配器就和驱动绑定上了,过程是这样的:
 
  1. platform_driver_register()-->driver_register()-->bus_add_driver()-->driver_attach()  
  2. __driver_attach()-->driver_probe_device()-->s3c24xx_i2c_probe()  
并且在s3c24xx_i2c_probe()的时候调用
  1. i2c_add_numbered_adapter(&i2c->adap);  
最后添加自己为i2c总线的适配器。这样分析过程也就结束了。
关键字:ARM  Linux  s3c2440  I2C分析 引用地址:ARM-Linux s3c2440 之I2C分析

上一篇:ARMLinux s3c2440 之UART分析二
下一篇:ARM-Linux s3c2440 之UART分析(五)

推荐阅读最新更新时间:2024-03-16 14:56

IAR 开发STM32 ARM 版本不兼容 解决办法之一
对于V4 和V5不兼容的解决方法很多了,最近用V6 版开发,结果同事用V5.3版 ,我调通之后代码给他,结果他那边显示错误,配置资料失效了,查看是版本不同导致的。懒得转换,但是没办法还是得转换,只好新建一个空的 IAR 5.3版的工程,保证存放文件的目录结构和之前的目录结构相同,然后在工程中点击菜单栏的 Project 选项 ——Import File List... 然后开始导入新版本的工程文件信息 选择之前的新版本的 *.ewp 文件 导入,立刻之前的文件列表就出现在旧版本的界面左侧。还差3步完成: 1 在项目的Option--General Option 选择器件类型 2 在项目的Option--
[单片机]
IAR 开发STM32 <font color='red'>ARM</font> 版本不兼容 解决办法之一
S3c2440处理器中nor flash启动和nand flash启动问题
S3c2440是三星公司推出的一款基于ARM920T的处理器,采用ARM内核,不同于单片机,无片上rom与ram,必须搭配相应的外围电路进行使用,现在,让我们从零开始进行这一块MCU的学习,为了入门简单方便,前期我不会搭载任何操作系统,本手册写到哪算哪. 1.什么是nor flash启动和nand flash启动 在任何视屏教程里面,都会告诉你一个开关左右选择就能norflash启动或者nand flash启动,norflash启动能直接运行代码,nand flash启动不能直接运行代码,可是为什么呢? 要知道这一点,首先要明白nandflash和norflash的区别,首先,norflash是随机存储介质,也就是说,对n
[单片机]
<font color='red'>S3c2440</font>处理器中nor flash启动和nand flash启动问题
什么是ARM中的SP(堆栈)和LR?
问题描述 我一遍又一遍地阅读定义,我还没有得到什么是ARM中的SP和LR?我明白PC(它显示下一个指令的地址),SP和LR可能是相似的,但我只是不明白它是什么。你可以帮我吗? 编辑:如果你可以用例子说明一下,那会很棒。 编辑:终于弄清楚LR是什么,还没有得到什么SP。 最佳解决方案 LR是用于保存函数调用的返回地址的 link register 。 SP是堆栈指针。堆栈通常用于在函数调用中保存”automatic”变量和上下文/参数。从概念上讲,您可以将”stack”视为您”pile”您的数据的地方。您将”stacking”保留在一个数据之上,堆栈指针告诉您”high”的数据是”stack”。您可以从”stack”的”to
[单片机]
Segars:ARM欢迎同Intel竞争 可时刻保持警惕性
据国外媒体报道,在今天早些时候,媒体就如何看待与Intel竞争关系时,ARM即将上任的新CEO Simon Segars表示:“有竞争永远是好事,他可以使你随时保持着高度警惕性。” Segars表示,其并不满足于ARM仅仅能成为Intel的竞争对手,而是更多的在某些领域完全超越了Intel。随着平板电脑销量节节攀高,预计2013年总出货量将超越PC,考虑到平板电脑基本都是基于ARM架构的处理器,从某种程度上来说,ARM在个人计算市场方面已经超过了Intel。 ARM现任CEO Warren East表示,对于退休并没有什么可说的。“我在半导体行业已经工作了将近30年,这几乎是我终身的事业。”East同时补充道,他对于英国的技术
[嵌入式]
Segars:<font color='red'>ARM</font>欢迎同Intel竞争 可时刻保持警惕性
基于ARM和μC/OS-II的无线数据采集系统设计
  无线数据采集系统的应用范围非常广泛,涉及电力、水利、交通和安防等行业。通用分组无线业务GPRS(General Packet Radio Service),由Nokia、Ericsson等公司开发。该技术建立在GSM网络的基础上,被称为2.5代移动通信技术,它将无线通信与Internet紧密结合,是一种先进的、全新的无线网络承载手段,具有独特优势。随着GPRS技术在移动通信领域的发展,为数据采集传输及监控提供了一种新的高性价比的数据通信方案 。   同时,嵌入式系统以其高效的开发、低廉的成本、方便的使用和维护等优点受到信息业界的广泛推崇。嵌入式系统在工农业控制领域主要用于对现场的监视和控制。而传统监控产品的设计目标往往为保
[嵌入式]
基于ARM的十回路智能配电监控单元设计
本文以内含ARM7TDMI—STM CPU的微控制器LPC2132芯片作为系统主控制器,针对电力系统数据信号的采集和数据通信,以及电力系统状态监测为研究主题,研究设计出了一种具备智能配电,并可同时监控十个用户回路的终端控制单元,其具备测量各回路中有功功率、无功功率、能量、电压、电流、功率因数等电力参数功能。   1 电力参量的测量原理   对称三相电源通常由三个频率相同、幅值相等和初相角为1200的正弦电压源按一定方式连接而成,三相信号可依次称为A、B、C相,记为uA、uB、uC,它们的瞬时表达式如下:      在交流电路中,电压与电流之间的相位差的余弦叫做功率因数,在数值上,功率因数是有功功率和视在功率的比值,
[工业控制]
基于<font color='red'>ARM</font>的十回路智能配电监控单元设计
ARM7单片机(学习ing)—(KZ)、PLL(锁相环)—01
找了半天还是没有找到关于Proteus仿真LPC2106的频率设置~~ 还有就是暂时还看不懂Startup.s~~ 所以不知道它是怎么设置的~~ 不过这里先整理一下PLL~~ PLL(锁相环): 寄存器描述: a、PLLCON寄存器(PLLCON—0X301FC080) b、PLLCFG寄存器(PLLCFG—0XE01FC084) c、PLLSTAT寄存器(PLLSTAT—0XE01FC088) d、PLLFEED寄存器(PLLFEED—0XE01FC08C) PLL中断 PLLSTAT寄存器中的PLOCK位连接到中断控制器。这样可以使用软件打开PLL并连接到其它功能,不需要等待PLL锁定。
[单片机]
<font color='red'>ARM</font>7单片机(学习ing)—(KZ)、PLL(锁相环)—01
基于ARM Cortex-M3的多路数据采集系统的设计
0 引言 数据采集系统是将采集传感器输出的温度、压力、流量、位移等模拟信号转换成计算机能识别的数字信号,进行相应的计算存储和处理;同时,可将计算所得的数据进行显示或打印,以便实现对某些物理量的监测和控制。 嵌入式系统是以应用为中心,以计算机为基础,软硬件可剪裁,适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。嵌入式系统的核心是各种类型的嵌入式处理器。目前,采用ARM技术的微处理器占据了主流,其应用遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场。而 ARM微处理器的Cortex系列专为安全要求较高的应用而设计。其中,Cortex-M3适于高性能、低成本需求的嵌入式应用。 1 多路数
[测试测量]
基于<font color='red'>ARM</font> Cortex-M3的多路数据采集系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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