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

안녕하세요


지난번 디스플레이 관련 질문을 올렸었는데 답변을 친절히 해주셔서


다시 여기 찾아오게 되었습니다.


지금 제가 안드로이드 커널에 input device로 gesture 센서를 포팅하고 있습니다. 


센서 업체에서 아두이노 소스를 제공해줘서 그 내용을 바탕으로 드라이버를 짰습니다.


그런데 제가 짠 드라이버의 i2c 통신에서 에러가 발생합니다. 


그래서 제가 신경 쓴 부분들이 맞는지, 제가 놓치고 있는 부분이 있는지 확인 좀 부탁드릴려고 


이렇게 글을 쓰게 되었습니다. 일단 파일로 첨부 된 데이터 시트에서 Ambient Light Sensing (ALS) Part라는 파트는


사용 안하고 Gesture and Proximity Sensing (GS) Part 부분만 사용합니다.


아두이노 소스는 다음과 같습니다:

 Wire.beginTransmission(0x45);

  Wire.write(0x00);

  Wire.write(0xc0);

  Wire.write(0x62);

  Wire.write(0x01);

  Wire.write(0x50);

  Wire.endTransmission(1);


Wire.beginTransmission(0x45);

  Wire.write(0x10);

  Wire.endTransmission(0);

  Wire.requestFrom(0x45, 10);    // request 10 bytes from slave device


  i=0;

  while(Wire.available())

  { 

    unsigned char c = Wire.read(); // receive a byte as character

    switch (i) {

     ..... 생략


제가 데이터시트를 봤을 때 slave address가 0x45였고 

아두이노 소스에서 0x00 레지스터에 0xc0 과 0x62를 넣고 0x01레지스터에 0x50을 넣는걸 봐서


리눅스 드라이버에서 


    u8 op_data_buffer[3] = { 0x00, 0xC0, 0x62 };

    u8 cycle_data_buffer[2]= { 0x01, 0x50 };


    struct i2c_msg msgs[] = {

    {

        .addr = client->addr,

        .flags = 0,

        .len = 3,

        .buf = op_data_buffer,

        },

        {

        .addr = client->addr,

        .flags = 0,

        .len = 2,

        .buf = cycle_data_buffer,

        },

    };

  i2c_transfer(client->adapter,msgs,2); 로 보냈는데 리턴값이 음수가 나옵니다. 

  제가 omap4460 칩셋을 사용하는데 omap의 i2c 에러코드를 찾아보니 remote io error 라고 뜨더라고여...

  그래서 omap_i2c_xfer_msg 함수 내용을 보니 bus request에 대한 no ack 인거같은데...


   i2c device는

 

static struct i2c_board_info __initdata omap4dart_board_i2c_4_boardinfo[] = {

{

/* gesture_r */

I2C_BOARD_INFO("gesture_r", 0x45),

.irq            = OMAP_GPIO_IRQ(GESTURE_R_IRQ),

},

}; 로 0x45로 슬레이브 주소값을 설정하고 i2c bus에 이 구조체를 등록해서 probe까지 뜨는것을 확인했습니다.


제가 혹시 잘못 알고있거나 빠트린것이 있는지 가르쳐주시면 정말 감사하겠습니다. ㅠㅠ


쾌도난마

2015.09.30 18:00:40
*.49.29.2

0x45 >> 1

오른쪽 쉬프트 1개 하고 한번 해보세요.


데이타 시트 상에 write, read 주소를 0x44, 0x45 로 표현해 놓았을 것 같은데

그 device 의 address 는 앞에 7bit 0x22입니다.

리눅스 드라이버에서는 savle adress 를 적어 줘야 합니다. (read , write address 를 적어 주지 않습니다.)

(결국에는 kernel i2c framework driver가 

0x22 << 1 | (READ 1) 

or 

0x22 << 1 | (WRITE 0)  해서 내보낼 겁니다.)


그래도 안된다면 오실로 스코프로 한번 찍어보셔야 할 것 같네요.


고도리

2015.10.01 01:34:35
*.200.239.210

안되는 이유는 두가지가 있을텐데...


1. 하드웨어 상의 연결

2. 연결은 되어 있지만, slave address의 지정에의 문제.


두가지로 좁힐 수 있을겁니다.


일단, 안되면 찍어보는게 확실합니다.

ImYeol

2015.10.01 03:05:20
*.227.65.1

이상한 점이 slave address 는 아두이노 uno에서 연결해서 i2cdetect 로 찍어봤을 때는

슬레이브 주소가 잘 뜨는데 문제는 제가 가진 dart4460 이라는 보드에 연결했을 때는

i2cdetect 에서 주소가 뜨질 않네요.. 일단은 하드웨어 연결 문제인거 같은데...

mpu6050 이라는 IMU 센서는 gesture_r 이라는 센서와 스펙은 비슷한데 i2cdetect로 주소가 잘 뜨거든요..

그래서 비슷한 스펙을 똑같은 i2c에 똑같은 방법으로 물렸는데 하나는 되고 하나는 안되는게 어떤 문제가

있을지 감이 잘 안잡힙니다. 혹시 어떤 문제가 있을지 짐작이 가시는게 있으시면 가르쳐주셨으면 합니다. ㅠㅠ

고도리

2015.10.01 05:54:11
*.200.239.210

혹시 i2c 채널이 mpu6050 이랑 같은 채널인가요? 아니면 다른 채널인가요?


다른 채널이면 채널 확인 부탁드립니다........쓸 수 있는 채널인지? enable 되었는지?

밥줘잉

2015.10.07 07:17:47
*.101.99.147

주소 7비트/8비트 확인하시고,...


풀업저항은 달려있는지 확인해보시고,

AP의 내부풀업저항도 인에이블하셔요.


그리고, 아두이노소스와는 다르게 리눅스에서는 i2c를 버스 취급합니다.


먼저 slave device가 달려있는 버스를 통하여, 테스트를 해보고 slave device driver를 포팅하시는게,

좋을듯합니다.


**i2c.c에 아마도 slave_test_device()라는 함수가 있으니, 이함수로 먼저 테스트해보시길 바랍니다.

다른데에서 호출하려면 커널심볼 export하심 됩니다.


List of Articles
번호 제목 글쓴이 날짜 조회 수
6248 크로스 컴파일러 질문입니다. [2] vain 2015-12-30 254
6247 리눅스에서 인터럽트 트랜스퍼의 폴링인터벌을 조절할 수 있는 방법이... [1] 아라라라기 2015-12-26 215
6246 USB networ driver CDC NCM endpoint 질문 [10] 은민아빠 2015-12-23 699
6245 6410 Sleep Mode 질문 [1] 깜성 2015-12-18 254
6244 JNI 에서 V4L2를 사용할수 있나요? [5] biokk 2015-12-17 466
6243 안드로이드 버튼입력 지연 [2] 아라라라기 2015-12-15 211
6242 안드로이드 지자기 센서 포팅과 관련하여 질문드립니다. [4] ImYeol 2015-11-26 420
6241 /dev/mmcblk0rpmb가 나오게 하려면 어떻게 해야 하나요? [1] 혜민아빠 2015-11-19 204
6240 udev 를 이용하여 /dev 사용권한을 변경할수 있나요? [1] pedor11 2015-11-18 185
6239 camera HAL시 퍼미션을 얻을 수 있는가요? [2] 조신 2015-11-18 147
6238 slattach 기능을 안드로이드에서 이용할 수 있는 방법 문의드립니다 [4] 엘카 2015-11-03 276
6237 안드로이드 textureview로 동영상 재생시 black screen 질문드려요 새삶 2015-10-28 625
6236 arm컴파일러관련 질문인데요.. [2] pedor11 2015-10-23 267
6235 [안드로이드 서비스 실행관련] [1] 밥줘잉 2015-10-09 229
6234 리눅스 SDL 라이브러리로 4 채널 블랙박스 UI 성능이 나올지 잘 ... 파란새 2015-10-07 531
6233 키이벤트 관련 질문드립니다. [3] 하하호호하하 2015-10-06 188
6232 PWM Timer2 Prescaler값 변경시 시스템 시간 지연 문제? [3] 루벤94 2015-10-06 209
6231 Android HAL의 필요성? [4] Supsupi 2015-10-02 532
6230 AOSP user 모드 빌드 시 주의사항 질문드립니다. [1] 엘카 2015-09-26 255
» input device I2C 통신 관련 질문입니다. file [5] ImYeol 2015-09-25 621

사용자 로그인