¿ù°£ Àα⠰Խù°

°Ô½Ã¹° 96°Ç
   
I2C ¶õ.....
±Û¾´ÀÌ : ÃÖ°í°ü¸®ÀÚ ³¯Â¥ : 2010-08-11 (¼ö) 17:29 Á¶È¸ : 13045
±ÛÁÖ¼Ò :
                          

Ãâó : http://achiven.tistory.com/entry/I2c¶õ

À̹ø Ä÷³¿¡¼­´Â I2C ¹ö½º¿Í À̸¦ ÀÌ¿ëÇÑ µð¹ÙÀ̽º¸¦ ¸®´ª½º¿¡¼­´Â ¾î¶»°Ô ´Ù·ç°í ÀÖ´ÂÁö¸¦ »ìÆ캸°í °ü·ÃµÈ µð¹ÙÀ̽º µå¶óÀ̹öÀÇ ±¸Á¶¸¦ ÆÄÇìÃÄ º¸°íÀÚ ÇÑ´Ù. Âü°í·Î ¿©±â¼­ ¼Ò°³ÇÏ´Â °ÍÀº Ä¿³Î 2.6À» ±âÁØÀ¸·Î ÇÏ°í ÀÖ´Ù.
µ¶ÀÚµéÀº I2C¶ó°í ÇÏ´Â ½Ã¸®¾ó ¹ö½º¸¦ ¾Æ´Â°¡? ÀÓº£µðµå ½Ã½ºÅÛÀ» °³¹ßÇÒ ¶§ ¿©·¯ µð¹ÙÀ̽º¸¦ ´Ù·ç´Ù º¸¸é ¾à¹æ¿¡ °¨ÃÊó·³ ÀÚÁÖ µîÀåÇÏ´Â ¹ö½º´Ù. 8ºñÆ® ¸¶ÀÌÅ©·Î ÄÁÆ®·Ñ·¯¸¦ ´Ù·ç´Â ÇÁ·Î±×·¡¸Ó¶ó¸é EEPROM³ª RTC¿Í °°Àº µð¹ÙÀ̽º¸¦ ´Ù·ç±â ¶§¹®¿¡ ¹Ýµå½Ã »ç¿ëÇÒ ¸¸Å­ Áß¿äÇÑ ¹ö½ºÀε¥ ¸®´ª½º¸¦ »ç¿ëÇÏ´Â ½Ã½ºÅÛÀ̶ó¸é µð¹ÙÀ̽º µå¶óÀ̹ö¿Í °ü·ÃµÈ »ç¿ë ¹®¼­¸¦ ¹ß°ßÇϱâ Èûµé±â ¶§¹®¿¡ Á¶±Ý ´Ù·ç±â °ï¶õÇÑ ¹ö½º¿Í µð¹ÙÀ̽º°¡ µÇ¾î ¹ö¸°´Ù. ±×·¡¼­ I2C¿Í ¿¬°áµÈ ÀåÄ¡¸¦ »ç¿ëÇϱâ À§ÇÑ ¸®´ª½º µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ¸¸µé ¶§ Á÷Á¢ I2C ¹ö½º¿Í °ü·ÃµÈ ÄÁÆ®·Ñ·¯³ª GPIO¸¦ Çڵ鸵Çؼ­ ó¸®ÇÏ´Â °æ¿ìµµ Á¾Á¾ º¸´Âµ¥ ¿©·¯ ȣȯ¼ºÀ» ¿°µÎ¿¡ µÎ¸é ÇÁ·ÎÁ§Æ®¾ß ÁøÇàµÇ°ÚÁö¸¸ ¾Æ¹«·¡µµ µÚ·Î ÂòÂòÇÑ ¿©¿îÀÌ ³²°Ô µÈ´Ù.
 
I2C¶õ ¹«¾ùÀΰ¡?
I2C(I-square-C, ¡®¾ÆÀ̽ºÄù¾î½Ã¡¯¶ó°í º¸Åë ºÎ¸¥´Ù)¶õ Çʸ³½º°¡ Á¦¾ÈÇÑ Åë½Å ¹æ½ÄÀÌ´Ù. Inter-IC¶ó°íµµ ºÒ¸®Áö¸¸ ÀÌ ¸íĪÀº ±×¸® Àß ¾²ÀÌÁö ¾Ê´Â ¸íĪÀÌ´Ù. I2C´Â ·ÎÄà ¹ö½º¶ó°í ºÎ¸£´Â º´·Ä ¹ö½º¿Í ´Ù¸£°Ô ÁÖº¯ ÀåÄ¡¸¦ ´ÜÁö µÎ °¡´ÚÀÇ ½ÅÈ£¼±À¸·Î¸¸ ¿¬°áÇÏ¿© µ¿ÀÛÇÏ´Â ¾ç¹æÇâ Á÷·Ä ¹ö½º ±Ô°ÝÀÌ´Ù. Çʸ³½º´Â TV, VCR, ¿Àµð¿À Àåºñ µî°ú °°Àº ´ë·® »ý»êµÇ´Â Á¦Ç°¿ëÀ¸·Î I2C ¹ö½º¸¦ ÀÌ¹Ì 20³â Àü¿¡ ¼Ò°³Çߴµ¥ Áö±ÝÀº ³»Àå ÀåÄ¡¸¦ ´Ù·ç±â À§ÇÑ »ç½Ç»óÀÇ Ç¥ÁØ ¼Ö·ç¼ÇÀÌ µÇ¾ú´Ù. I2C ¹ö½º¿¡´Â Ç¥ÁØ, °í¼Ó, ÃÊ°í¼Ó µî ¼Óµµ¿¡ µû¶ó ¼¼ °¡Áö µ¥ÀÌÅÍ Àü¼Û ¸ðµå°¡ ÀÖ´Ù. Ç¥ÁØ ¸ðµå´Â 100Kbps, °í¼ÓÀº 400Kbps ±×¸®°í ÃÊ°í¼Ó ¸ðµå¿¡¼­´Â ÃÖ°í 3.4MbpsÀÇ ¼Óµµ¸¦ Áö¿øÇÑ´Ù. ÀÌ ¼¼ °¡Áö ¸ðµÎ ÇÏÀ§ ȣȯ¼ºÀ» °®´Â´Ù. I2C ¹ö½º´Â °¢ ÀåÄ¡¿¡ 7ºñÆ®¿Í 10ºñÆ® ÁÖ¼Ò¸¦ ÁöÁ¤ÇÏ¿© ¿©·¯ ÀåÄ¡µéÀ» µ¶¸³ÀûÀ¸·Î Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
 


<±×¸² 1>¿¡¼­ º¸µíÀÌ I2C ¹ö½º´Â SDA(Serial DAta Line) ½ÅÈ£¼±°ú SCL(Serial Clock Line) ½ÅÈ£¼±À¸·Î Åë½ÅÀÇ ÁÖü°¡ µÇ´Â ¸¶½ºÅÍÀÎ MCU¿Í Åë½Å ´ë»óÀÌ µÇ´Â ÁÖº¯ ÀåÄ¡ÀÎ ½½·¹À̺ê(slave) °£¿¡ µ¥ÀÌÅ͸¦ Àü´ÞÇÏ°í ¹Þ´Â´Ù.
 
µð¹ÙÀ̽º ÁÖ¼Ò
½½·¹À̺갡 µÇ´Â µð¹ÙÀ̽º¸¦ ÁöÁ¤Çϱâ À§ÇØ »ç¿ëµÇ´Â ÁÖ¼Ò´Â 7ºñÆ®·Î Ç¥ÇöµÇ°Å³ª 10ºñÆ®·Î Ç¥ÇöµÈ´Ù. ´ëºÎºÐÀÇ µð¹ÙÀ̽ºµéÀº 7ºñÆ® Çü½ÄÀÇ ÁÖ¼Ò¸¦ »ç¿ëÇÑ´Ù. ÀÌ·± ÀÌÀ¯·Î 7ºñÆ® Çü½ÄÀÇ ÁÖ¼Ò¸¦ »ç¿ëÇÏ´Â °æ¿ì¶ó¸é ¸¶½ºÅÍ(master)°¡ ÁöÁ¤ÇÒ ¼ö ÀÖ´Â ÀåÄ¡´Â 128°³·Î ÇÑÁ¤µÈ´Ù. ÁÖ¼Ò´Â µð¹ÙÀ̽º µû¶ó¼­ µð¹ÙÀ̽º Á¦Àۻ翡¼­ Á¤ÇØÁö±âµµ ÇÏ°í µð¹ÙÀ̽ºÀÇ ¿ÜºÎ ÇÉÀ» ÀÌ¿ëÇÏ¿© ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù. ÇÉ ¼ö°¡ ÀûÀº ÆÐÅ°Áö Çü½ÄÀÇ µð¹ÙÀ̽º¶ó¸é ÁÖ¼ÒÀÇ »óÀ§ ºñÆ®´Â °íÁ¤µÇ°í ÇÏÀ§ ºñÆ®¸¸ ÁöÁ¤ÇÏ´Â °æ¿ì°¡ ÀϹÝÀûÀÌ´Ù. ±×·¡¼­ I2C ¹ö½º¿¡ ¿¬°áµÇ´Â µð¹ÙÀ̽º¿Í Åë½ÅÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â ÇÁ·Î±×·¡¸Ó¶ó¸é ¹Ýµå½Ã ¸Å´º¾óÀ» ÂüÁ¶ÇÏ¿© ÇØ´ç µð¹ÙÀ̽º ÁÖ¼Ò¸¦ ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù.
 
