mipi dsi 디스플레이를 한번 써 보려고 옛날 바나나파이인 m2 magic 이라는 친구를 구입했엇습니다.
시작부터 난관에 처했는데 BSP에 들어 있는 리눅스가 i2c slave 기능이 없었습니다.
처음엔 bus 드라이버에만 구현이 안되어 있는 줄 알았는데...
i2c-core에도 slave 기능이 안 만들어 져 있고 커널이 지원하는 i2c 기능 전체에 그냥 slave 기능이 존재하지 않더라고요.
필요한 부분을 다 읽고 이해해서 내가 필요한 기능을 옮겨 심는건 너무 무리다 싶어서...
포함된 i2c 드라이버 자체를 밀어 버리고.
i2c 컨트롤러의 레지스터에 직접 접근해서 딱 내가 쓸 기능 두가지만 구현하려고 개획을 잡았습니다.
"마스터로서 smb host notify를 보네기"
"슬레이브로서 반대쪽에서 보네주는 32바이트 짜리 데이터를 받기"
이것만 하면 되기 때문에 그렇게 빡세 보이지는 않았거든요..
https://github.com/BPI-SINOVOIP/BPI-M2M-bsp/blob/master/linux-sunxi/drivers/i2c/busses/i2c-sunxi.c
그래서 위에 있는 기존의 드라이버에서 초기화 과정을 가져 와서 태스트를 해 봤는데..
초기화가 되지 않더라고요.
제가 파악한 기존의 드라이버의 초기화 과정은
0. I2C 컨트롤러를 위한 클럭 게이팅 레지스터를 1로 설정 (어디서 발생하는지 확인 못했습니다. 데이터시트를 보고 필요하겠다고 생각했고 레지스터에서 변화를 확인했습니다.)
1. 레귤레이터 드라이버에 레귤레이터를 요청해서 활성화 요청-> SYSLOG를 보니 관련 레귤레이터는 없다는 로그가 찍히는걸 봐서 실재로는 해줄 필요가 없음
2. GPIO 드라이버에 요구해서 다목적 핀 PH3과 PH2를 i2c용으로 할당
3. 레지스터에 접근해서 버스를 활성화 하고
4. 클럭속도를 지정하는 과정
이러합니다...
0~3번은 제가 ioremap 으로 받은 가상주소로 접근해서 레지스터를 수정했을때 결과가 변하는데...
3~4번 과정은 그렇게 해도 i2c 컨트롤러의 매모리 공간인 0x01C2 AC00---0x01C2 AFFF 에 변화가 없습니다.
공간 전체가 00000000으로 되어 있고 writel 로 쓰기를 시도해도 모두 00000 이더라고요...
제가 뭘 빠뜨린 걸까요?
´ëºÎºÐÀÇ µå¶óÀ̹ö´Â ÀÌ °úÁ¤¿¡¼ »ðÀÔÇϰųª ¸ðµâ·Î Ãß°¡ °¡´ÉÇÕ´Ï´Ù
±× µå¶óÀ̹ö¿¡ i2c ÄÁÆ®·Ñ·¯¿¡ ÀÖ´Â ±â´ÉÀÌ ÀüºÎ ±¸ÇöµÇ¾î ÀÖÁö ¾ÊÀº°Ô ¹®Àç ¶ó¼¿ä.
¹ö½º µå¶óÀ̹ö ³»ºÎ¿¡¼ ÇÏ´Â ÀÏÀÌ ¾Æ´Ï´Ù º¸´Ï È®ÀÎÀ» ¸øÇß¾ú³×¿ä.