导航:首页 > 操作系统 > linuxi2c

linuxi2c

发布时间:2022-05-06 00:07:43

linux i2c设备驱动移植问题 请大师们赐教啊

linux下驱动代码分为两个层次,一个是设备抽象,一个是真实设备
像i2c-dev.c属于设备抽象,你没有它,所有char设备的i2c机制都失效
像ad7417.c属于真实设备,没有它只是影响ad7417对应的具体设备。

所以你想使用ad7417的对应设备,这两个文件必须都得有
i2c-dev.c是核心代码,它的输出产物是个k-object:
MODULE_DESCRIPTION("I2C /dev entries driver");

至于你的ad7417.c是否有用到i2c-dev.c的代码,我就不知道了,如果有则需要联编

❷ 如何在linux下实现一个I2C与SPI的从机驱动

最简情况下:
I2C:SDA数据线、SCL时钟线。
SPI:DI输入线、DO输出线、CS片选先、CLK时钟线。
可能不能写到一个驱动中。

但是好在一般很少用到这么简单的情况,厂家会对其扩展和改进。

比如 W25Q128FB/W25R128FV 系列闪存,支持 SPI、Dual SPI、Quad SPI 和 QPI。就拿 Quad SPI 来说,有 6 个引脚:

Quad SPI:D0-D3 输入输出线、CS片选先、CLK时钟线。

其中 输入为一位串行输入 D0,输出为四位串行输出 D0-D3。(四位仍少于一个字节,可姑且称为串行)

Winbond华邦 这么做是为了加快闪存读取速度(四位串行相比一位串行提高了四倍)。

因此关键在于 要进行怎样的 IO。至于是否将二者写到一个驱动看来并不重要。

❸ linux 下的I2C驱动怎么管理多个相同的设备,设备地址不同

驱动程序可能不需要做太多工作。
三个设备接入系统之后,I2C总线会创建3个不同的Node,然后,你的驱动程序就会被加载。最后结果是,每个设备都有自己的驱动程序实例,互相之间不会有干扰和依赖。
参考:http://bbs.csdn.net/topics/390847077

❹ linux中i2c总线中从机地址怎么设置

S3C2410X集成了一个LCD控制器(支持STN和TFT带有触摸屏的液晶显示屏)、SDRAM控制器、3个通道的UART、4个通道的DMA、4个具有PWM功能的计时器和一个内部时钟、8通道的10位ADC。S3C2410还有很多丰富的外部接口,例如触摸屏接口、I2C总线接口、I2S总线接口、两个USB主机接口、一个USB设备接口、两个SPI接口、SD接口和MMC卡接口。在时钟方面S3C2410X也有突出的特点,该芯片集成了一个具有日历功能的RTC和具有PLL(MPLL和UPLL)的芯片时钟发生器。MPLL产生主时钟,能够使处理器工作频率最高达到203MHz。这个工作频率能够使处理器轻松运行WIN CE、LINUX等操作系统以及进行较为复杂的信息处理。
S3C2410X芯片相关数据:
? 203MHz ARM920T 内核,0.18um工艺,超低功耗,272 pin BGA封装
? 带MMU,16KB指令缓存,16KB数据缓存
? 1.8V内核电源,3.3V I/O电压,兼容1.8,2.5,3.3V内存电压
? 内含SDRAM控制器
? 117个GPIO,24个外部中断
? 内置LCD控制器,可接真彩色,大屏幕TFT液晶
? 丰富的外部接口:4通道DMA,3个串口,一个SPI口,一个IIC接口,一个USB device口,一个USB host口
? 8通道10-bit AD,4通道PWM输出
? 内置RTC,PLL
? 内置SD,MMC,Smart Media等存储卡接口
? 支持从SmartMedia (Nand Flash)中启动系统
请采纳答案,支持我一下。

❺ linux i2c的设备和驱动是怎样匹配的

linux下驱动代码分为两个层次,一个是设备抽象,一个是真实设备
像i2c-dev.c属于设备抽象,你没有它,所有char设备的i2c机制都失效
像ad7417.c属于真实设备,没有它只是影响ad7417对应的具体设备。
所以你想使用ad7417的对应设备,这两个文件必...