SCL, SDA ½ÅÈ£¼±
I2C ¹ö½º¸¦ ÀÌ¿ëÇÏ¿© MCU°¡ µð¹ÙÀ̽º¿¡ µ¥ÀÌÅ͸¦ ½á ³Ö°Å³ª ÀÐ¾î µéÀ̱â À§Çؼ­´Â SCL°ú SDA¶ó´Â ½ÅÈ£¼±À» Á¦¾îÇØ¾ß ÇÑ´Ù. SCLÀº µ¥ÀÌÅ͸¦ Àü´ÞÇϱâ À§ÇÑ µ¿±â¿ë Ŭ·°À» Àü´ÞÇÏ´Â ½ÅÈ£¼±ÀÌ°í SDA´Â Àü´ÞÇÏ°íÀÚ ÇÏ´Â µ¥ÀÌÅÍÀÇ ºñÆ® Á¤º¸¸¦ Ç¥ÇöÇϱâ À§ÇÑ ½ÅÈ£¼±ÀÌ´Ù. SCLÀº µ¥ÀÌÅÍÀÇ Àü´ÞÀ» À§ÇÑ Å¬·° µ¿±â ½ÅÈ£¼±À¸·Î ÀÌ Å¬·° ½ÅÈ£´Â ¸¶½ºÅÍ¿¡¼­ °ø±ÞÇÑ´Ù. ±×·¡¼­ SCLÀº ¸¶½ºÅÍ¿¡¼­ ½½·¹À̺ê·Î Àü´ÞµÇ´Â ´Ü¹æÇâ ½ÅÈ£¼±ÀÌ´Ù. ±×·¯³ª SDA´Â ¸¶½ºÅÍ¿¡¼­ ½½·¹À̺ê·Î µ¥ÀÌÅ͸¦ Àü´ÞÇϰųª ½½·¹À̺꿡¼­ ¸¶½ºÅÍ·Î µ¥ÀÌÅ͸¦ °¡Á®¿À±â ¶§¹®¿¡ ¾ç¹æÇâ ½ÅÈ£¼±ÀÌ´Ù.
 
Çϵå¿þ¾îÀûÀÎ Á¢¼Ó ¹æ¹ýÀº ÀÌ Ä÷³ÀÇ Æ¯¼º»ó ´Ù·ê À̾߱Ⱑ ¾Æ´Ï¹Ç·Î ¹ö½º¿¡ ¿¬°áµÇ´Â ÀúÇ׿¡ ´ëÇÑ ¼³¸íÀ̳ª µð¹ÙÀ̽º¿¡ Àΰ¡µÇ´Â Àü¾Ð°ú °°Àº 󸮿¡ ´ëÇÑ °ÍÀº ¼³¸íÇÏÁö ¾Ê°Ú´Ù.
 
I2C ¹ö½ºÀÇ µ¥ÀÌÅÍ Àü¼Û
I2C´Â ½Ã¸®¾ó Àü¼Û ¹æ½ÄÀ» »ç¿ëÇϱ⠶§¹®¿¡ µ¥ÀÌÅÍÀÇ Àü´ÞÀº ±âº»ÀûÀ¸·Î ºñÆ® Á¤º¸¸¦ Àü´ÞÇÑ´Ù°í ÀÌÇØÇØ¾ß ÇÑ´Ù. I2C ¹ö½º¿¡¼­ ºñÆ® µ¥ÀÌÅ͵éÀ» µð¹ÙÀ̽º¿¡ ½á ³Ö°Å³ª Àбâ À§Çؼ­´Â ´ÙÀ½°ú °°Àº ±âº»ÀûÀΠǥÇö¿ä¼Ò°¡ ÇÊ¿äÇÏ´Ù.
¡ß ¸¶½ºÅÍ°¡ ½½·¹À̺꿡 Àü¼ÛÀ» ½ÃÀÛÇѴٴ ǥÇö - Start
¡ß Àü¼Û ¸ñÀûÁöÀÇ ÁÖ¼Ò Ç¥Çö - Address
¡ß Àü¼Û ¸ñÀû Ç¥Çö(Àбâ¿ëÀΰ¡ ¶Ç´Â ¾²±â¿ëÀΰ¡) - R/W
¡ß Àü¼Û µ¥ÀÌÅÍ Ç¥Çö - Data
¡ß ½½·¹À̺갡 Á¤»óÀûÀ¸·Î µ¥ÀÌÅ͸¦ ¼ö½ÅÇß´Ù´Â ÀÀ´ä Ç¥Çö - Ack
¡ß Àü¼Û Á¾·á Ç¥Çö - Stop
ÀÌ¿Í °°Àº Ç¥ÇöÀ» Æ÷ÇÔÇÏ¿© I2C ¹ö½º»ó¿¡¼­ µ¥ÀÌÅ͸¦ Àü¼ÛÇÏ´Â ±âº» µ¥ÀÌÅÍ´Â 8ºñÆ® ´ÜÀ§·Î ÁöÁ¤ÇÑ´Ù. ½ÃÀÛ°ú Á¾·á, ÀÀ´ä Ç¥ÇöÀº 1ºñÆ®·Î ÁöÁ¤ÇÑ´Ù. I2C¿¡¼­ µ¥ÀÌÅ͸¦ Àü¼ÛÇÏ´Â Æ÷¸ËÀº <±×¸² 2>¿Í °°Àº ÇüÅ°¡ µÈ´Ù.
 

START Ç¥Çö

Start´Â ¸¶½ºÅÍ°¡ ½½·¹À̺꿡 Àü¼Û ½ÃÀÛÀ» ¾Ë¸®±â À§ÇÑ °ÍÀ¸·Î I2C ¹ö½º¸¦ »ç¿ëÇÏ°Ú´Ù´Â ½ÅÈ£ÀÇ ½ÃÀÛÀÌ´Ù. ÀÌ ½ÅÈ£´Â 1ºñÆ® ÇüÅ·Π±¸ÇöµÇ¸ç SCLÀÌ HIGH »óÅ°¡ À¯ÁöµÉ ¶§ SDA°¡ HIGH¿¡¼­ LOW·Î º¯È­µÇ¸é START ½ÅÈ£·Î Çؼ®µÈ´Ù. <±×¸² 3>Àº STARTÀÇ ½ÅÈ£ º¯È­ÀÌ´Ù. START ½ÅÈ£´Â STOP ÀÌÀü¿¡ ¿©·¯ ¹ø ³ª¿Ã ¼öµµ ÀÖ´Ù. ù ¹ø° START¿Í ´Þ¸® µÎ ¹ø° START ½ÅÈ£´Â REPEAT START ½ÅÈ£¶ó°í Çϴµ¥ º¸Åë µð¹ÙÀ̽º ¾È¿¡ ³»ºÎÀûÀÎ ÁÖ¼Ò°¡ À־ ÀÌ ÁÖ¼Ò¸¦ ÁöÁ¤ÇÏ°í µ¥ÀÌÅ͸¦ ÀÐÀ» °æ¿ì¿¡ »ç¿ëµÈ´Ù.
 
STOP Ç¥Çö
StopÀº MCU°¡ ½½·¹À̺꿡 Àü¼ÛÀ» Á¾·áÇÑ´Ù´Â °ÍÀ» ¾Ë¸®±â À§ÇÑ °ÍÀ¸·Î I2C ¹ö½º¸¦ ´õ ÀÌ»ó »ç¿ëÇÏÁö ¾Ê°Ú´Ù´Â ½ÅÈ£ÀÌ´Ù. ÀÌ ½ÅÈ£´Â 1ºñÆ® ÇüÅ·Π±¸ÇöµÇ¸ç SCLÀÌ HIGH »óÅ°¡ À¯ÁöµÉ ¶§ SDA°¡ LOW¿¡¼­ HIGH·Î º¯È­µÇ¸é STOP ½ÅÈ£·Î Çؼ®µÈ´Ù. <±×¸² 4>´Â STOP¸¦ Ç¥ÇöÇϱâ À§ÇÑ ½ÅÈ£ º¯È­ »óÅÂÀÌ´Ù.
 


DATA 1ºñÆ® ½ÅÈ£ Ç¥Çö

¸¶½ºÅÍ¿¡¼­ ½½·¹À̺꿡 Àü´ÞÇϰųª ½½·¹À̺꿡¼­ µ¥ÀÌÅ͸¦ ÀÐ¾î ¿Ã ¶§ µ¥ÀÌÅÍÀÇ 1ºñÆ®¸¦ Ç¥ÇöÇϱâ À§Çؼ­´Â SCL ½ÅÈ£¼±À» LOW »óÅ¿¡¼­ Àü¼ÛÇÏ°íÀÚ ÇÏ´Â ºñÆ® µ¥ÀÌÅ͸¦ SDA ½ÅÈ£¼±¿¡ °áÁ¤ÇÏ°í SCL ½ÅÈ£¼±À» HIGH »óÅ·Π¸¸µç´Ù. ½½·¹ÀÌºê ¶Ç´Â ¸¶½ºÅÍ´Â SCLÀÌ HIGH »óÅÂÀÏ ¶§ÀÇ SDA ½ÅÈ£ »óŸ¦ º¸°í SDA ½ÅÈ£°¡ HIGH¸é 1·Î LOW¸é 0À¸·Î ÆÇ´ÜÇÑ´Ù(<±×¸² 5>).
 
