今天给一个同学一起编写一个基于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
用手按住温度传感器会发现值会改变
<img id="aimg_c1Vsd" class="zoom" file="http://files.chinaaet.com/images/blog/2015/01/21/5440896012256.png" lazyloadthumb="1" border="0" alt="" />
这个值是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(&quot;lm75&quot;, 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
希望大家能开心每天。
—————————————————————————————————————— |