출처 : http://forum.falinux.com/zbxe/index.php?document_srl=504163&mid=ezboard


1. 보드에서 i2c 드라이버의 Major, minor 번호를 찾습니다.
    cat /proc/devices

2. nodefile 을 만듭니다.
   mknod /dev/i2c-0   c  Major  minor

3. 프로그램을 작성합니다.  
     fd = open( "/dev/i2c-0", O_RDWR );  // 만들어진 노드파일을 엽니다.

4. 접근할 디바이스의 슬레이브주소를 설정합니다.
     ioctl( fd, I2C_SLAVE, ADDR_MY_DEV );

5.  write 할때
     unsigned char buf[32];

     buf[0] =  0x10;   // 접근할 디바이스의 레지스터 주소
     buf[1] =  0xaa;   // 0x10 번지에 쓸 데이타
     buf[2] =  0xbb;   // 0x11 번지에 쓸 데이타

     rtn = write( fd, buf, 3 );    // reg_addr + data + data  버퍼의 유효개수는 3개이다.
     rtn 값으로 성공했는지 확인한다.

6.  read 할때
     unsigned char buf[32];

     buf[0] =  0x10;   // 접근할 디바이스의 레지스터 주소

     rtn = write( fd, buf, 1 );    // 접근할 레지스터의 주소를 설정한다.
     rtn 값으로 성공했는지 확인한다.

     rtn = read( fd, buf, 2 );    //  2개의 데이타를 읽어온다.
     rtn 값으로 성공했는지 확인한다.




출처 : http://www.aesop.or.kr/index.php?mid=Board_Community_QandA&sort_index=regdate&order_type=asc&listStyle=webzine&page=11&document_srl=24015



제가 하는 방식인데 쩝.. 
커널에 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 의 문서를 참고로 하셔서 쓰시면 됩니다.

Posted by Real_G