ACK Ç¥Çö
½½·¹À̺ê´Â ¸¶½ºÅÍ°¡ Àü¼ÛÇÑ µ¥ÀÌÅÍ(ÁÖ¼Ò¿Í Àб⠾²±â¸¦ °áÁ¤ÇÏ´Â °Íµµ µ¥ÀÌÅÍ·Î Ãë±ÞÇÑ´Ù)¸¦ Á¦´ë·Î ¼ö½Å¹Þ¾Ò´Ù°Å³ª ½½·¹À̺꿡¼­ ¸¶½ºÅÍ¿¡ µ¥ÀÌÅ͸¦ Àü´ÞÇÒ °æ¿ì¿¡ 8ºñÆ® µ¥ÀÌÅÍ ´ÙÀ½¿¡ ACK ½ÅÈ£¸¦ Ç¥ÇöÇÑ´Ù. ACKµµ ÀÏÁ¾ÀÇ µ¥ÀÌÅÍÀ̱⠶§¹®¿¡ SCLÀÇ »óÅ°¡ LOWÀÏ ¶§ SDAÀÇ »óŸ¦ HIGH ¶Ç´Â LOW·Î °áÁ¤Çϸç SCLÀÇ »óÅ°¡ HIGHÀÏ ¶§ SDAÀÇ »óŸ¦ ¸¶½ºÅÍ°¡ ÀÐÀ¸¸é µÈ´Ù. À̶§ÀÇ SDA »óÅ°¡ LOW¶ó¸é Á¤»óÀûÀÎ Åë½ÅÀÌ ÀÌ·ç¾îÁø °ÍÀÌ°í ¸¸¾à HIGH¶ó¸é Á¤»óÀûÀÎ Åë½Å¿¡ ½ÇÆÐÇÑ °ÍÀ¸·Î ÆÇ´ÜÇÑ´Ù.
 
ÀÏ´Ü ¾ÆÁÖ ±âÃÊÀûÀÎ ½ÅÈ£ Ç¥Çö¿¡ ´ëÇؼ­´Â ÀÌ Á¤µµ·Î ¸¶Ä¡°í ½ÇÁ¦·Î »ç¿ëµÇ´Â ÀÚ¼¼ÇÑ Åë½Å µ¥ÀÌÅÍ ±¸Á¶´Â ÀÌÈÄÀÇ ¿¹Á¦¿¡¼­ ¼³¸íÇÒ EEPROM¿¡ ´ëÇÑ °ÍÀ» ´Ù·ç¸é¼­ ¼³¸íÇÏ°Ú´Ù.
 
ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ I2C ¹ö½º¿¡ ¿¬°áµÈ µð¹ÙÀ̽º Á¦¾î
ÀÓº£µðµå ½Ã½ºÅÛ¿¡¼­ I2C ¹ö½º¿¡ ¿¬°áµÈ µð¹ÙÀ̽º¸¦ Á¦¾îÇϱâ À§ÇÑ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ¿©±â¼­´Â S3C2410À̶ó´Â »ï¼ºÀüÀÚ¿¡¼­ ¸¸µé°í ÀÖ´Â ÇÁ·Î¼¼¼­¸¦ žÀçÇÑ EZ-S2410À̶ó´Â º¸µå¸¦ ÀÌ¿ëÇÑ´Ù. I2C ¹ö½º¿¡ ¿¬°áµÈ EEPROM KS24C080 Ĩ¿¡¼­ µ¥ÀÌÅ͸¦ ±â·ÏÇÏ°í ÀÐ¾î µéÀÌ´Â ÇÁ·Î±×·¥À» ¿¹Á¦·Î ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ ¾î¶»°Ô I2C ¹ö½º¿¡ ¿¬°áµÈ µð¹ÙÀ̽º¸¦ Á¦¾îÇÏ´Â °¡¸¦ »ìÆ캻´Ù. <±×¸² 6, 7>Àº °¢°¢ EZ-S2410À̶ó´Â º¸µåÀÇ ¿ÜÇü°ú È®Àå Ä¿³ØÅÍÀÇ I2C ¹ö½º¿¡ EEPROMÀ» ¿¬°áÇÑ È¸·ÎµµÀÌ´Ù.
 


EEPROM

EEPROM(Electrically Erasable Programmable Read-Only Memory)À̶õ »ç¿ëÀÚ°¡ ¸Þ¸ð¸® ³»ÀÇ ³»¿ëÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ´Â ·ÒÀÌ´Ù. Á¤»óº¸´Ù ´õ ³ôÀº Àü¾ÐÀ» ÀÌ¿ëÇÏ¿© ¹Ýº¹ÀûÀ¸·Î Áö¿ì°Å³ª ´Ù½Ã ÇÁ·Î±×·¥(±â·Ï)ÇÒ ¼ö ÀÖ´Ù. ÀϹÝÀûÀÎ ·ÒÀÎ EPROM Ĩ°ú´Â ´Þ¸®, EEPRO MÀº ±â·ÏµÈ ³»¿ëÀ» ¼öÁ¤Çϱâ À§ÇØ ÄÄÇ»ÅÍ¿¡¼­ »©³¾ ÇÊ¿ä°¡ ¾ø´Ù. ±×·¯³ª »ç¿ëÇÒ ¼ö ÀÖ´Â ¼ö¸í¿¡µµ Á¦ÇÑÀÌ Àִµ¥, ´Ù½Ã ÇÁ·Î±×·¥ÇÒ ¼ö Àִ Ƚ¼ö°¡ 10¸¸È¸ ¹Ì¸¸À¸·Î Á¦ÇÑµÉ ¼ö ÀÖ´Ù. ÄÄÇ»ÅÍ°¡ »ç¿ëµÇ´Â µ¿¾È ÀÚÁÖ ´Ù½Ã ÇÁ·Î±×·¡¹ÖµÇ´Â EEPROM¿¡¼­´Â EEPROMÀÇ ¼ö¸íÀÌ ¾ÆÁÖ Áß¿äÇÑ ¼³°è °í·Á»çÇ×ÀÌ µÉ ¼ö ÀÖ´Ù. EEPROMÀÇ Æ¯º°ÇÑ ÇüÅ°¡ Ç÷¡½Ã ¸Þ¸ð¸®ÀÌ´Ù.
 
EEPROMÀº ¸Þ¸ð¸® ¿ë·®ÀÌ ±×¸® Å©Áö ¾Ê±â ¶§¹®¿¡ ½Ã½ºÅÛ¿¡ ¹Ýµå½Ã ±â¾ïÇØ ³õ¾Æ¾ß ÇÒ ¿É¼Ç µ¥ÀÌÅͳª ±âŸ Á¦¾î µ¥ÀÌÅ͸¦ ±â·ÏÇØ ³õ´Â´Ù. ¿ì¸®°¡ ¿¹Á¦·Î »ç¿ëÇÏ´Â KS24C080´Â ³»ºÎÀûÀ¸·Î ±â¾ïÇØ ³õÀ» ¼ö ÀÖ´Â µ¥ÀÌÅÍÀÇ Å©±â°¡ 1024¹ÙÀÌÆ® Á¤µµÀÇ Å©±â¸¦ °®´Â´Ù. ¿ÜºÎ¿¡¼­ ÁöÁ¤ÇÏ´Â ¾îµå·¹½º´Â A0, A1, A2·Î 0x50 ÁÖ¼Ò¸¦ ±âÁØÀ¸·Î ÇϺΠ¾îµå·¹½º¸¦ ¼³Á¤ÇÑ´Ù. ±×·¡¼­ ÇϳªÀÇ I2C ¹ö½º»ó¿¡´Â 8°³ÀÇ KS24C 080¸¸À» ¿¬°áÇÒ ¼ö ÀÖ´Ù. ¿¹Á¦ ȸ·Î¿¡´Â A0, A1, A2 ¸¦ ¸ðµÎ GND¿¡ ¿¬°áÇßÀ¸¹Ç·Î I2C ¹ö½º»ó¿¡¼­ SLAVE ÁÖ¼Ò´Â 0x50ÀÌ µÈ´Ù.
 
i2c-dev µð¹ÙÀ̽º ÆÄÀÏ
¸®´ª½º¿¡¼­ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ I2C ¹ö½º¿¡ ¿¬°áµÈ µð¹ÙÀ̽º¿Í µ¥ÀÌÅ͸¦ ÁÖ°í¹Þ±â À§Çؼ­´Â i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö´Â /dev/i2c-?¿Í µð¹ÙÀ̽º ÆÄÀϷΠǥÇöÇÑ´Ù. ÀÌ µð¹ÙÀ̽º ÆÄÀÏÀº i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ½Ã½ºÅÛ¿¡¼­ Á¦°øÇÏ´Â ÆÄÀÏÀÌ´Ù. ±×·¯³ª ÀÌ µð¹ÙÀ̽º ÆÄÀÏÀº ´ëºÎºÐÀÇ ¸®´ª½º ¹èÆ÷ÆÇÀ̳ª ÀÓº£µðµå ·¥µð½ºÅ©¸¦ ÀÌ¿ëÇÑ ÆÄÀÏ ½Ã½ºÅÛ¿¡¼­´Â Á¦°øÇÏÁö ¾Ê´Â´Ù. ±×·¡¼­ ÀÌ µð¹ÙÀ̽º ÆÄÀÏÀº Á÷Á¢ ¸¸µé¾îÁà¾ß Çϴµ¥ mknod À¯Æ¿¸®Æ¼¸¦ ÀÌ¿ëÇϰųª ÇÁ·Î±×·¥¿¡¼­ mknod ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¸¸µé¾îÁà¾ß ÇÑ´Ù.
 


