APP层: 参考文档:Documentation/i2c/dev-interface
准备工作:
(1)内核层:查看drivers/i2c目录下的Makefile文件。()是否有编译如下文件:i2c-core.c, i2c-dev.c, i2c-drive.c
(2)总线驱动层:在driver/i2c/busses目录下:看Makefile文件是否有i2c-s3c2410.0
(3)在linux目录下make menuconfig ,查看又没有把配置选进去,这个和Makefile的宏是等同的,比如
obj-$(CONFIG_I2C_MUX_GPIO) += i2c-mux-gpio.o ,那么可以在menuconfig搜索CONFIG_I2C_MUX_GPIO这个宏定义。
Device_Deivers--->I2c_support //i2c-core.c
---->i2c device interface //i2c-dev.c
---->i2c hardware bus support---->s3c2410 i2C Driver // i2c-s3c2410.c
(4)然后在linux根目录下:make uImage 编译生成内核烧录
注册设备
cat /proc/device //可以查看设备是否被注册成功
注册驱动------平台设备驱动
卸载设备
卸载驱动
i2cdetect -y 1 //此命令可以监测到IIC总线上所有的iic设备,用于确认iic子设备的设备地址
#include <linux/i2c-dev.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>
int main(int argc, char**argv)
{
int fd;
fd = open("/dev/i2c-1", O_RDWR);
if (fd < 0) {
perror("open failed\n");
exit(1);
}
int device_addr = 0x40; //硬件设备地址
if (ioctl(fd, I2C_SLAVE, device_addr) < 0) {
perror("ioctl failed\n");
exit(1);
}
char wbuf[10];
char register_addr = 0x3;
/* Using I2C Write*/
wbuf[0] = register_addr;
wbuf[1] = 0x5;
if (write(fd ,wbuf, 2) != 2) {
perror("write failed\n");
exit(1);
}
if (write(fd ,®ister_addr, 1) != 1) {
perror("write failed\n");
exit(1);
}
/* Using I2C Read*/
char rbuf[10];
if (read(fd, &rbuf[0], 1) != 1) {
perror("read failed\n");
exit(1);
} else {
printf("rbuf value = [%d]\n", rbuf[0]);
}
}
insmod -----
ls /sys/bus/i2c/devices/
1-003c
cat /sys/bus/i2c/devices/1-003c/name
oled