ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

LinuxÄÚºËÖÐioremapÓ³ÉäµÄ͸³¹Àí½â(Ò»)
2014-11-24 08:17:53 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:1´Î
Tags£ºLinux ÄÚºË ioremap Ó³Éä ͸³¹ Àí½â

¼¸ºõÿһÖÖÍâÉè¶¼ÊÇͨ¹ý¶ÁдÉ豸ÉϵļĴæÆ÷À´½øÐеģ¬Í¨³£°üÀ¨¿ØÖƼĴæÆ÷¡¢×´Ì¬¼Ä´æÆ÷ºÍÊý¾Ý¼Ä´æÆ÷Èý´óÀ࣬ÍâÉèµÄ¼Ä´æÆ÷ͨ³£±»Á¬ÐøµØ±àÖ·¡£¸ù¾ÝCPUÌåϵ½á¹¹µÄ²»Í¬£¬CPU¶ÔIO¶Ë¿ÚµÄ±àÖ··½Ê½ÓÐÁ½ÖÖ£º


¡¡¡¡£¨1£©I/OÓ³É䷽ʽ£¨I/O-mapped£©


¡¡¡¡µäÐ͵أ¬ÈçX86´¦ÀíÆ÷ΪÍâÉèרÃÅʵÏÖÁËÒ»¸öµ¥¶ÀµÄµØÖ·¿Õ¼ä£¬³ÆÎª"I/OµØÖ·¿Õ¼ä"»òÕß"I/O¶Ë¿Ú¿Õ¼ä"£¬CPUͨ¹ýרÃŵÄI/OÖ¸ÁÈçX86µÄINºÍOUTÖ¸ÁÀ´·ÃÎÊÕâÒ»¿Õ¼äÖеĵØÖ·µ¥Ôª¡£


¡¡¡¡£¨2£©ÄÚ´æÓ³É䷽ʽ£¨Memory-mapped£©


¡¡¡¡RISCÖ¸ÁîϵͳµÄCPU£¨ÈçARM¡¢PowerPCµÈ£©Í¨³£Ö»ÊµÏÖÒ»¸öÎïÀíµØÖ·¿Õ¼ä£¬ÍâÉèI/O¶Ë¿Ú³ÉΪÄÚ´æµÄÒ»²¿·Ö¡£´Ëʱ£¬CPU¿ÉÒÔÏó·ÃÎÊÒ»¸öÄÚ´æµ¥ÔªÄÇÑù·ÃÎÊÍâÉèI/O¶Ë¿Ú£¬¶ø²»ÐèÒªÉèÁ¢×¨ÃŵÄÍâÉèI/OÖ¸Áî¡£


¡¡¡¡µ«ÊÇ£¬ÕâÁ½ÕßÔÚÓ²¼þʵÏÖÉϵIJîÒì¶ÔÓÚÈí¼þÀ´ËµÊÇÍêȫ͸Ã÷µÄ£¬Çý¶¯³ÌÐò¿ª·¢ÈËÔ±¿ÉÒÔ½«ÄÚ´æÓ³É䷽ʽµÄI/O¶Ë¿ÚºÍÍâÉèÄÚ´æÍ³Ò»¿´×÷ÊÇ"I/OÄÚ´æ"×ÊÔ´¡£


¡¡¡¡Ò»°ãÀ´Ëµ£¬ÔÚϵͳÔËÐÐʱ£¬ÍâÉèµÄI/OÄÚ´æ×ÊÔ´µÄÎïÀíµØÖ·ÊÇÒÑÖªµÄ£¬ÓÉÓ²¼þµÄÉè¼Æ¾ö¶¨¡£µ«ÊÇCPUͨ³£²¢Ã»ÓÐΪÕâЩÒÑÖªµÄÍâÉèI/OÄÚ´æ×ÊÔ´µÄÎïÀíµØÖ·Ô¤¶¨ÒåÐéÄâµØÖ··¶Î§£¬Çý¶¯³ÌÐò²¢²»ÄÜÖ±½Óͨ¹ýÎïÀíµØÖ··ÃÎÊI/OÄÚ´æ×ÊÔ´£¬¶ø±ØÐ뽫ËüÃÇÓ³Éäµ½ºËÐÄÐ鵨ַ¿Õ¼äÄÚ£¨Í¨¹ýÒ³±í£©£¬È»ºó²ÅÄܸù¾ÝÓ³ÉäËùµÃµ½µÄºËÐÄÐ鵨ַ·¶Î§£¬Í¨¹ý·ÃÄÚÖ¸Áî·ÃÎÊÕâЩI/OÄÚ´æ×ÊÔ´¡£LinuxÔÚio.hÍ·ÎļþÖÐÉùÃ÷Á˺¯Êýioremap£¨£©£¬ÓÃÀ´½«I/OÄÚ´æ×ÊÔ´µÄÎïÀíµØÖ·Ó³Éäµ½ºËÐÄÐ鵨ַ¿Õ¼ä£¨3GB£­4GB£©ÖУ¬Ô­ÐÍÈçÏ£º


void * ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags);


¡¡¡¡iounmapº¯ÊýÓÃÓÚÈ¡Ïûioremap£¨£©Ëù×öµÄÓ³É䣬ԭÐÍÈçÏ£º


void iounmap(void * addr);


¡¡¡¡ÕâÁ½¸öº¯Êý¶¼ÊÇʵÏÖÔÚmm/ioremap.cÎļþÖС£


¡¡¡¡ÔÚ½«I/OÄÚ´æ×ÊÔ´µÄÎïÀíµØÖ·Ó³Éä³ÉºËÐÄÐ鵨ַºó£¬ÀíÂÛÉϽ²ÎÒÃǾͿÉÒÔÏó¶ÁдRAMÄÇÑùÖ±½Ó¶ÁдI/OÄÚ´æ×ÊÔ´ÁË¡£ÎªÁ˱£Ö¤Çý¶¯³ÌÐòµÄ¿çƽ̨µÄ¿ÉÒÆÖ²ÐÔ£¬ÎÒÃÇÓ¦¸ÃʹÓÃLinuxÖÐÌØ¶¨µÄº¯ÊýÀ´·ÃÎÊI/OÄÚ´æ×ÊÔ´£¬¶ø²»Ó¦¸Ãͨ¹ýÖ¸ÏòºËÐÄÐ鵨ַµÄÖ¸ÕëÀ´·ÃÎÊ¡£ÈçÔÚx86ƽ̨ÉÏ£¬¶ÁдI/OµÄº¯ÊýÈçÏÂËùʾ£º


#define readb(addr) (*(volatile unsigned char *) __io_virt(addr))
#define readw(addr) (*(volatile unsigned short *) __io_virt(addr))
#define readl(addr) (*(volatile unsigned int *) __io_virt(addr))


#define writeb(b,addr) (*(volatile unsigned char *) __io_virt(addr) = (b))
#define writew(b,addr) (*(volatile unsigned short *) __io_virt(addr) = (b))
#define writel(b,addr) (*(volatile unsigned int *) __io_virt(addr) = (b))


#define memset_io(a,b,c) memset(__io_virt(a),(b),(c))
#define memcpy_fromio(a,b,c) memcpy((a),__io_virt(b),(c))
#define memcpy_toio(a,b,c) memcpy(__io_virt(a),(b),(c))


¡¡¡¡×îºó£¬ÎÒÃÇÒªÌØ±ðÇ¿µ÷Çý¶¯³ÌÐòÖÐmmapº¯ÊýµÄʵÏÖ·½·¨¡£ÓÃmmapÓ³ÉäÒ»¸öÉ豸£¬Òâζ×ÅʹÓû§¿Õ¼äµÄÒ»¶ÎµØÖ·¹ØÁªµ½É豸ÄÚ´æÉÏ£¬ÕâʹµÃÖ»Òª³ÌÐòÔÚ·ÖÅäµÄµØÖ··¶Î§ÄÚ½øÐжÁÈ¡»òÕßдÈ룬ʵ¼ÊÉϾÍÊǶÔÉ豸µÄ·ÃÎÊ¡£


¡¡¡¡±ÊÕßÔÚLinuxÔ´´úÂëÖнøÐаüº¬"ioremap"Îı¾µÄËÑË÷£¬·¢ÏÖÕæÕý³öÏÖµÄioremapµÄµØ·½Ï൱ÉÙ¡£ËùÒÔ±ÊÕß×·¸ùË÷Ô´µØÑ°ÕÒI/O²Ù×÷µÄÎïÀíµØÖ·×ª»»µ½ÐéÄâµØÖ·µÄÕæÊµËùÔÚ£¬·¢ÏÖLinuxÓÐÌæ´úioremapµÄÓï¾ä£¬µ«ÊÇÕâ¸öת»»¹ý³ÌÈ´ÊDz»¿É»òȱµÄ¡£