i2c-dev µð¹ÙÀ̽º ÆÄÀÏÀº ÁÖ¹øÈ£°¡ 89ÀÌ°í ºÎ¹øÈ£°¡ 0ºÎÅÍ ½ÃÀÛÇÏ´Â ¹®ÀÚÇü µð¹ÙÀ̽º ÆÄÀÏÀÌ´Ù. ºÎ¹øÈ£´Â ½Ã½ºÅÛ¿¡ Á¸ÀçÇÏ´Â i2c ¹ö½º¸¦ ±¸º°Çϴµ¥ i2c ¹ö½º´Â ½Ã½ºÅÛ¿¡ Çϳª ÀÌ»ó Á¸ÀçÇÒ ¼ö Àֱ⠶§¹®¿¡ °¢ ¹ö½º¸¶´Ù 0, 1°ú °°Àº ½ÄÀ¸·Î ¼ø¼­¿¡ ÀÔ°¢ÇÏ¿© ºÎ¿©ÇÑ´Ù. º¸Åë ÇϳªÀÇ i2c ¹ö½º°¡ Á¸ÀçÇÏ´Â °æ¿ì°¡ ´ëºÎºÐÀ̱⠶§¹®¿¡ /dev/i2c-0 ¶ó´Â µð¹ÙÀ̽º ÆÄÀϸ¸ ÀÖÀ¸¸é µÈ´Ù.
 
¡ß mknod ¸¦ »ç¿ëÇÏ´Â °æ¿ì : mkdev À¯Æ¿¸®Æ¼¸¦ ÀÌ¿ëÇÒ ¶§´Â ´ÙÀ½°ú °°Àº ¸í·É Çü½ÄÀ¸·Î ¸¸µé¾îÁÖ¸é µÈ´Ù.
# mkdev c /dev/i2c-0 c 89 0
# mkdev c /dev/i2c-1 c 89 1
¡¦
¡ß ÇÁ·Î±×·¥¿¡¼­ Á÷Á¢ ¸¸µé °æ¿ì
#define I2C_DEV_FILENAME   ¡°/dev/i2c-0¡±
 
if( access(  I2C_DEV_FILENAME , F_OK ) != 0 )
  mknod( I2C_DEV_FILENAME, S_IRWXU|S_IRWXG|S_IFCHR,(89<<8|(0)));
Ä¿³Î ÄÄÆÄÀÏ ¼³Á¤ Á¶°Ç
i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ »ç¿ëÇÏ·Á¸é Ä¿³Î¿¡¼­ ÀÌ¿¡ ÇØ´çÇÏ´Â µð¹ÙÀ̽º µå¶óÀ̹ö°¡ Æ÷ÇԵǵµ·Ï Ä¿³Î ÄÄÆÄÀÏ Á¶°ÇÀÌ ¼³Á¤µÈ »óÅ¿¡¼­ ÄÄÆÄÀÏµÇ¾î ½Ã½ºÅÛ¿¡ žÀçµÅ¾ß ÇÑ´Ù. <È­¸é 1>Àº Ä¿³Î ÄÄÆÄÀÏ ¼³Á¤ Á¶°ÇÀÌ´Ù.
   
i2c-dev µð¹ÙÀ̽º ÆÄÀÏ ¿­±â¿Í ´Ý±â
i2c-dev µð¹ÙÀ̽º ÆÄÀÏÀ» ÀÌ¿ëÇÏ¿© I2C ¹ö½º»ó¿¡ ¿¬°áµÈ µð¹ÙÀ̽º¿¡ ¾î¶² ÇàÀ§¸¦ ÇÏ·Á¸é ¿ì¼±ÀûÀ¸·Î i2c-dev µð¹ÙÀ̽º ÆÄÀÏÀ» ¿­¾î¾ß ÇÑ´Ù. ÀÌ µð¹ÙÀ̽º ÆÄÀÏÀ» ¿­±â À§ÇÑ ÇÔ¼ö´Â Àú¼öÁØ ÆÄÀÏ ÇÔ¼öÀÎ open ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù. º¸Åë ºí·¯Å· I/O ÇüÅ·Π¿­±â ¶§¹®¿¡ ´ÙÀ½°ú °°Àº Çü½ÄÀ¸·Î ¿­°í ´ÝÀ¸¸é µÈ´Ù.
    int fd;
 
    fd = open( I2C_DEV_FILENAME, O_RDWR );
    if( fd >= 0 )
    {
         :
         :
        close( fd );
    }
i2c-dev¸¦ »ç¿ëÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°Àº Çì´õ ÆÄÀÏÀ» Æ÷ÇÔÇØ¾ß ÇÑ´Ù.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/poll.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
 
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ´Ù·ç±â À§Çؼ­´Â ÁÖ·Î ioctl ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù. ioctl ¸¦ ÀÌ¿ëÇÏ¿© ¿©·¯°¡Áö ¼³Á¤ »çÇ×À» i2c-dev¿¡ Àü´ÞÇÒ ¼ö Àִµ¥ ÀÌ¿¡ ´ëÇÑ ioctl ¸í·ÉÀº ¡®ÀÌ´ÞÀÇ µð½ºÄÏ¡¯À» Âü°íÇϱ⠹ٶõ´Ù(ioctl.txt).
 


i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÌ¿ëÇÏ¿© EEPROM¿¡ µ¥ÀÌÅÍ ¾²±â

i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ »ç¿ëÇϱâ À§ÇÑ /dev/i2c-0 µð¹ÙÀ̽º ÆÄÀÏÀ» ¿­¾ú´Ù¸é Á¤»óÀûÀ¸·Î i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÌ¿ëÇÏ¿© I2C ¹ö½º¿¡ ¿¬°áµÈ µð¹ÙÀ̽º µå¶óÀ̹ö¿¡ µ¥ÀÌÅ͸¦ ½á ³ÖÀ» ¼ö ÀÖ´Ù. i2c-dev¸¦ ÀÌ¿ëÇÏ¿© eeprom¿¡ µ¥ÀÌÅ͸¦ ¾²±â À§Çؼ­´Â Àü´Þ Æ÷¸ËÀ» ¾Ë¾Æ¾ß ÇÑ´Ù.
 
º¸Åë I2C ¹ö½º¿¡ ¿¬°áµÈ µð¹ÙÀ̽ºµéÀº º¸Åë ÀÚ½ÅÀÇ ÁÖ¼Ò ÀÌ¿Ü¿¡ ³»ºÎÀûÀÎ ¾îµå·¹½º°¡ ÁöÁ¤µÇ¾î¾ß ÇÑ´Ù. ÀÌ È¸·Î¿¡¼­ µé°í ÀÖ´Â EEP ROMÀº I2C ¹ö½º¿¡¼­ ½½·¹À̺ê ÁÖ¼Ò¿¡ ÇØ´çÇÏ´Â ÁÖ¼Ò ÀÌ¿Ü¿¡ EEP ROM¿¡ ÀúÀåÇÒ µ¥ÀÌÅÍÀÇ ³»ºÎ ÁÖ¼Ò¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù. KS24C080´Â ³»ºÎÀûÀ¸·Î 1024¹ÙÀÌÆ®¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ³»ºÎ ÁÖ¼Ò ÁöÁ¤À» À§ÇÏ¿© 2 ¹ÙÀÌÆ®°¡ ÇÊ¿äÇÏ´Ù. <±×¸² 10>ÀÌ KS24C080¿¡ µ¥ÀÌÅ͸¦ ½á ³Ö±â À§ÇÑ ±¸Á¶ÀÌ´Ù.
 
i2c-dev¸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ½á ³Ö±â À§Çؼ­´Â °¡Àå ¸ÕÀú ioctlÀ» ÀÌ¿ëÇÏ¿© ÁÖ¼Ò¸¦ ÁöÁ¤ÇÏ°í write ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ½á ³Ö¾î¾ß ÇÑ´Ù.
unsigned char  eeprom_data[32];  // EEPROM Àб⠾²±â µ¥ÀÌÅÍ ¹öÆÛ
ioctl( fd, I2C_SLAVE, 0x50 );    // ½½·¹À̺ê ÁÖ¼Ò
i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÌ¿ëÇÑ ¾²±â ÀбâÀÇ Á¶ÇÕ
KS24C080ÀÇ °æ¿ì¿¡´Â ÀÌ¿Í °°Àº ¹æ½ÄÀ¸·Î ÇѹøÀº ¾²±â ¸í·É Çü½ÄÀ» ÀÌ¿ëÇÏ¿© write ÇÔ¼ö·Î ÀÐÀ» ÁÖ¼Ò¸¦ ÁöÁ¤ÇÏ°í read ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© Àб⸦ ó¸®ÇÒ ¼ö ÀÖ´Ù. ÀÌ °æ¿ì¿¡´Â START¿Í STOPÀÌ ¹Ýº¹ÀûÀ¸·Î »ç¿ëµÈ´Ù. ÇÏÁö¸¸ °æ¿ì¿¡ µû¶ó¼­´Â START ¡¦ START ¡¦ STOP Çü½ÄÀ¸·Î¸¸ »ç¿ëÇØ¾ß ÇÏ´Â µð¹ÙÀ̽º°¡ ÀÖ´Ù. ÀÌ·± °æ¿ì¿¡´Â ´Ü¼øÇÏ°Ô  write read ÇÔ¼öÀÇ Á¶ÇÕ¸¸À¸·Î´Â ±¸ÇöÀÌ ºÒ°¡´ÉÇÏ´Ù. KS24C080ÀÇ °æ¿ì¿¡µµ ÀÌ¿Í °°Àº Çü½ÄÀ¸·Î µ¥ÀÌÅ͸¦ ÀÐÀ» ¼ö Àִµ¥ ÀÌ·± °æ¿ìÀÇ µ¥ÀÌÅÍ Çü½ÄÀ» º¸¸é <±×¸² 11>°ú °°´Ù.
 


