i2c 통신을 하려고 아래와 같이 코딩을 했습니다.
어드레스는 잘 나가는데 다음 buf[0]가 한바이트 오른쪽으로 쉬프트된 값이 출
력되는군요
buf[1]에 넣은 값은 정상적으로 나옵니다.
ex)buf[0]에 AA값이면 오실로스코프에 잡히는 값은 55입니다.
커널 소스를 봐도 데이터가 쉬프트 될만한 코드는 보이질 않는군요.

연속으로 두개의 i2c명령을 내보낼때 처음 buf[0]만 데이터가 오른쪽으로 한비
트 쉬프
트 되고 나머지는 정상적으로 출력이 됩니다.
혹시나 해서 커널 소스의 iic_s3c2800_txdata()함수에 printk문을 넣어서
S3C2800_IICDS 레지스터에 넣을 값을 프린터 해봤습니다.
이 값이 틀릴리야 없겠죠!^_^ 값은 정상입니다.
그런데 오실로 스코프에 잡힌 값이 이상해 지더군요.
어드레스가 두번 연속 날아가고 좀 뒤에 AA가 출력되더군요.그리고 stop.
어드레스가 두번 나가는건 FALINUX에서 아려주신것 처럼 S3C2800_IICDS에 데이
터를 넣은후 ack 발생 후 다음 데이터를 바로 넣지 않으면 전에 넣어던 값이
또 나가는거로 생각됩니다.

그래서 쉬프트 되는 원인은 (제가 엽기적인 생각을 해본건) 어드레스가 날아간
후 다음 데이터를 내보내려고 S3C2800_IICDS레지스터의 한 비트를 읽었을 때는
아직 다음 출력할 데이터가 안들어 온 생태이고 두번째 비트를 출력할때 다음
에 출력할 데이터가 들어와서 쉬프트 된게 아닌가 하는 엽기적인 생각을 해봤
습니다.
어드래스의 최상위 비트가 1인 어드레스로(예 0x60=>S3C2800_IICDS에 써지는
값은 0x60) i2c를 날리면 어드레스 날아간 후 첫번째 바이트의 첫 비트는 항상
1입니다.
전에 S3C2800_IICDS레지스터에 쓴 값의 최상위 비트가 1이었거든요.
////////////////////////////////////////////////////////////////////
file = open("/dev/i2c-0",O_RDWR);

rdwr_arg.nmsgs = 2;
rdwr_arg.msgs[0].addr = CHIP_ID
rdwr_arg.msgs[1].addr = CHIP_ID
rdwr_arg.msgs[0].flags = 0;
rdwr_arg.msgs[1].flags = 0;
rdwr_arg.msgs[0].len = 2;
rdwr_arg.msgs[0].len = 2;
rdwr_arg.msgs[0].buf = &buf[0];
rdwr_arg.msgs[0].buf = &buf[2];
buf[0] = 0xAA;
buf[1] = 0xFF;
buf[2] = 0xAA;
buf[3] = 0xFF;


res = ioctl(file, I2C_RDWR, &rdwr_arg);
close(file);



///////////////////////////////////////////////////////////
커널은 CD롬의 기본 커널에서 rtl8139와 pcap을 사용할수 있도록 옵션 몇개를
바꾼후 컴팡리 해서 올렸습니다.
FALINUX에서 준 오리지널 이미지로도 해봤지만 마찮가지로 어드레스 다음 데이
터는 한비트 오른쪽으로 쉬프트되는군요.