기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
안녕하세요 ?
제가 지금 i2c interface를 가지는 audio codec driver를 porting중인데, 궁금한 것이 있어서 문의드립니다.
아래 부분에 있는 code는 i2c interface인 audio codec의 register에 값을 writing하는 함수입니다.
(code의 간략화를 위해서 불필요한 부분은 삭제하였습니다.)
수정전의 원래 source는 아래의 <old_souce>이며, 수정한 source는 <new_source>입니다.
code에서, sub_addr은 audio codec의 register 주소입니다.
수정한 이유는 old_souce는 register address(=sub_addr)가 1byte인데,
new_souce에서는 register address(=sub_addr) 2byte이기 때문입니다.
수정한 부분을 분홍색으로 칠했습니다.
혹시, 수정이 잘못된 부분이 있으면 알려 주시면 감사하겠습니다.
<old_souce> void audio_i2c_write(unsigned char dev_addr, unsigned char sub_addr, unsigned char data) { struct i2c_msg msgs; unsigned char buf[2]; buf[0] = sub_addr; buf[1] = data; msgs.flags = 0; msgs.addr = dev_addr; msgs.len = 2; msgs.buf = buf; i2c_transfer(&audio_i2c->adap, &msgs, 1); } <new_source> void audio_i2c_write(unsigned char dev_addr, unsigned short sub_addr, unsigned char data) { struct i2c_msg msgs; unsigned char buf[3]; buf[0] = u8( 0x00ff & (sub_addr>>8) ); buf[1] = u8( 0x00ff & sub_addr ); buf[2] = data; msgs.flags = 0; msgs.addr = dev_addr; msgs.len = 3; msgs.buf = buf; i2c_transfer(&audio_i2c->adap, &msgs, 1); }
buf[0] 와 buf[1] 내용이 바뀐 것 같은데 확인해보시구요,
linux의 sound codec driver 면 ASoC를 사용할 것 같은데 이미 i2c 통신 interface가 ASoC에 구현되어 있습니다.
sound/soc/soc-cache.c 파일을 참고해 보세요