i2c-dev´Â read ÇÔ¼ö¿Í write ÇÔ¼ö¸¦ ±âº»ÀûÀ¸·Î ÇÔ¼ö È£Ãâ½Ã START¿Í STOPÀ» ¹ß»ý½ÃŲ´Ù. ±×·¡¼­ START ¡¦ START ¡¦ STOP Çü½ÄÀ» »ç¿ëÇÏ°íÀÚ ÇÑ´Ù¸é read, write ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ÀÌ ¶§ »ç¿ëÇÏ´Â °ÍÀÌ ioctl ÇÔ¼ö¿¡ I2C_RDWR ¸í·ÉÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ÀÌ·± Çü½ÄÀ¸·Î »ç¿ëÇÒ °æ¿ì¿¡ Çü½ÄÀº ´ÙÀ½°ú °°´Ù.
ioctl( fd, I2C_RDWR, (struct i2c_rdwr_ioctl_data *) msgs );
ÀÌ ¸í·ÉÀº ioctl ÇÔ¼ö Çϳª¿¡ ¿©·¯ °³ÀÇ Àü¼Û µ¥ÀÌÅ͸¦ ¸¸µé±â À§ÇÑ °ÍÀÌ´Ù. ¿ì¼± struct i2c_rdwr_ioctl_data¶õ ±¸Á¶Ã¼¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸ÀÚ.
struct i2c_rdwr_ioctl_data
ÀÌ ±¸Á¶Ã¼´Â Àü¼ÛÇÒ µ¥ÀÌÅ͸¦ ¹­´Â ¿ªÇÒÀ» Çϴµ¥ ´ÙÀ½°ú °°Àº ±¸¼ºÀ» °¡Áø´Ù. ÀÌ ±¸Á¶Ã¼¸¦ »ç¿ëÇÏ·Á¸é #include <i2c-dev.h>¸¦ Æ÷ÇÔÇØ¾ß ÇÑ´Ù.
struct i2c_rdwr_ioctl_data {
 struct i2c_msg __user *msgs; /* pointers to i2c_msgs */
 __u32 nmsgs;   /* number of i2c_msgs */
};
ÀÌ ±¸Á¶Ã¼´Â Àü´ÞÇÒ µ¥ÀÌÅÍ ºí·°ÀÌ Á¤ÀÇµÈ i2c_msg ±¸Á¶Ã¼µéÀÇ ¼±µÎ ÁÖ¼Ò¿Í Àü´ÞÇÒ µ¥ÀÌÅÍ ºí·° ¼ö¸¦ ÁöÁ¤ÇÑ´Ù. msgs ÇÊµå º¯¼ö°¡ i2c_msg ±¸Á¶Ã¼ÀÇ ¼±µÎ ÁÖ¼Ò¸¦ ÁöÁ¤ÇÏ°í nmsgs°¡ ºí·° ¼ö¸¦ ÁöÁ¤ÇÑ´Ù.
struct i2c_msg


ÀÌ ±¸Á¶Ã¼°¡ ½ÇÁ¦·Î Àü´ÞÇØ¾ß ÇÏ´Â µ¥ÀÌÅÍÀÇ °¢ ºí·°À» Ç¥ÇöÇÑ´Ù.
struct i2c_msg {
 __u16 addr; /* slave address   */
  __u16 flags;  
 __u16 len;  /* msg length  */
  __u8 *buf;  /* pointer to msg data  */
};
addr ÇÊµå º¯¼ö´Â ½½·¹À̺ê ÁÖ¼Ò¸¦ ÁöÁ¤ÇÑ´Ù. ±×·¯¹Ç·Î I2C_ RDWR¸¦ ÀÌ¿ëÇÑ ioctl ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§´Â I2C_SLAVE¸¦ ÀÌ¿ëÇÏ¿© ½½·¹À̺ê ÁÖ¼Ò¸¦ ÁöÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. buf´Â Àü´ÞÇÒ µ¥ÀÌÅ͸¦, ÁöÁ¤ÇÑ ¹öÆÛ ÁÖ¼Ò´Â ÀÐ¾î µéÀÏ µ¥ÀÌÅÍ ¹öÆÛ ÁÖ¼Ò¸¦ ÁöÁ¤ÇÑ´Ù. lenÀº ¹öÆÛ¸¦ ÀÌ¿ëÇÏ¿© ½á ³ÖÀ» µ¥ÀÌÅͳª ÀÐÀ» µ¥ÀÌÅÍ ¼ö¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ Çü½ÄÀ» ÀÌ¿ëÇÒ ¶§ °¢°¢ msg ±¸Á¶Ã¼ÀÇ flags´Â ¼¼¹ÐÇÑ Á¦¾î¸¦ Çϱâ À§ÇØ ´ÙÀ½°ú °°Àº °ªÀÇ ºñÆ® Á¶ÇÕÀ» »ç¿ëÇÑ´Ù.
¡ß I2C_M_TEN : ÁÖ¼Ò°¡ 10ºñÆ®ÀÌ´Ù.
¡ß I2C_M_RD : ÀÌ °ªÀÌ ÁöÁ¤µÇ¸é Àб⠸í·ÉÀ» I2C ¹ö½º»ó¿¡¼­ ¼öÇàÇÑ´Ù.
¡ß I2C_M_NOSTART : START°¡ ¹ß»ýÇÏ¸é ¾ÈµÇ´Â ÆÐŶÀÓÀ» Ç¥½ÃÇÑ´Ù. °¡Àå ù ¹ø° msg ºí·°¿¡´Â »ç¿ëÇÒ ¼ö ¾ø´Ù.
¡ß I2C_M_REV_DIR_ADDR : R/W°¡ ¹ÝÀüµÈ 󸮸¦ ÇØ¾ß ÇÑ´Ù.
¡ß I2C_M_IGNORE_NAK : NAK ÀÀ´ä Áï ACK°¡ ¾ø´õ¶óµµ ¿¡·¯ ó¸®ÇÏÁö ¾Ê´Â´Ù.
¡ß I2C_M_NO_RD_ACK : Àб⿡ µû¸¥ ACK°¡ ¾ø´õ¶óµµ ¿¡·¯ ó¸®ÇÏÁö ¾Ê´Â´Ù.
ÀÌ ¿É¼Ç Áß °¡Àå ¸¹ÀÌ »ç¿ëµÇ´Â °ÍÀº I2C_M_RD, I2C_M_NOSTART ÀÌ´Ù. ¿ì¼± I2C_RDWR ¸í·ÉÀ» »ç¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ½á ³Ö´Â °ÍÀ» ±¸ÇöÇغ¸ÀÚ. ÀÌ°ÍÀº ¾Õ¿¡¼­ ¼³¸íÇÑ write ÇÔ¼öÀÇ ´Ù¸¥ ÇüŸ¦ Á¶±Ý º¹ÀâÇÏ°Ô ¼³¸íÇÑ °ÍÀ¸·Î I2C_RDWR¸¦ ¼³¸íÇϱâ À§ÇÑ °ÍÀÌ´Ù. ½Ç¿ëÀûÀÎ ¸ñÀû¿¡¼­´Â ÀÌ·¸°Ô ±»ÀÌ »ç¿ëÇÒ ÇÊ¿ä´Â ¾ø´Ù.
struct i2c_msg                i2c_msgs[2];
struct i2c_rdwr_ioctl_data    i2c_rwctl;
 
unsigned char  eeprom_data_addres[2];   // EEPROM µ¥ÀÌÅÍ ÁÖ¼Ò ¼³Á¤¿ë ¹öÆÛ
unsigned char  eeprom_data[32];         // EEPROM Àб⠾²±â µ¥ÀÌÅÍ ¹öÆÛ
¹«Ã´ º¹ÀâÇÏÁö¸¸ ³ª¸§´ë·Î write ÇÔ¼ö¸¦ ´ëÄ¡Çϱâ À§ÇÑ °ÍÀÌ´Ù. ÇÏÁö¸¸ ¾Õ¿¡¼­ ¿¹¸¦ µç ÀбâÀÇ °æ¿ì¿¡ START ¡¦ START ¡¦ STOP Çü½ÄÀ¸·Î ¾²·Á¸é ¹Ýµå½Ã I2C_RDWR¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. ´ÙÀ½ÀÌ ÀÌ·± Çü½ÄÀ¸·Î ¾²±â À§ÇÑ °ÍÀÌ´Ù.
 


I2C ¹ö½º¿Í Ä¿³Î

Áö±Ý±îÁö ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ Ä¿³Î¿¡ Á¦°øµÈ i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÌ¿ëÇÏ¿© ¾î¶»°Ô I2C ¹ö½º¿¡ ¿¬°áµÈ µð¹ÙÀ̽º¸¦ ´Ù·ç´ÂÁö ¾Ë¾Æº¸¾Ò´Ù. ½ÇÁ¦ »ç¿ë¹ýÀ» º¸¸é °£´ÜÇÑ I2C ¹ö½ºÀÇ ±¸Á¶¸¸Å­À̳ª ½¬¿î ÀÎÅÍÆäÀ̽º¸¦ °¡Áö°í ÀÖ´Ù. ±×·¸´Ù¸é ÀÌ·¸°Ô ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ Áö¿øÇϱâ À§ÇØ Ä¿³ÎÀ» ¼öÁ¤ÇÏ·Á¸é ¾î¶»°Ô ÇØ¾ß Çϴ°¡? PC ½Ã½ºÅÛÀÇ °æ¿ì¶ó¸é I2C ¹ö½º¸¦ »ç¿ëÇÒ ±âȸ´Â ±×¸® ¸¹Áö ¾Ê´Ù. ºñµð¿À for ¸®´ª½º¿Í °ü·ÃµÈ ¿µ»ó ó¸® ½Ã½ºÅÛÀ̳ª ¸î¸îÀÇ RTC¿Í °ü·ÃÀÌ ÀÖ´Â Á¤µµÀÌ´Ù. ÇÏÁö¸¸ ÀÓº£µðµå ½Ã½ºÅÛ¿¡¼­ I2C´Â ÀÇ¿Ü·Î ¸¹Àº »ç¿ëµµ¸¦ °¡Áø´Ù. ¿µ»ó°ú °ü·ÃµÈ ½Ã½ºÅÛÀº ¹Ýµå½Ã¶ó°í ÇÒ Á¤µµ·Î Æ÷ÇԵȴÙ.
 