❻ linux 怎么加载i2c驱动

假设手上有一块从淘宝上买来的开发板,我要在开发板的I2C总线上增加一个从设备(如at24c08),那么我要怎样写这个“I2C设备驱动”,让

应用程序可以访问at24c08呢?

先来看一个最简单的i2c设备驱动:
static struct i2c_board_info at24cxx_info = { //所支持的i2c设备的列表
I2C_BOARD_INFO("at24c08", 0x50), //一项代表一个支持的设备,它的名字叫做“at24c08”,器件地址是0x50
};
static struct i2c_client *at24cxx_client;
static int at24cxx_dev_init(void)
{
struct i2c_adapter *i2c_adap; //分配一个适配器的指针
i2c_adap = i2c_get_adapter(0); //调用core层的函数,获得一个i2c总线。这里我们已经知道新增的器件挂接在编号为0的i2c总线上
at24cxx_client = i2c_new_device(i2c_adap, &at24cxx_info); // 把i2c适配器和新增的I2C器件关联起来,这个用了i2c总线0,地址是0x50。这就组成了一个客户端
at24cxx_client i2c_put_adapter(i2c_adap);
return 0;
}
static void at24cxx_dev_exit(void)
{
i2c_unregister_device(at24cxx_client);
}
mole_init(at24cxx_dev_init);
mole_exit(at24cxx_dev_exit);

❼ 求教高手,在linux内核中怎么修改i2c的通信速率为400KHz

1、先查看I2C设备速率。

sudocat/sys/mole/i2c_bcm2708/parameters/baudrate

默认的I2C速度为100KHz,对于多数I2C设备而言100KHz并不算快。

cd/etc/modprobe.d#进入/etc/modprobe.d目录
sudonanocustom.conf#在该目录新建一个名为custom.conf文件,并插入以下内容
#optionsi2c_bcm2708baudrate=400000
sudoreboot#重启系统

❽ linux i2c时钟rtc该怎样配置内核

i2c是master和client架构,master就是主控制器这边的驱动,client就是设备这边的驱动,master一般都写好了,你只需要写相应的client驱动,也就是设备驱动,然后在板级文件里面注册一个设备。就可以啦。

❾ linux下怎么直接使用iic接口

利用Linux中IIC设备子系统移植IIC设备驱动

背景描述

IIC总线在嵌入式系统中应用十分广泛,常见的有eeprom,rtc。一般的处理器会包含IIC的控制器,用来完成IIC时序的控制;另外一方面,由于IIC的时序简单,使用GPIO口来模拟时序也是常见的做法。面对不同的IIC控制器,各种各样的芯片以及linux源码,如何更快做好IIC设备驱动。

问题描述

在我们的方案中,我们会用到eeprom,rtc以及tw2865。由于Hi3520的IIC控制器设计有问题,无法正常使用。而IIC控制器的SDA和SCL管脚正好是和两个GPIO管脚复用的。Hisi将控制gpio来实现IIC的时序,从而对IIC设备进行操作。这种设计方式简单明了,但使用IIC子系统,可以更方便的移植和维护其他的设备驱动。

问题分析

Hisi对于gpio口,rtc芯片以及tw2865的处理方式如下:将gpio口做成一个模块化的驱动,该驱动模拟IIC时序,并向外提供一些函数接口,比如:EXPORT_SYMBOL(gpio_i2c_read_tw2815);等。对于具体的rtc芯片,将其注册为一个misc设备,并利用gpio模块导出的函数进行rtc芯片的配置操作。

其实对于linux-2.6.24\drivers\i2c目录下代码,我们可以加以利用。

Linux的IIC字结构分为三个组成部分:

IIC核心

IIC核心提供了IIC总线驱动和设备驱动的注册、注销方法,IICalgorithm上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码。

IIC总线驱动

IIC总线驱动是对IIC硬件体系结构中适配器端的实现。

IIC设备驱动

IIC设备驱动是对IIC硬件体系总设备端的实现。

我们查看下该目录下的makefile和kconfig:

