snifer

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

0
阅读(2591)

放假了,每天亚历山大。

今天给一个同学一起编写一个基于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 

希望大家能开心每天。