从Tiny4412--mma7660 gsensor驱动探索Linux内核I2C总线驱动框架

简介: 源码位于: driver/hwmon/mma7660.c参考博客:http://www.cnblogs.com/pengdonglin137/p/5240416.html参考mma7660的芯片数据手册:https://wenku.
源码位于: driver/hwmon/mma7660.c
参考博客:http://www.cnblogs.com/pengdonglin137/p/5240416.html

参考mma7660的芯片数据手册:https://wenku.baidu.com/view/3ef59c28ed630b1c59eeb521.html




那么驱动分析完了,设备板级配置文件配置在哪里呢?
代码位置:/arch/arm/mach-exynos/mach-tiny4412.c
在大约2856行的地方,可以看到:
这里通过CONFIG_SENSORS_MMA7660来识别是否有在内核中配置这个sensor,这个配置在源码根目录下的tiny4412_android_defconfig中:
可以搜索到:CONFIG_SENSORS_MMA7660=y

//判断是否有配置CONFIG_SENSORS_MMA7660
#ifdef CONFIG_SENSORS_MMA7660
//如果配置了,就包含7660驱动相关的头文件,并配置板级信息
#include <linux/mma7660.h>
static struct mma7660_platform_data mma7660_pdata = {
	.irq			= IRQ_EINT(25),  //设置外部中断号
	.poll_interval	= 100,			
	.input_fuzz		= 4,
	.input_flat		= 4,
};
#endif

static struct s3c2410_platform_i2c tiny4412_i2c3_data __initdata = {
	.flags			= 0,
	.bus_num		= 3,
	.slave_addr		= 0x10,
	.frequency		= 200*1000,
	.sda_delay		= 100,
};

static struct i2c_board_info i2c_devs3[] __initdata = {
#ifdef CONFIG_SENSORS_MMA7660
	{
		//这就是所谓的i2c_client的信息,在驱动中可以获取
		I2C_BOARD_INFO("mma7660", 0x4c),  //I2C板级注册信息
		.platform_data = &mma7660_pdata,  //将信息存储在platform_data中:
	},
#endif
};
以下为I2C_BOARD_INFO的原型:

/**
 * I2C_BOARD_INFO - macro used to list an i2c device and its address
 * @dev_type: identifies the device type
 * @dev_addr: the device's address on the bus.
 *
 * This macro initializes essential fields of a struct i2c_board_info,
 * declaring what has been provided on a particular board.  Optional
 * fields (such as associated irq, or device-specific platform_data)
 * are provided using conventional syntax.
 */
#define I2C_BOARD_INFO(dev_type, dev_addr) \
	.type = dev_type, .addr = (dev_addr)


大约4084行,找到初始化函数:
static void __init smdk4x12_machine_init(void)
大约4147行可以看到,在初始化硬件信息的时候向i2c注册了板级信息:
s3c_i2c3_set_platdata(&tiny4412_i2c3_data);
i2c_register_board_info(3, i2c_devs3, ARRAY_SIZE(i2c_devs3));


该函数原型:
int __init
i2c_register_board_info(int busnum,
	struct i2c_board_info const *info, unsigned len)
	
i2c_board_info结构体的实现:
struct i2c_board_info {
	char		type[I2C_NAME_SIZE];
	unsigned short	flags;
	unsigned short	addr;
	void		*platform_data;
	struct dev_archdata	*archdata;
	struct device_node *of_node;
	int		irq;
};


而i2c_client的数据存放在以下结构体中;
//#define I2C_NAME_SIZE	20
struct i2c_client {
	unsigned short flags;			//标明i2c设备的地址占多少位, 0为7bit, I2C_CLIENT_TEN为10位
	unsigned short addr;			//设备地址 								
	char name[I2C_NAME_SIZE];		//设备名称
	struct i2c_adapter *adapter;	//指向使用的i2c控制器
	struct i2c_driver *driver;		//指向匹配上的i2c设备驱动
	struct device dev;				//描述设备的结构体
	int irq;						//设备的中断号
	struct list_head detected;		//可以将这些信息加入到链表中去
};

适配器相关的结构体:
//描述一个i2c控制器
struct i2c_adapter { 
	struct module *owner;
	unsigned int id;
	unsigned int class;		  /* classes to allow probing for */
	const struct i2c_algorithm *algo; //使用哪种协议去传输数据
	void *algo_data;

	char name[48];
	struct completion dev_released;
	...
};
参考博客:http://blog.csdn.net/rockrockwu/article/details/7434752 i2c子系统之内核中I2C子系统的结构
参考博客:http://blog.csdn.net/rockrockwu/article/details/7434953 i2c子系统之i2c bus初始化——i2c_init()
在Linux内核启动的时候最先执行的和I2C子系统相关的函数应该是driver/i2c/i2c-core.c文件中的i2c_init()函数。



最后再说说,驱动和设备是怎么联系起来的:


目录
相关文章
|
16天前
|
Linux C语言
Linux内核队列queue.h
Linux内核队列queue.h
|
9天前
|
算法 Linux 调度
深入理解Linux内核的进程调度机制
【4月更文挑战第17天】在多任务操作系统中,进程调度是核心功能之一,它决定了处理机资源的分配。本文旨在剖析Linux操作系统内核的进程调度机制,详细讨论其调度策略、调度算法及实现原理,并探讨了其对系统性能的影响。通过分析CFS(完全公平调度器)和实时调度策略,揭示了Linux如何在保证响应速度与公平性之间取得平衡。文章还将评估最新的调度技术趋势,如容器化和云计算环境下的调度优化。
|
11天前
|
Linux Go
Linux命令Top 100驱动人生! 面试必备
探索Linux命令不再迷茫!本文分10部分详解20个基础命令,带你由浅入深掌握文件、目录管理和文本处理。 [1]: <https://cloud.tencent.com/developer/article/2396114> [2]: <https://pan.quark.cn/s/865a0bbd5720> [3]: <https://yv4kfv1n3j.feishu.cn/docx/MRyxdaqz8ow5RjxyL1ucrvOYnnH>
64 0
|
14天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
20 3
|
21天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
22天前
|
Ubuntu Linux
Linux查看内核版本
在Linux系统中查看内核版本有多种方法:1) 使用`uname -r`命令直接显示版本号;2) 通过`cat /proc/version`查看内核详细信息;3) 利用`dmesg | grep Linux`显示内核版本行;4) 如果支持,使用`lsb_release -a`查看发行版及内核版本。
36 6
|
24天前
|
Linux 内存技术
Linux内核读取spi-nor flash sn
Linux内核读取spi-nor flash sn
18 1
|
5天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
2天前
|
监控 Linux Windows
50个必知的Linux命令技巧,你都掌握了吗?(下)
50个必知的Linux命令技巧,你都掌握了吗?(下)
|
2天前
|
Linux Shell Windows
Linux 常用基本命令
Linux 常用基本命令