기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

안녕하세요.

유저 어플단에서 I2C 디바이스를 오픈했습니다.

ioctl() 을 사용하여 I2C 어드레스를 지정했고 문제 없이 지정되었습니다.

이제 I2C 디바이스의 레지스터를 읽고 쓰고 하고 싶은데 open()을 했으니까 read(), write() 시스템 콜을 그대로 사용하면 될 거란 생각을 하고 있습니다.

예를 들어 레지스터 0x00, 0x10을 읽거나 쓸때 read(), write() 함수를 사용하려면 어떻게 레지스터의 어드레스를 지정해 줄 수 있을까요? 혹시 lseek() 를 사용해야 하나요?

우선은 무한루프 돌리면서 read(fd, buf, 1) 이런식으로 읽어 보았는데 어떤 레지스터의 정보인지는 알 수 없지만 계속 읽어 오긴 합니다. ㅎㅎㅎㅎ

도움글 부탁 드립니다.

고현철

2008.02.22 20:21:38
*.70.26.43

ioctl로 쓸겁니다....거의

드라이버 소스를 봐야하겠습니다만, 제 기억으로는 주로 ioctl만 사용했던것 같네요.

문철민

2008.02.22 22:29:36
*.234.26.181

eeprom의경우 ioctl로 read, write를 하고요, 인자에서 주소를 지정해줍니다. /linux/driver/i2c/i2c-eeprom.c를 보시면 쉽게 알수있을듯하네요

이종창

2008.02.25 23:15:39
*.136.171.200

드라이버 소스 및 해당 ic의 datasheet를 꼭 확인해야 합니다.
1. 해당 드라이버를 확인하시어,
static struct file_operations xxx_fops=
{
write : xxx_write,
read : xxx_read,
ioctl : xxx_ioctl,
};로 되어 있는 부분의 xxx_해당함수를 확인하세요.
그리고, i2c가 규격이므로 같은 방식으로 read/write 할수 있지만

2. 해당 chip의 datasheet를 보시면 read/write시 어떻게 해야하는지 나와있을 것입니다.
addresss / register 가 1byte 혹은 2byte일수 있으니 꼭 확인해야 합니다.

강효민

2008.02.26 20:54:50
*.5.254.223

제가 하는 방식인데 쩝..
커널에 Documentation/i2c/smbus-protocol 문서를 참조로 작업하시면 편하실겁니다.

- i2c open
sprintf(filename,"/dev/i2c-%d",adapter_nr);
if ((file = open(filename,O_RDWR)) < 0)
{
printf("nFile Open Error");
exit(1);
}

if (ioctl(file,I2C_SLAVE, addr) < 0) {
printf("nError : Slave Address...");
exit(1);
}
open & address 지정뒤
읽고자하는 레지스터를 아래와 같은 방식으로 읽으시면 됩니다.

t_reg = 0x83; //register address
t_value = 0x00; //register value

i2c_smbus_write_byte( file, t_reg );
t_value = i2c_smbus_read_byte( file );

printf("TVP5150 Rom Ver = 0x%xrn", t_value);

ic마다 address / register 가 틀리니 Documentation/i2c/smbus-protocol 의 문서를 참고로 하셔서 쓰시면 됩니다.
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
6288 [질문] 공구보드. 뽑기가 잘못되었나??? [2] 한영민 2007-05-08 4247
6287 [완료] LCD가 보드와 어떻게 연결이 되는지요. [4] 오주열 2007-05-01 4224
6286 MAX77686 Deep Sleep시 깨어나지 않는 현상. [10] 마빡 2014-03-01 4219
6285 타겟보드에서 vlc 실행파일을 실행하면 아래의 메시지가 출력 됩니다... [1] 파란새 2013-12-25 4123
6284 [질문] WinCE 지원 지상파 DMB 모듈 [5] 한영민 2007-06-01 4060
6283 Exynos5410 ISP 제어 관련 질문입니다 [1] 선수 2013-10-21 4029
6282 U-BOOT 포팅중 질문사항 <= 완료 [4] 장석원 2006-04-07 4019
6281 [완료]usb cd-rom... [4] 이태간 2007-05-11 3866
6280 S5PV210 보드의 NAND mtd driver 및 partition 관련 문의사항 [3] frog 2012-08-07 3844
6279 2.6.13커널 디버그출력을 터미널로?[완료] [2] 김대영 2006-04-08 3842
6278 [질문]Touch Screen 관련 (XP) 오류 와 DoB [해결] [4] 김희만 2007-05-08 3828
6277 AMD x86 Geode LX800 .. 이 보드 구매할수 있나요? [3] 한재성 2007-06-22 3808
6276 2.6.13 최신 커널 소스는 어디서?[완료] [2] 김대영 2006-04-06 3790
6275 염치없지만 PCB DATA 파일을 공개하실수 있나요 [2] 정인수 2007-05-18 3784
6274 arndale보드에서 arndale-jb_mr1-es3로 부팅이 되지 않습니다. [15] 김영준 2013-10-09 3781
6273 현재 개발하고 계시는 cross-toolchain은 어디서?[완료] [2] 김대영 2006-04-06 3780
6272 arndale jb-mr1 es6 와이파이 문제 질문요. [7] 고로다 2013-10-22 3759
6271 [완료]LX800 VGA드라이버 질문드립니다. [4] 윤기현 2007-08-10 3755
6270 [질문] (하드웨어) 기판 두께가 얇은 이유? [1] 이동술 2007-05-09 3752
» I2C read, write 방법 질문입니다. [4] 김유석 2008-02-22 3746

사용자 로그인