¹®Á¦´Â I2C ¹ö½º¸¦ ±¸ÇöÇÏ´Â °ÍÀÌ »ç¿ëµÇ´Â ½Ã½ºÅÛ¸¶´Ù ¸ðµÎ ´Ù¸£´Ù´Â °Í¿¡ ÀÖ´Ù. ¾î¶² ½Ã½ºÅÛÀº GPIO¸¦ ÀÌ¿ëÇÏ¿© ó¸®Çϱ⵵ ÇÏ°í ¾î¶² ½Ã½ºÅÛÀº I2C ¹ö½º ÄÁÆ®·Ñ·¯¸¦ °¡Áö°í Áö¿øÇϱ⵵ ÇÑ´Ù. ÀÓº£µðµå ÇÁ·Î±×·¡¸Ó´Â ÀÚ½ÅÀÇ ½Ã½ºÅÛ¿¡ ¸ÂÃß¾î I2C ¹ö½º¸¦ Áö¿øÇϵµ·Ï ¸®´ª½º Ä¿³ÎÀ» ¼öÁ¤ÇØ¾ß ÇÒ °æ¿ì´Â ´ç¿¬È÷ ¹ß»ýÇÏ°Ô µÈ´Ù. ±×·¯¹Ç·Î ¿ì¸®´Â ¸®´ª½º Ä¿³Î¿¡¼­ I2C ¹ö½º¸¦ ±¸ÇöÇϱâ À§Çؼ­´Â ¸®´ª½º Ä¿³Î ³»¿¡¼­ I2C¸¦ ¾î¶»°Ô ´Ù·ç°í ÀÖ´ÂÁö¸¦ »ìÆìºÁ¾ß ÇÑ´Ù.
 

 
¸®´ª½º Ä¿³ÎÀº I2C ¹ö½º¸¦ ´Ù·ç±â À§Çؼ­ µÎ °¡Áö °³³äÀ» µÎ°í ÀÖ´Ù. Çϳª´Â ¾î´ðÅÍ(adapter)¶ó´Â °³³ä°ú ´Ù¸¥ Çϳª´Â ¾Ë°í¸®Áò(algorithm)À̶ó´Â °³³äÀÌ´Ù. ¿©±â¼­ ¸»ÇÏ´Â ¾î´ðÅͶó´Â °ÍÀº ¿ì¸®°¡ ¾Ë°í ÀÖ´Â °³³ä°ú ´Þ¸® i2c ¹ö½º¸¦ Ä¿³Î ³»ºÎ¿¡¼­ °ü¸®Çϱâ À§ÇÑ Á¤º¸ °ü¸® ±¸Á¶Ã¼·Î º¸¸é µÈ´Ù. ±×·¸´Ù¸é ¾Ë°í¸®ÁòÀ̶ó´Â °ÍÀº ¾î¶² °ÍÀϱî? ¾Ë°í¸®ÁòÀº À̸§¸¸ º¸¸é ³í¸®ÀûÀÎ ±¸Çö ¹æ¹ýÀ» »ý°¢Çϴµ¥ ½ÇÁ¦·Î´Â Çϵå¿þ¾î»ó¿¡¼­ I2C ¹ö½º¸¦ Á¦¾îÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ ±¸Ã¼ÀûÀÎ ÇÁ·Î±×·¥ Äڵ尡 µé¾î°£´Ù. Áï ¾î´ðÅÍ´Â Ä¿³Î ³»ºÎÀÇ Á¤º¸ ±¸Á¶Ã¼ÀÌ°í ¾Ë°í¸®ÁòÀº ½ÇÁ¦ ¹ö½º¸¦ Á¦¾îÇÏ´Â ·çƾÀ» ´Ù·ç´Â °ÍÀÌ´Ù. ¿©±â¼­ ±â¾ïÇØµÖ¾ß ÇÒ °ÍÀº ¾î´ðÅÍ ±¸Á¶Ã¼ ³»¿¡ ¾Ë°í¸®Áò ±¸Á¶Ã¼¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù´Â °ÍÀÌ´Ù.
 
¿ì¼± i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö°¡ ¸®´ª½º Ä¿³Î³»¿¡¼­ ¾î¶»°Ô I2C ¹ö½º¸¦ Á¦¾îÇϴ°¡¸¦ »ìÆ캸ÀÚ. <±×¸² 12>´Â i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö°¡ Ä¿³Î ³»ºÎ¿¡¼­ ¾î¶² È£Ãâ °ü°è¸¦ °®´Â°¡¸¦ »ìÆ캻 °ÍÀÌ´Ù.
 

 
ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ /dev/i2c-0 µð¹ÙÀ̽º ÆÄÀÏÀ» ¿­°í¼­ read, write, ioctl ÇÔ¼ö¸¦ È£ÃâÇϸé i2c-dev µð¹ÙÀ̽º µå¶óÀ̹ö´Â read¿¡ ´ëÀÀÇÏ¿© i2c_master_recv ÇÔ¼ö¸¦, write¿¡ ´ëÀÀÇÏ¿© i2c_master_send¸¦, ioctl ÇÔ¼ö¸¦ È£ÃâÇϸé i2c_transfer ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. i2c-dev¿¡¼­ È£ÃâÇÏ´Â i2c_master_send, i2c_master_recv, i2c_transfer ÇÔ¼öµéÀº i2c-dev¿¡ ¿¬°áµÈ i2c ¾î´ðÅÍ ±¸Á¶Ã¼¸¦ ÂüÁ¶ÇÏ°í, ÀÌ ±¸Á¶Ã¼¿¡ Æ÷ÇÔµÈ i2c ¾Ë°í¸®Áò ±¸Á¶Ã¼¿¡ Á¤ÀǵǾî ÀÖ´Â master_xfer¶ó´Â ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ÀÌ master_xfer´Â Çϵå¿þ¾î ±¸Á¶¿¡ ¸Â°Ô ÇÁ·Î±×·¥µÈ ½ÇÁ¦ÀûÀÎ I2C ¹ö½º Á¦¾î Äڵ尡 Á¸ÀçÇÏ°Ô µÈ´Ù.
 
ÀÌ·± ±¸Á¶À̱⠶§¹®¿¡ Ä¿³Î¿¡¼­ I2C ¹ö½º¸¦ Áö¿øÇϵµ·Ï Çϱâ À§Çؼ­´Â ÇØ´ç I2C ¹ö½º¸¦ Á¦¾îÇÏ´Â i2C ¾î´ðÅÍ¿Í i2c ¾Ë°í¸®ÁòÀ» ±¸ÇöÇÏ´Â ¼Ò½º¸¦ Ä¿³Î ¼Ò½º ³»¿¡ Æ÷ÇÔ½ÃÄÑ¾ß ÇÑ´Ù. ÇÁ·Î±×·¡¸Ó°¡ ÇØ¾ß ÇÒ ÀÛ¾÷Àº ¹Ù·Î ÀÌ µÎ ±¸Á¶Ã¼¿Í °ü·ÃµÈ ·çƾÀ» ÀÛ¼ºÇÏ´Â °ÍÀÌ´Ù.
 

 
struct i2c_adapter
¾î´ðÅÍ ±¸Á¶Ã¼´Â Ä¿³Î ¼Ò½º»ó¿¡ linux/include/linux/i2c.h¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù. ÀÌ ¾î´ðÅÍ ±¸Á¶Ã¼´Â Ä¿³Î¿¡ ³»ºÎÀûÀ¸·Î I2C ¹ö½º¸¦ °ü¸®Çϱâ À§ÇÑ µ¥ÀÌÅÍ¿Í °ü·ÃµÈ Á¤º¸¸¦ ´ã°Ô µÈ´Ù. ¿©·¯ Çʵ尡 ÀÖÁö¸¸ ¹Ýµå½Ã ±¸ÇöÇØ¾ß ±¸Á¶Ã¼ Çʵå¿Í ÇÊ¿ä¿¡ µû¶ó¼­ ó¸®ÇØ¾ß ÇÏ´Â Çʵå´Â ´ÙÀ½°ú °°´Ù. ±× ¿ÜÀÇ Çʵå´Â Ä¿³Î ³»ºÎÀûÀ¸·Î ÀûÀýÈ÷ ÃʱâÈ­µÇ¹Ç·Î ÇÁ·Î±×·¡¸Ó°¡ ½Å°æ¾²Áö ¾Ê¾Æµµ µÈ´Ù.
 
