27.3.4.2内核下的I2C驱动(二)

网友投稿 725 2022-05-30

用户态直接访问,使用内核提供的驱动程序

dev-interface

注意,不要直接使用read(),write()操作函数,直接使用i2c_smbus_write_word_data,i2c_smbus_read_word_data。官方文档给了说明,如下

驱动程序编译进内核才有效,I2c-dev.c依赖于那些配置项,查看Makefile

makemenuconfig,搜索CONFIG_I2C_CHARDEV

重启内核,编译新内核,之后下载到开发板

测试代码

#include #include #include #include #include #include #include "i2c-dev.h" /* i2c_usr_test r addr * i2c_usr_test w addr val */ void print_usage(char *file) { printf("%s r addr\n", file); printf("%s w addr val\n", file); } int main(int argc, char **argv) { int fd; unsigned char addr, data; int dev_addr; if ((argc != 5) && (argc != 6)) { print_usage(argv[0]); return -1; } fd = open(argv[1], O_RDWR); if (fd < 0) { printf("can't open %s\n", argv[1]); return -1; } dev_addr = strtoul(argv[2], NULL, 0); if (ioctl(fd, I2C_SLAVE, dev_addr) < 0) { /* ERROR HANDLING; you can check errno to see what went wrong */ printf("set addr error!\n"); return -1; } if (strcmp(argv[3], "r") == 0) { addr = strtoul(argv[4], NULL, 0); data = i2c_smbus_read_word_data(fd, addr); printf("data: %c, %d, 0x%2x\n", data, data, data); } else if ((strcmp(argv[3], "w") == 0) && (argc == 6)) { addr = strtoul(argv[4], NULL, 0); data = strtoul(argv[5], NULL, 0); i2c_smbus_write_byte_data(fd, addr, data); } else { print_usage(argv[0]); return -1; } return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

27.3.4.2内核下的I2C驱动(二)

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:win10系统去除此电脑中的六个文件夹+3D对象
下一篇:LabVIEW控制Arduino实现模拟数据采集(基础篇—8)
相关文章