obj-$(CONFIG_I2C_BOARDINFO) +=i2c-boardinfo.o

obj-$(CONFIG_I2C) += i2c-core.o

obj-$(CONFIG_I2C_CHARDEV) +=i2c-dev.o

obj-y +=busses/ chips/ algos/

i2c-core.c就是IIC核心,buses中的文件是主流处理器中IIC总线的总线驱动,而chips中的文件就是常用芯片的驱动,algos中的文件实现了一些总线适配器的algorithm,其中就包括我们要用到的i2c-algo-bit.c文件。

我们首先利用i2c-gpio.c和i2c-algo-bit.c做好总线驱动。

在i2c-gpio.c中,mole_initi2c_gpio_initplatform_driver_probe(&i2c_gpio_driver,i2c_gpio_probe);

将其注册为platform虚拟总线的驱动。

在staticint __init i2c_gpio_probe(struct platform_device *pdev)中,

定义了如下三个结构体:

structi2c_gpio_platform_data *pdata;//平台相关的gpio的设置

structi2c_algo_bit_data *bit_data;//包含algorithm的具体函数,setor
get SDA和SCL

structi2c_adapter *adap;//适配器

i2c_gpio_probe主要做了下面几件事:

填充bit_data结构的各个函数指针,关联到具体的操作SDA和SCl函数。

填充adap结构,adap->algo_data= bit_data;

pdata= pdev->dev.platform_data;

bit_data->data= pdata;

pdev->dev->driver_data= adap;

在i2c-core中注册适配器类型。

inti2c_bit_add_numbered_bus(struct i2c_adapter *adap)

在staticint i2c_bit_prepare_bus(struct i2c_adapter *adap)中

adap->algo= &i2c_bit_algo;

将i2c_bit_algo与adap关联上。

static const structi2c_algorithm i2c_bit_algo = {

.master_xfer = bit_xfer,

.functionality = bit_func,

};

其中,master_xfer函数指针就是IIC传输函数指针。

I2c-algo-bit.c还实现了IIC开始条件,结束条件的模拟,发送字节,接收字节以及应答位的处理。

i2c-gpio.c中的i2c_gpio_setsda_val等函数是与具体平台gpio相关的。

修改对应arch-hi3520v100目录下的gpio.h中的各个函数,这些函数是通过操作寄存器来控制gpio的方向和值。

在对应mach-hi3520v100中的platform-devices.c中添加如下:

static structi2c_gpio_platform_data pdata = {

.sda_pin = 1<<0,

.sda_is_open_drain = 1,

.scl_pin = 1<<1,

.scl_is_open_drain = 1,

.udelay = 4, /* ~100 kHz */

};

static struct platform_devicehisilicon_i2c_gpio_device = {

.name = "i2c-gpio",

.id = -1,

.dev.platform_data = &pdata,

};

static struct platform_device*hisilicon_plat_devs[] __initdata = {

&hisilicon_i2c_gpio_device,

};

int __inithisilicon_register_platform_devices(void)

{

platform_add_devices(hisilicon_plat_devs,ARRAY_SIZE (hisilicon_plat_devs));

return 0;

}

通过platform添加devices和driver,使得pdev->dev.platform_data=pdata

综合上面的过程,我们完成了adapter的注册,并将用gpio口模拟的algorithm与adapter完成了关联。

这样,在rtc-x1205.c中,x1205_attach函数利用i2c核心完成client和adap的关联。

在x1205_probe函数中填充i2c_client结构体,并调用i2c_attach_client通知iic核心。

接着注册rtc驱动。

最后我们要读取时间,就需要构造i2c_msg结构体,如下所示:

struct i2c_msg msgs[] = {

{ client->addr, 0, 2,dt_addr }, /* setup read ptr */

{ client->addr, I2C_M_RD,8, buf }, /* read date */

};

/* read date registers */

if((i2c_transfer(client->adapter, &msgs[0], 2)) != 2) {

dev_err(&client->dev,"%s: read error\n", __FUNCTION__);

return -EIO;

}

dt_addr是寄存器的地址,I2C_M_RD表示iicread。

❿ 在linux上怎样增加一个i2c设备

