一、AT24C02的驱动支持
Linux系统本身就支持I2C的驱动,下面就来看一下,在Linux下如何通过I2C总线访问AT24C02芯片。
先运行命令“make menuconfig”打开内核配置对话框,然后勾选Device Drivers->I2Csupport项,再勾选Device Drivers->Misc devices->EEPROM support->I2C EEPORMs from most vendors项。这样配置后,内核就支持I2C总线和EEPROM器件了。
接下来需要修改文件arch/arm/mach-s3c24xx/mach-smdk2416.c,用vi打开它,先在包含头文件部分加入一句“#include < linux/i2c/at24.h >”,把AT24C02芯片的头文件包含进来。然后找到结构体“static struct platform_device *smdk2416_devices[] __initdata”定义这一句,在此句前加入几个空行,然后输入下面的内容(注:不是插入在结构体内,是插在结构体之前!):
static struct at24_platform_data at24c02 = {
.byte_len = SZ_2K / 8,
.page_size = 8,
.flags = 0,
};
static struct i2c_board_info __initdata smdk_i2c_devices[] = {
{
I2C_BOARD_INFO("24c02", 0x50),
.platform_data = &at24c02,
},
};
添加完成后,在刚才找到的结构体内,相看是否有一句“&s3c_device_i2c0,”,如果没有需要添加这一句,以向内核注册I2C总线驱动。
上面添加的参数是根据AT24C02来确定的,使用8位地址,内存大小为2K比特位,页大小为8字节,如果换用其它芯片需要酌情进行修改。另外还需要说明的是,AT24C02的设备地址是0b1010000R/W,其最低位是读写标志位,但在Linux中,I2C设备地址的最高位为0,而低七位地址就则是去掉R/W的剩余7位。所以AT24C02在Linux中的地址为0b01010000(0x50)。
接下来再往下查找,找到设备初始化函数“static void __init smdk2416_machine_init(void)”,并在其中合适的位置(可放在最后一句smdk_machine_init();之前)增加下面一句:
i2c_register_board_info(0, smdk_i2c_devices, ARRAY_SIZE(smdk_i2c_devices));
完成后存盘退出,然后重新编译整个Linux内核,生成的内核就能够支持I2C总线的AT24C02芯片了。把编译好的内核写入开发板,确保开发板上的AT24C02已连接好,启动开发板,进入/sys/devices/platform/s3c2410-i2c/i2c-0目录下,正常的话可看到一个名为“0-0050”的目录,若没有这个目录很可能是AT24C02没接好或没上电。可看到其实该目录的名称就是AT24C02的地址。进入该目录,可看到一个名为“eeprom”的设备文件,写这个文件可把信息存入AT24C02中(如执行echo “hello” > eeprom),读取这个文件可获得AT24C02中存储的内容(如执行cat eeprom),如下图所示。保存在AT24C02中的内容掉电不会消失,并且它的读写可按字节,其寿命也要大于传统的NAND FLASH。
二、DS18B20的驱动支持
Linux系统本身就支持Dallas公司的单总线(1-wire)设备驱动,下面就来看一下,在Linux下如何通过单总线访问DS18B20测试传感器。
Linux内核的Dallas单总线设备驱动在/drivers/w1目录下,分为Master和Slave两种模式。Master目录下为主控制器驱动,这里使用w1-gpio.c,它是单总线的I/O操作方法,用于模拟单总线时序;Slave目录下是从设备驱动,由于DS18B20属于温度传感器,所以这里使用w1_therm.c,它负责操作DS18B20内部寄存器的读写。
先运行命令“make menuconfig”打开内核配置对话框,然后勾选Device Drivers->Dallas’s 1-wire support项,再勾选Device Drivers->Dallas’s 1-wire support->1-wire Bus Masters->GPIO 1-wire busmaster项和Device Drivers->Dallas’s 1-wire support->1-wire Slaves->Thermal family implementation项。这样配置后,内核就支持DS18B20器件了。
接下来需要修改文件arch/arm/mach-s3c24xx/mach-smdk2416.c,用vi打开它,先在包含头文件部分加入一句“#include < linux/w1-gpio.h >”,把单总线设备的头文件包含进来。然后找到结构体“static struct platform_device *smdk2416_devices[] __initdata”定义这一句,在此句前输入下面的内容(注意事项和前面一样):
static void w1_enable_external_pullup(int enable)
{
if (enable)
s3c_gpio_setpull(S3C2410_GPB(5), S3C_GPIO_PULL_UP);
else
s3c_gpio_setpull(S3C2410_GPB(5), S3C_GPIO_PULL_NONE);
}
static struct w1_gpio_platform_data ds18b20_w1_gpio = {
.pin = S3C2410_GPB(5),
.is_open_drain = 0,
.enable_external_pullup = w1_enable_external_pullup,
};
static struct platform_device s3c_device_ds18b20 = {
.name = "w1-gpio",
.id = -1,
.dev = { .platform_data = &ds18b20_w1_gpio, },
};
注意,上述默认DS18B20是接在引脚GPB5上的,若接在其它引脚上,上述代码中的S3C2410后面的值要依据实际的引脚来进行更改。另外,设备名称“w1-gpio”要与w1-gpio.c驱动中的驱动名称一致,这样才能向内核注册这个设备驱动。
添加完成后,在刚才找到的结构体内,添加一句“&s3c_device_ds18b20,”,以向内核注册DS18B20芯片驱动。
完成后存盘退出,然后重新编译整个Linux内核,生成的内核就能够支持单总线的DS18B20芯片了。把编译好的内核写入开发板,然后在开发板上接好DS18B20传感器,启动开发板,进入/sys/devices目录下,正常的话可看到一个名为“w1_bus_master1”的目录,若没有这个目录很可能是DS18B20没接好或没上电。进入该目录,可看到一个以“28-”开头的目录,这就是当前DS18B20传感器的主目录,其目录名称的后面为该片DS18B20的ID号,若有多片DS18B20会有多个这样的目录。进到该目录下,会看到一个名为“w1_slave”的设备文件,读取这个文件就可获得温度及设备的相关信息(可执行cat w1_slave),如下图所示。其中“t=”后面的数字就是测得的当前温度,要在千位的后面加上小数点,图中的温度为17.625摄氏度。
原文地址:https://www.cnblogs.com/fxzq/p/12275272.html