본문 바로가기

I2C

I2C 파형 read write 정리 찰칵찰칵 님의 I2C 정리 부분내가 본 한글 자료중 가장 잘 정리되어 있는 자료다. 원문 : http://cafe.naver.com/firstpicturestory/33 I2C 정리 -개념Inter-Integrated Circuit의 약자SCL(클럭), SDA(테이타)의 두개의 라인을 사용.100Kbit/s(Standard Mode)~3.4Mbit/s(High-speed Mode)까지의 양방향 통신.* 일반적으로 40~400Kbits의 속도로 사용됨 - 통신의특성 신호는 크게 Start, data, stop 로 나뉜다.Start 는 SCL 이 high 일 때 SDA 가 falling으로 가는 경우로 Slave 에게 I2C 의 시작 됨을알린다.Stop 는 SCL 이 high 일 때 SDA 가 rising으.. 더보기
I2C check 함수 i2c adapter 가 smbus 를 지원하는지 check 함. if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) return -EIO; 더보기
device driver check list (using I2C) I2C 드라이버를 사용하는 디바이스 드라이버를 작성할때 check list 이다. 모든 디버깅은 의심 포인트 리스트를 만들고 테스트 하기 쉬운것 -> 어려운것 순으로 하는것이 좋다. 문제를 해결했을때 처음에 내가 작성한 "의심 리스트"에 해당 문제가 없었다면 아직 경험이 부족하거나 관련 지식이 불충분한 것이다. 0. 모든 device driver 에 check list 0순위는 전원과 enable gpio high 이다. 1. slave address 보통 slave address 는 spec대로 입력하면 I2C 드라이버 내부적으로 1bit 를 왼쪽으로 shift 해서 사용한다. 혹시 I2C 가 계속 ACK fail 이 난다면 slave address 를 더보기
정식 i2c port 에 등록하여 사용하기 mach-모델명.c 파일등에서 i2c_board_info 구조체 형태로 각 포트에 맞게 이름과 slave address 를 저장합니다. static struct i2c_board_info i2c_devs0[] __initdata = { { I2C_BOARD_INFO("KXSD9", 0x18), }, /* accelerator */ { I2C_BOARD_INFO("USBIC", 0x25), }, /* uUSB ic */ { I2C_BOARD_INFO("max17040", 0x36), }, /* max17040 fuel gauge */ }; s3c_i2c0_set_platdata(NULL); i2c_register_board_info(0, i2c0_devs, ARRAY_SIZE(i2c0_devs)); 드라이.. 더보기
linux 에서 GPIO로 I2C Emulation 사용하기 mach-모델명.h code 에서 에뮬레이션 i2c device 등록 #define GPIO_TOUCH_SDA S3C64XX_GPC(5) static struct i2c_gpio_platform_data i2c_touch_platdata = { .sda_pin = GPIO_TOUCH_SDA, // gpio number .scl_pin = GPIO_TOUCH_SCL, .udelay = 2, .sda_is_open_drain = 0, .scl_is_open_drain = 0, .scl_is_output_only = 0 }; static struct platform_device sec_device_i2c_touch = { .name = "i2c-gpio", .id = 4, // adepter number .d.. 더보기
linux kernel 에서 i2c slave address 등록 위치 커널 버전 : 2.6.24.* 드라이버 코드들을 보다보면 다음과 같이 probe 함수에서 i2c_client 정보를 받아와서 사용하는 경우가 있다. static struct i2c_driver P_i2c_driver = { .driver = { .name = "P_driver", }, .probe = P_probe, ... }; static int P_probe (struct i2c_client *client) { ... if( strcmp(client->name, PROX_DEVICE_NAME) != 0 ) ... else if( (ret = P_dev_init(client)) < 0 ) ... P_dev.client = client; } 이러한 경우에 어느 곳에서 이것을 등록시켜 주어야 할지 난감한 .. 더보기