¡¡¡¡Æ©ÈçÎÒÃÇÔÙ´ÎժȡS3C2410Õâ¸öARMоƬRTC£¨ÊµÊ±ÖÓ£©Çý¶¯ÖеÄһС¶Î£º


static void get_rtc_time(int alm, struct rtc_time *rtc_tm)
{
¡¡spin_lock_irq(&rtc_lock);
¡¡if (alm == 1) {
¡¡¡¡rtc_tm->tm_year = (unsigned char)ALMYEAR & Msk_RTCYEAR;
¡¡¡¡rtc_tm->tm_mon = (unsigned char)ALMMON & Msk_RTCMON;
¡¡¡¡rtc_tm->tm_mday = (unsigned char)ALMDAY & Msk_RTCDAY;
¡¡¡¡rtc_tm->tm_hour = (unsigned char)ALMHOUR & Msk_RTCHOUR;
¡¡¡¡rtc_tm->tm_min = (unsigned char)ALMMIN & Msk_RTCMIN;
¡¡¡¡rtc_tm->tm_sec = (unsigned char)ALMSEC & Msk_RTCSEC;
¡¡}
¡¡else {
¡¡¡¡read_rtc_bcd_time:
¡¡¡¡rtc_tm->tm_year = (unsigned char)BCDYEAR & Msk_RTCYEAR;
¡¡¡¡rtc_tm->tm_mon = (unsigned char)BCDMON & Msk_RTCMON;
¡¡¡¡rtc_tm->tm_mday = (unsigned char)BCDDAY & Msk_RTCDAY;
¡¡¡¡rtc_tm->tm_hour = (unsigned char)BCDHOUR & Msk_RTCHOUR;
¡¡¡¡rtc_tm->tm_min = (unsigned char)BCDMIN & Msk_RTCMIN;
¡¡¡¡rtc_tm->tm_sec = (unsigned char)BCDSEC & Msk_RTCSEC;


¡¡¡¡if (rtc_tm->tm_sec == 0) {
¡¡¡¡¡¡/* Re-read all BCD registers in case of BCDSEC is 0.
¡¡¡¡¡¡See RTC section at the manual for more info. */
¡¡¡¡¡¡goto read_rtc_bcd_time;
¡¡¡¡}
¡¡}
¡¡spin_unlock_irq(&rtc_lock);


¡¡BCD_TO_BIN(rtc_tm->tm_year);
¡¡BCD_TO_BIN(rtc_tm->tm_mon);
¡¡BCD_TO_BIN(rtc_tm->tm_mday);
¡¡BCD_TO_BIN(rtc_tm->tm_hour);
¡¡BCD_TO_BIN(rtc_tm->tm_min);
¡¡BCD_TO_BIN(rtc_tm->tm_sec);


¡¡/* The epoch of tm_year is 1900 */
¡¡rtc_tm->tm_year += RTC_LEAP_YEAR - 1900;


¡¡/* tm_mon starts at 0, but rtc month starts at 1 */
¡¡rtc_tm->tm_mon--;
}


¡¡¡¡I/O²Ù×÷ËÆºõ¾ÍÊǶÔALMYEAR¡¢ALMMON¡¢ALMDAY¶¨ÒåµÄ¼Ä´æÆ÷½øÐвÙ×÷£¬ÄÇÕâЩºê¾¿¾¹¶¨ÒåÎªÊ²Ã´ÄØ£¿


#define ALMDAY bRTC(0x60)
#define ALMMON bRTC(0x64)
#define ALMYEAR bRTC(0x68)


¡¡¡¡ÆäÖнèÖúÁ˺êbRTC

Ê×Ò³ ÉÏÒ»Ò³ 1 2 ÏÂÒ»Ò³ βҳ 1/2/2
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºAndroid ºáÆÁ£¬ÊúÆÁÇл»Ê±ºòµÄ×´.. ÏÂһƪ£ºARM Linux»ù±¾ÔËËã·û×ÛºÏʵÀý

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ:

¡¤Spring Boot Java£º (2025-12-26 16:20:19)
¡¤Spring Boot¤ÇHello (2025-12-26 16:20:15)
¡¤Spring ¤Î»ù±¾¤«¤éŒ (2025-12-26 16:20:12)
¡¤C++Ä£°å (template) (2025-12-26 15:49:49)
¡¤C ÓïÑÔÖÐÄ£°åµÄ¼¸ÖÖ (2025-12-26 15:49:47)