【原创】基于嵌入式系统的I2C驱动编写及测试
0赞放假了,每天亚历山大。
今天给一个同学一起编写一个基于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
希望大家能开心每天。