Çʼö Çʵå
¡ß struct module *owner: 2.6 Ä¿³Î¿¡¼­´Â ¹Ýµå½Ã ÁöÁ¤ÇØ¾ß ÇÏ´Â ÇÊµå º¯¼öÀÌ´Ù. THIS_MODULE¸¦ ÁöÁ¤ÇÏ¸é µÈ´Ù.
¡ß char name[I2C_NAME_SIZE] : ¾î´ðÅÍ ¸íÀ» ÁöÁ¤ÇÏ´Â ÇÊµå º¯¼öÀÌ´Ù.
¡ß struct i2c_algorithm *algo : I2C ¹ö½º¸¦ Á¦¾îÇÏ´Â ÇÔ¼öµéÀ» µî·ÏÇÑ ±¸Á¶Ã¼ ÁÖ¼Ò¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ ºÎºÐ¿¡ ´ëÇÑ °ÍÀº struct  i2c_algorithm¸¦ ¼³¸íÇϸ鼭 ÀÚ¼¼ÇÏ°Ô ´Ù·é´Ù.
 
ÇÊ¿ä¿¡ µû¶ó¼­ ¼±¾ðÇÒ ÇÊ¿ä°¡ ÀÖ´Â Çʵåµé
¡ß unsigned int id : ¾î´ðÅ͸¦ ±¸º°Çϱâ À§ÇÑ °íÀ¯ ½Äº° ¼ýÀÚ¸¦ ÁöÁ¤ÇÑ´Ù. I2C_HW_·Î ½ÃÀÛÇÏ´Â °ªÀ» ÁöÁ¤ÇÏ¸é µÈ´Ù. ÀÌ °ªÀº linux/i2c-id.h¿¡ Á¤ÀǵǾî ÀÖ´Ù. ÇÊ¿äÇÏ´Ù¸é ÀÌ ÆÄÀÏ¿¡ »õ·Î¿î id¸¦ ¼±¾ðÇÏ¿© »ç¿ëÇÑ´Ù.
¡ß unsigned int class :  ¾î´ðÅÍÀÇ Å¬·¡½º¸¦ ÁöÁ¤ÇÑ´Ù. I2C_CLASS_·Î ½ÃÀÛÇÏ´Â °ªÀ» ÁöÁ¤ÇÏ¸é µÈ´Ù. ÀÌ °ªÀº linux/i2c.h¿¡ Á¤ÀǵǾî ÀÖ´Ù. ÇÊ¿äÇÏ´Ù¸é ÀÌ ÆÄÀÏ¿¡ »õ·Î¿î Ŭ·¡½º¸¦ ¼±¾ðÇÏ¿© »ç¿ëÇÑ´Ù.
¡ß void *algo_data : struct i2c_algorithm¿¡¼­ Á¤ÀÇµÈ ÇÔ¼ö¿¡ Àü´ÞÇÏ¿© °ü¸®°¡ ÇÊ¿äÇÑ µ¥ÀÌÅÍ°¡ ÀÖÀ» °æ¿ì ÀÌ Çʵ忡 ¼±¾ðÇÑ´Ù.
¡ß int timeout : ÇϳªÀÇ µ¥ÀÌÅÍ ºí·°À» I2C µð¹ÙÀ̽º¿¡ Àü¼ÛÇϰųª ÀÐ¾î µéÀÌ·Á ÇÒ ¶§ÀÇ Ã³¸®°¡ ³¡³¯ ¶§°¡Áö ÁöÁ¤ÇØ¾ß ÇÏ´Â ´ë±â ½Ã°£ Ãʱ⠰ªÀÌ´Ù.
¡ß int retries : I2C ¹ö½º¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÒ °æ¿ì¿¡ ¹Ýº¹ÇÒ °ªÀ» ¼³Á¤ÇÑ´Ù.
 

 
¾î´ðÅÍ ±¸Á¶Ã¼¸¦ ¼±¾ðÇÏ°í °ü¸®ÇÏ´Â ·çƾÀÇ ¿¹´Â ¸®´ª½º Ä¿³Î ¼Ò½º µð·ºÅ丮 Áß¿¡ ´ÙÀ½À» Âü°íÇÏ¸é µÈ´Ù.
linux/drivers/i2c/busses/
struct i2c_algorithm
i2c_algorithm ±¸Á¶Ã¼´Â ½ÇÁ¦·Î I2C ¹ö½º»ó¿¡ Á¸ÀçÇÏ´Â µð¹ÙÀ̽º¿¡ µ¥ÀÌÅÍÀÇ Àü¼ÛÀÌ ¹ß»ýÇÒ °æ¿ì¿¡ À̸¦ ó¸®ÇÏ´Â ÇÔ¼ö¸¦ Á¤ÀÇÇÏ°í ÀÌ ±¸Á¶Ã¼¸¦ ÀÌ¿ëÇÏ¿© µî·ÏÇÑ´Ù. ¿©·¯ ÇÔ¼öÇüÀÌ Á¤ÀǵǾî ÀÖÁö¸¸ ¾î´ðÅÍ ±¸Á¶Ã¼¿Í ¸¶Âù°¡Áö·Î ¹Ýµå½Ã Á¤ÀÇÇØ¾ß ÇÏ´Â Çʵ尡 ÀÖ°í ÇÊ¿äÇÒ °æ¿ì¿¡ ¼±¾ðÇÏ´Â °ÍÀÌ ÀÖ´Ù. ¿©±â¿¡ ¼Ò°³µÈ Çʵå ÀÌ¿Ü¿¡´Â ½Å°æ¾²Áö ¾Ê¾Æµµ µÈ´Ù.
 
Çʼö Çʵå
¡ß char name[32] : ¾Ë°í¸®ÁòÀÇ À̸§À» ÁöÁ¤ÇÏ´Â ÇÊµå º¯¼ö´Ù.
¡ß unsigned int id : ¾Ë°í¸®ÁòÀ» ±¸º°Çϱâ À§ÇÑ °íÀ¯ ½Äº° ¼ýÀÚ¸¦ ÁöÁ¤ÇÑ´Ù. I2C_ALGO_·Î ½ÃÀÛÇÏ´Â °ªÀ» ÁöÁ¤ÇÏ¸é µÈ´Ù. ÀÌ °ªÀº linux/i2c-id.h¿¡ Á¤ÀǵǾî ÀÖ´Ù. ÇÊ¿äÇÏ´Ù¸é ÀÌ ÆÄÀÏ¿¡ »õ·Î¿î id¸¦ ¼±¾ðÇÏ¿© »ç¿ëÇÑ´Ù.
¡ß int (*master_xfer)(struct i2c_adapter *adap,struct i2c_msg msgs[], int num): ÀÌ ÇÔ¼ö ÇÊµå º¯¼ö°¡ ½ÇÁ¦·Î I2CÀÇ ¹ö½º¸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌÅ͸¦ µð¹ÙÀ̽º¿¡ Àü¼ÛÇÏ°í µ¥ÀÌÅ͸¦ ó¸®ÇÏ´Â ÇÔ¼ö¸¦ µî·ÏÇÏ´Â ÇÊµå º¯¼öÀÌ´Ù.
 
ÇÊ¿ä¿¡ µû¶ó¼­ ¼±¾ðÇÒ ÇÊ¿ä°¡ ÀÖ´Â Çʵåµé
¡ß int (*algo_control)(struct i2c_adapter *, unsigned int, unsigned long): ¾Ë°í¸®ÁòÀ» Á¦¾îÇϱâ À§ÇÑ ioctl È®ÀåÀÌ ÇÊ¿äÇÏ´Ù¸é ÀÌ ÇÔ¼ö¸¦ ¼±¾ðÇØ¾ß ÇÑ´Ù. ±âº»ÀûÀÎ I2C Á¦¾î ÀÌ¿Ü¿¡ ioctl ¸í·ÉÀ» È®ÀåÇϱâ À§Çؼ­ »ç¿ëµÇ¹Ç·Î Ä¿³ÎÀº ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ÀÇÇؼ­ ioctl ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µðÆúÆ®·Î ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ó¸®Çϵµ·Ï ÇÑ´Ù. µÎ ¹ø° ¸Å°³º¯¼ö°¡ ioctl¿¡ Àü´ÞµÈ ¸í·ÉÀ» ¹Þ°Ô µÇ°í ¼¼ ¹ø° ¸Å°³º¯¼ö°¡ ±× ºÎ°¡ Á¤º¸¸¦ À§ÇÑ µ¥ÀÌÅ͸¦ Àü´Þ¹Þ´Â´Ù.
¡ß u32 (*functionality) (struct i2c_adapter *) : ÀÌ ÇÔ¼ö Çʵå´Â ¾Ë°í¸®ÁòÀÌ Ã³¸®ÇÏ´Â ±â´É¿¡ ´ëÇÑ Á¶È¸¸¦ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ¿äûÇßÀ» ¶§ È£ÃâµÈ´Ù.
 
