snifer

【原创】基于嵌入式系统的I2C驱动编写及测试

0
阅读(2368)

放假了,每天亚历山大。

今天给一个同学一起编写一个基于i2c总线的温度传感器的驱动,与大家分享一下。

用到的设备如下:

主机:Ubuntu 10.10

目标机:FS_S5PC100

目标机内核版本:2.6.35

交叉编译器版本:arm-none-linux-gnueabi-gcc-4.5.1

主要步骤:

修改gedit drivers/i2c/busses/Kconfig

修改

config I2C_S3C2410

tristate "S3C2410 I2C Driver"

depends on ARCH_S3C2410 || ARCH_S3C64XX

help

Say Y here to include support for I2C controller in the

Samsung S3C2410 based System-on-Chip devices.

为:

config I2C_S3C2410

tristate "S3C2410 I2C Driver"

depends on ARCH_S3C2410 || ARCH_S3C64XX || ARCH_S5PC100

help

Say Y here to include support for I2C controller in the

Samsung S3C2410 based System-on-Chip devices.

内核配置并重新编译内核

$ make menuconfig

Device Drivers --->

<*> I2C support --->

<*> I2C device interface

I2C Hardware Bus support --->

<*> S3C2410 I2C Driver

$ make zImage

一、用户模式驱动别写

1、拷贝模块到linux

将实验代码中的s5pc100_temp_app拷贝到/home/linux目录下并进入s5pc100_temp_app目录。

2、编译模块

$ make

3、编译应用程序

$ arm-none-linux-gnueabi-gcc temp_app_mode.c –o temp_app_mode

4、拷贝应用程序到目标板上

$ temp_app_mode /source/rootfs

5、测试

# ./temp_app_mode

用手按住温度传感器会发现值会改变

这个值是16进制数,前两位代表度,后两位是小数点后的值,大家可以自己转换一下

二、使用内核i2c子系统构建驱动

1、修改平台代码并重新编译内核

修改arch/arm/mach-s5pc100/mach-smdkc100.c

修改:

static struct i2c_board_info i2c_devs0[] __initdata = {

};

为:

static struct i2c_board_info i2c_devs0[] __initdata = {

{

I2C_BOARD_INFO("lm75", 0x48),

},

};

$ make zImage

2、拷贝模块到linux

将实验代码中的s5pc100_temp拷贝到/home/linux目录下并进入s5pc100_temp目录。

3、编译模块

$ make

4、编译应用程序

$ arm-none-linux-gnueabi-gcc test.c –o test

5、拷贝驱动及应用程序到目标板上

$ cp s5pc100_temp.ko test /source/rootfs

6、启动开发板后加载模块

# insmod s5pc100_temp.ko

7、创建设备节点

# mknod /dev/temp c 250 0

8、测试

# ./test

希望大家能开心每天。


Baidu
map