假设手上有一块从淘宝上买来的开发板,我要在开发板的I2C总线上增加一个从设备(如at24c08),那么我要怎样写这个“I2C设备驱动”,让

应用程序可以访问at24c08呢?

先来看一个最简单的i2c设备驱动:
static struct i2c_board_info at24cxx_info = { //所支持的i2c设备的列表
I2C_BOARD_INFO("at24c08", 0x50), //一项代表一个支持的设备,它的名字叫做“at24c08”,器件地址是0x50
};
static struct i2c_client *at24cxx_client;
static int at24cxx_dev_init(void)
{
struct i2c_adapter *i2c_adap; //分配一个适配器的指针
i2c_adap = i2c_get_adapter(0); //调用core层的函数,获得一个i2c总线。这里我们已经知道新增的器件挂接在编号为0的i2c总线上
at24cxx_client = i2c_new_device(i2c_adap, &at24cxx_info); // 把i2c适配器和新增的I2C器件关联起来,这个用了i2c总线0,地址是0x50。这就组成了一个客户端
at24cxx_client i2c_put_adapter(i2c_adap);
return 0;
}
static void at24cxx_dev_exit(void)
{
i2c_unregister_device(at24cxx_client);
}
mole_init(at24cxx_dev_init);
mole_exit(at24cxx_dev_exit);

从上面的程序可以看到,写一个i2c设备驱动程序,与写普通的字符驱动基本一样。特别之处是它调用了i2c的core层的函数,以获得对i2c总线的控制。因为用的是开发板,板上的与soc芯片(一般来说就是arm的芯片)i2c总线驱动一般都做好了,直接调用core层的函数就可以控制soc的i2c模块了。也就是说,写i2c设备驱动不需要关注arm内部的i2c模块的寄存器,我们需要关注的是设备(at24c08)的寄存器以及它的datasheet对时序的要求。

其实,添加i2c设备的方法很灵活。根据Linux的官方文档《linux-3.4.2\Documentation\i2c\instantiating-devices》,添加i2c设备的方法总结有4种:

1. i2c_register_board_info:根据总线编号、设备名字(“at24c08”)、设备地址(0x50)注册一个字符驱动。这种方法最简单、最粗暴,最贴近平时在开片机上开发i2c器件的。

2. i2c_new_device:根据i2c总线的编号,声明一个i2c设备:这种方法就是上面例子用的方法。这种方法也简单,但是需要事先知道器件挂接在哪条总线上。对于设备,还实现知道了设备地址0x50,总线适配器也支持名字为“at24c08”的设备

3. i2c_new_probed_device:

4.从用户空间实例化一个器件:这个方法相当智能快速,如下输入指令,即可增加一个i2c设备,同时增加了对应的设备文件。

# echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device

根据英文文档的标题,添加i2c设备有称之为“i2c设备的实例化”。

从上述可以知道,在实例化一个i2c设备之前,除了有对应的驱动支持总线外(这里是总线0),还需要有一个驱动使用了总线0发送时序,支持名字为"at24c08"的器件。这个驱动用总线驱动的函数,配置了at24c08的寄存器。

阅读全文

与linuxi2c相关的资料

热点内容
隐身侠加密宝手机版 浏览:135
农行app怎么办理签约手续 浏览:185
汽车压力解压神器 浏览:307
家用冰箱压缩机有风扇吗 浏览:647
安卓qq年龄怎么看 浏览:839
屏幕跳屏乱点app怎么解决 浏览:414
turbo加速器android 浏览:432
洪尚秀的电影哪里哪个app能看 浏览:151
百度网站加密视频怎么下载 浏览:135
台州ug产品编程培训班 浏览:866
Javalinux字体 浏览:520
77万年会程序员补贴 浏览:610
灭火是由近及源码 浏览:158
资料服务器地址 浏览:8
网页怎么放在服务器商 浏览:995
服务器出差错是什么原因 浏览:595
如何修改通达信主图指标源码 浏览:352
联想硬盘加密教程 浏览:65
无锡江苏服务器服务商云服务器 浏览:657
服务器systembooting什么意思 浏览:994