¾Ë°í¸®ÁòÀº Ä¿³Î ¼Ò½ºÀÇ ´ÙÀ½ µð·ºÅ丮¿¡ ±¸Çö ¿¹¸¦ ã¾Æ º¼ ¼ö ÀÖ´Ù.
linux/drivers/i2c/algos/
I2C ¾î´ðÅÍ µð¹ÙÀ̽º µå¶óÀ̹öÀÇ ±¸Á¶
Áö±Ý±îÁö I2C ¾î´ðÅ͸¦ ±¸ÇöÇϱâ À§ÇÑ °ü·Ã ±¸Á¶Ã¼¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸¾Ò´Ù. ±×·±µ¥ ½ÇÁ¦ Ä¿³Î ¼Ò½º¸¦ º¸¸é ¸Å¿ì º¹ÀâÇÏ°Ô µÇ¾î ÀÖ´Ù. ±×·¸´Ù°í Áö¸éÀÌ ÇÑÁ¤µÇ¾î ÀÖ´Â »óȲ¿¡ ÀÌ¿¡ ´ëÇÑ ¸ðµç °ÍÀ» ¿©±â¿¡ ¼³¸íÇÒ ¼ö´Â ¾ø´Ù. ±×·¡¼­ ¾ÆÁÖ ±âº»ÀûÀ¸·Î ¾î´ðÅ͸¦ ±¸ÇöÇÏ´Â ±âÃÊÀûÀÌ°í °³³äÀûÀÎ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ¿©±â¿¡ ¼Ò°³ÇÏ°Ú´Ù. ¹°·Ð I2C ¹ö½º¸¦ Á¦¾îÇϱâ À§ÇÑ ·çƾÀº ¿©±â¿¡ ¼Ò°³ÇÏÁö´Â ¾Ê´Â´Ù. ´ÜÁö I2C ¾î´ðÅÍ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÌÇØÇÏ°í Ä¿³Î ¼Ò½º¿¡ ±¸ÇöµÈ ³»¿ëÀ» ÀÌÇØÇϱâ À§ÇÑ ÇÙ½ÉÀ» ÀÌÇØÇϱâ À§ÇÑ ¼Ò½ºÀÓÀ» ±â¾ïÇÏÀÚ.
static int iic_xxx_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num)
{
    // I2C ¹ö½º Á¦¾î¸¦ À§ÇÑ ±¸Çö ·çƾ
    return ret;
}
static struct i2c_algorithm iic_xxx_algo =
{
       .name          = ¡°Sample IIC algorithm¡±,
       .id            = I2C_ALGO_SAMPLE,
       .master_xfer   = iic_xxx_xfer,
};
static struct i2c_adapter iic_xxx_adapter =
{
       .owner      = THIS_MODULE,
       .name       = ¡°Sample IIC adapter¡±,
       .algo       = &iic_xxx_algo,
};
static int __init iic_xxx_init(void)
{
       iic_xxx_hw_init();                   // I2C ¹ö½º¸¦ Á¦¾îÇϱâ À§ÇÑ Çϵå¿þ¾î ÃʱâÈ­ ·çƾ ¸Þ¸ð¸® ÇÒ´ç, ÀÎÅÍ·´Æ® µî·Ï ó¸®
       i2c_add_adapter( &iic_xxx_adapter ); // ¾î´ðÅÍ µî·Ï
       return 0;
}
static void iic_xxx_exit(void)
{
        i2c_del_adapter(&iic_xxx_adapter);  // ¾î´ðÅÍ µî·Ï ÇØÁ¦
        iic_xxx_hw_release ();              // I2C ¹ö½º¸¦ Á¾·áÇϱâ À§ÇÑ Çϵå¿þ¾î ¼Ë´Ù¿î ·çƾ ¸Þ¸ð¸® ÇØÁ¦, ÀÎÅÍ·´Æ® Á¦°Å ó¸®
}
 
module_init(iic_xxx_init);
module_exit(iic_xxx_exit);
 
MODULE_AUTHOR(¡°you young-change <frog@falinux.com>¡±);
MODULE_DEscRIPTION(¡°I2C-Bus adapter sample routines¡±);
MODULE_LICENSE(¡°GPL¡±);
ÀÌ ¼Ò½ºÀÇ ÇÔ¼ö Áß¿¡ xxx°¡ Æ÷ÇÔµÈ °ÍÀº ¸¸µé¾îÁà¾ß ÇÏ´Â ÇÔ¼öÀÓÀ» ÀǹÌÇÑ´Ù. ÀÌ ¼Ò½º´Â µ¿ÀÛÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ´ÜÁö °³³äÀ» º¸¿©ÁÖ±â À§ÇÑ °ÍÀÌ´Ù. ÀÌ ¼Ò½º¿¡¼­ Áß¿äÇÑ °ÍÀº iic_xxx_xfer ÇÔ¼öÀÇ ±¸ÇöÀÌ´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼¼ °¡Áö ¸Å°³º¯¼ö¸¦ Àü´Þ¹Þ´Â´Ù.
int iic_xxx_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num)
¾Õ¿¡¼­ ÀÀ¿ë ÇÁ·Î±×·¥À» ¼³¸íÇÒ ¶§ read, write, ioctlÀ» ÀÌ¿ëÇÏ¿© I2C ¹ö½ºÀÇ µð¹ÙÀ̽º¿¡ Á¢±ÙÇߴµ¥ °á±¹Àº ÀÌ ÇÔ¼ö°¡ ÃÖÁ¾ÀûÀ¸·Î 󸮸¦ ¸Ã´Â´Ù. read, ¶Ç´Â write ÇÔ¼ö´Â numÀÌ 1·Î Àü´ÞµÇ°í ioctlÀÇ I2C_RDWD¿¡ Àü´ÞµÈ ±¸Á¶Ã¼´Â °¢°¢ msgs ¿Í num¿¡ °¢°¢ Àü´ÞµÈ´Ù. ±×·¡¼­ ÀÌ ÇÔ¼ö´Â num¸¸Å­ ¹Ýº¹ÀûÀ¸·Î ÀûÀýÈ÷ msgs¿¡ Àü´ÞµÈ µ¥ÀÌÅ͸¦ ó¸®ÇÏ´Â ±¸Á¶·Î ÀÛ¼ºµÇ¾î¾ß ÇÑ´Ù. ÀÌ ÇÔ¼öÀÇ ±¸Çö ¹æ¹ýÀº I2C ¹ö½ºÀÇ ÀÌÇØ¿Í ÇÔ²² Ä¿³Î ¼Ò½º¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.
 
ÁغñµÈ ¾Ë°í¸®Áòµé
¸®´ª½º Ä¿³Î¿¡¼­ ¾î´ðÅÍ¿Í ¾Ë°í¸®ÁòÀ» ºÐ¸®ÇÑ ÀÌÀ¯´Â ¾Ë°í¸®ÁòÀ» Àç»ç¿ëÇϱâ À§Çؼ­ÀÌ´Ù. I2C ¹ö½º¸¦ ó¸®ÇÏ´Â °æ¿ì´Â Å©°Ô GPIO¸¦ »ç¿ëÇÏ¿© ±¸ÇöÇÏ´Â °æ¿ì¿Í Àü¿ë I2C ÄÁÆ®·Ñ·¯¸¦ ÀÌ¿ëÇÏ¿© ±¸ÇöÇÏ´Â °æ¿ì·Î ³ª´©¾îÁú ¼ö ÀÖ´Ù. ÀÓº£µðµå ½Ã½ºÅÛ¿¡¼­ °¡Àå ÀϹÝÀûÀ¸·Î ±¸ÇöÇÏ´Â ¹æ¹ýÀº GPIO¸¦ »ç¿ëÇÏ´Â °ÍÀÌ º¸ÆíÀûÀε¥ ÀÌ ¶§ »ç¿ë °¡´ÉÇÑ ¾Ë°í¸®ÁòÀº linux/drivers/i2c/algos/i2c_algo-bit.c ¼Ò½º¿¡ ±¸ÇöµÈ °ÍÀ» Àç»ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. Àü¿ë ÄÁÆ®·Ñ·¯¸¦ »ç¿ëÇÏ´Â °æ¿ì¿¡´Â ±âÁ¸ °ÍÀ» ÀçÈ°¿ëÇÏ´Â °Íº¸´Ù ´Ù¸¥ ¾Ë°í¸®ÁòÀ» ±¸ÇöÇÑ ¼Ò½º¸¦ º¸°í ´Ù½Ã ±¸ÇöÇÏ´Â °ÍÀÌ ÁÁ´Ù. ÀÌ ¶§ Âü°íÇÏ´Â °¡Àå ´ëÇ¥ÀûÀÎ °ÍÀº ´ÙÀ½°ú °°´Ù.
¡ß i2c-algo-bit.c : GPIO ¸¦ ÀÌ¿ëÇÏ¿© ±¸ÇöÇÏ´Â °æ¿ì¿¡ »ç¿ëÇÑ´Ù.
¡ß i2c-algo-pcf.c : Àü¿ë ÄÁÆ®·Ñ·¯¸¦ »ç¿ëÇÏ¿© ±¸ÇöÇÏ´Â °æ¿ì ÂüÁ¶ÇÒ ¼ö ÀÖ´Â ¼Ò½º
¡ß i2c-algo-ite.c : Àü¿ë ÄÁÆ®·Ñ·¯¸¦ »ç¿ëÇÏ¿© ±¸ÇöÇÏ´Â °æ¿ì ÂüÁ¶ÇÒ ¼ö ÀÖ´Â ¼Ò½º

À̸§ Æнº¿öµå
ºñ¹Ð±Û (üũÇÏ¸é ±Û¾´À̸¸ ³»¿ëÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.)
¿ÞÂÊÀÇ ±ÛÀÚ¸¦ ÀÔ·ÂÇϼ¼¿ä.
   

 



 
»çÀÌÆ®¸í : ¸ðÁö¸®³× | ´ëÇ¥ : ÀÌ°æÇö | °³ÀÎÄ¿¹Â´ÏƼ : ·©Å°´åÄÄ ¿î¿µÃ¼Á¦(OS) | °æ±âµµ ¼º³²½Ã ºÐ´ç±¸ | ÀüÀÚ¿ìÆí : mojily°ñ¹ðÀÌchonnom.com Copyright ¨Ï www.chonnom.com www.kyunghyun.net www.mojily.net. All rights reserved.