linux IIC子系统分析(八)——实例分析通过sysfs访问I2c设备

在linux2.6.32.2内核中已经实现对AT24CXX(EEPROM)驱动测支持,在这里我们只需要将它移植到我们工程中即可。

一直步骤:

(1)配置内核:I2C support

(2)配置内核:Misc devices --> EEPROM support -->   <*> I2C EEPROMs from most vendors   

(3)在/linux-2.6.32.2/arch/arm/mach-s3c2440/math-mini2440.c中添加:

#include <linux/i2c/at24.h>
#include <linux/i2c.h>
static struct s3c24xx_mci_pdata mini2440_mmc_cfg = {
   .gpio_detect   = S3C2410_GPG(8),
   .gpio_wprotect = S3C2410_GPH(8),
   .set_power     = NULL,
   .ocr_avail     = MMC_VDD_32_33|MMC_VDD_33_34,
};


static struct at24_platform_data at24c02 = {
	.byte_len	= SZ_2K / 8,
	.page_size	= 8,
	.flags		= 0,
};

static struct i2c_board_info __initdata smdk_i2c_devices[] = {
	/* more devices can be added using expansion connectors */
	{
		I2C_BOARD_INFO("24c02", 0x50),
		.platform_data = &at24c02,
	},
};

在函数static void __init mini2440_machine_init(void) 中添加:

i2c_register_board_info(0, smdk_i2c_devices, ARRAY_SIZE(smdk_i2c_devices));

重新编译内核烧入开发板中,可以看到sys中的文件:

[root@FriendlyARM 0-0050]# pwd
/sys/devices/platform/s3c2440-i2c/i2c-0/0-0050
[root@FriendlyARM 0-0050]# ls
driver     eeprom     modalias   name       subsystem  uevent
[root@FriendlyARM 0-0050]# cat name
24c02
[root@FriendlyARM 0-0050]# 


eeprom即为驱动导出的bin 属性

(4)编写测试应用程序:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/io.h>

int main(int argc, char **argv)
{
	int ret, fd, i, j;
	char read_data[256];
	char write_data[256];
	char offset;
	
	fd = open("/sys/devices/platform/s3c2440-i2c/i2c-0/0-0050/eeprom", O_RDWR);
	if(fd < 0){
		printf("Open at24c02 fail\n");
		return -1;
	}
	
	ret = read(fd, &offset, 1);
	if(ret < 0){
		printf("Read error\n");
		return -1;
	}else if(ret < 1){
		perror("Incomplete read\n");
		printf("%d\n", ret);
		return -1;
	}
	
	for(i = 0; i < 256; i++)
		write_data[i] = offset+ 1 + i;
	
	lseek(fd, 0 , SEEK_SET);		//It's a must, or something wierd will happen
	
	ret = write(fd, write_data, 256);
	if(ret < 0){
		printf("Write error\n");
		return -1;
	}
	
	lseek(fd, 0 , SEEK_SET);	 //It's a must, or something wierd will happen
	
	ret = read(fd, read_data, 256);
	if(ret < 0){
		printf("Read error\n");
		return -1;
	}else if(ret < 256){
		perror("Incomplete read\n");
		printf("%d\n", ret);
		return -1;
	}
	
	for(i = 0; i < 256; i++){
		if(i %16 == 0)
			printf("\n");
		printf(" %03d ", read_data[i]);

	}	
	printf("\n");					
}

将测试程序编译烧入开发板中可以看到:

[root@FriendlyARM /test]# ls
dev_i2c  sys_i2c
[root@FriendlyARM /test]# chmod 777 sys_i2c 
[root@FriendlyARM /test]# ./sys_i2c 

 001  002  003  004  005  006  007  008  009  010  011  012  013  014  015  016 
 017  018  019  020  021  022  023  024  025  026  027  028  029  030  031  032 
 033  034  035  036  037  038  039  040  041  042  043  044  045  046  047  048 
 049  050  051  052  053  054  055  056  057  058  059  060  061  062  063  064 
 065  066  067  068  069  070  071  072  073  074  075  076  077  078  079  080 
 081  082  083  084  085  086  087  088  089  090  091  092  093  094  095  096 
 097  098  099  100  101  102  103  104  105  106  107  108  109  110  111  112 
 113  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128 
 129  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144 
 145  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160 
 161  162  163  164  165  166  167  168  169  170  171  172  173  174  175  176 
 177  178  179  180  181  182  183  184  185  186  187  188  189  190  191  192 
 193  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208 
 209  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224 
 225  226  227  228  229  230  231  232  233  234  235  236  237  238  239  240 
 241  242  243  244  245  246  247  248  249  250  251  252  253  254  255  000 
[root@FriendlyARM /test]# 

说明:

1.分析的内核版本是linux2.6.32.2

2.开发板为友善之臂的mini2440, 用的是ARM9(S3C2440A)处理器

3.连接的IIC设备是EEPROM(AT24C02)

---------------------------------------2022.08.20:21:21更新----------------------------------------

由于各种原因,后续文章内容将更新到公众号,本平台将不再做更新。

CSDN上相关文章的测试工程代码,也统一放到了公众号上,可以免费免积分下载

可以通过主页上的二维码,也可以通过搜索微信公众号 liwen01 进入公众号

liwen01   2022.08.20

---------------------------------------2022.08.20:21:21更新----------------------------------------

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li_wen01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值