기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
FM 라디오 드라이버 작성하는 건 아직 초보이고...
빨리 해야하는 압박감에..다른 방법으로 눈을 돌렸습니다..
어플리케이션에서 /dev/i2c-0 에 접근하여 하는 방법이 있는 듯 해서 아래있는 코드를 작성해 보았습니다.
일단 프로그램 돌렸을때 에러는 발생하지 않고 무난하게 실행은 됩니다..
<궁금한 점>
1. 16bit의 값을 write 하고 read 해야하는데..아래 같은 방법으로 가능할까요?
2. write함수로 칩의 내부 레지스터를 지정하고
다시 write함수로 값을 전달할 수 있을까요?
3. write함수로 칩의 내부 레지스터 를 지정하고
read함수로 2byte 만큼 읽어올 수 있을까요?
아래 코드는 이재훈님이 작성한 aesop2440에서 tvp5150디바이스를 제어한 테스트 코드가 있는 pdf파일에서 보고 작성한 내용입니다.
이 코드를 저는 아래의 주석과 같이 이해를 하고 있는데 맞는지 궁금합니다..
조언 부탁드립니다..
int main ()
{
int file;
char filename[20] = "/dev/i2c-0";
int addr = 0x10>>1;
unsigned short data = 0x0000;
unsigned short magic = 0x0000;
printf("SI4702 Radio Chip Test...n");
if ((file = open(filename, O_RDWR)) < 0)
{
printf("nFile Open Error");
exit(1);
}
if (ioctl(file, I2C_SLAVE, addr) < 0)
{
printf("nSlave Address Error");
exit(1);
}
//칩 내부 레지스터 주소 02에 0x4001이라는 2byte 데이타를 write
write(file, 0x02, 1);
write(file, 0x4001, 2);
delay();
//칩 내부 레지스터 주소 07에서 magic이라는 변수에 2byte 만큼 읽어오기
write(file, 0x07, 1);
read(file, &magic, 2);
printf("nMagic number : 0x%x", magic);
write(file, 0x00, 1); //register set
read(file , &data, 2); //read data
printf("nDevice ID : 0x%x", data);
close(file);
}
현재 테스트하고 있는 보드는 i2c-0 (GPB5, GPB6)에 디바이스 3개가 달려있습니다.
최종환 님께서 올린자료 (i2c-0에 연결된 디바이스 찾는 프로그램)를 실행해 보았는데 mt9d111(캠 관련..) 을 찾지 못합니다..
반면 mv6410에서는 디바이스를 찾는데..어떤 부분이 문제인지 잘 모르겠습니다.. 물론 같은 커널로 실행해 보았습니다..
mv6410과 틀린점이 있다면 디바이스 3개가 달려있고 현재 mv6410은 캠 하나 달려있다는 것입니다..
그리고 mv6410에서 i2c로 동작하는 캠을 부팅 초기부터 스코프로 찍어보았는데 클락만 발생하고 데이터는 아무런 신호가 없습니다..
그래도 캠은 잘 동작하는 것 같구요...
i2c로 센서만 초기화하고 넘어가도 뭔가 데이터가 나가고 들어오는 것을 볼 수 있을 것 같은데..보이질 않네요..
제대로 동작하는게 맞을까요?
조언 부탁드립니다..ㅜㅜ