»Ë»Ñ Æ÷·³

¶óÁ¸®ÆÄÀÌ Æß¿þ¾î·Î hdmi Ãâ·ÂÇϱâ(2)2

  • [* ºñȸ¿ø *]
  • µî·ÏÀÏ 2013-09-09 12:58
  • Á¶È¸¼ö 1253
º°°Å ¾ø´Âµ¥ ±ÛÀÌ µÇ°Ô ±æ¾îÁö³×¿ä *_*;;

4. main.s¸¦ ÀÛ¼ºÇغ¸ÀÚ!

¸ð¸§Áö±â Æß¿þ¾îÀÇ ½ÃÀÛÀº ¾î¼Àºí¸®¾îÁÒ! ¤»

.cÆÄÀÏÀÌ c¼Ò½ºÄÚµå ÆÄÀÏÀ̶ó¸é, .sÆÄÀÏÀº arm¾î¼Àºí¸® ÆÄÀÏÀ̶ø´Ï´Ù!

°£´ÜÈ÷ È­¸é¿¡ Ãâ·ÂÇϱ⸸ ÇÒ²¨¶ó¼­ ±×³É ½ºÅà À§Ä¡¸¸ ÁöÁ¤ÇØÁÖ°í ¹Ù·Î c·Î ³Ñ¾î°¥°Å¿¡¿ä~


.section .init
.globl _start
_start:

b init

.section .text
init:
mov sp,#0x8000
b main


¼³¸íÇÒ°Ô¿ä!

óÀ½ .section À̶ó´Â Å°¿öµå°¡ º¸À̽ÇÅÙµ¥¿ä, ÀÌ Å°¿öµå´Â GNU AssemblerÀÎ GASÀÇ Å°¿öµå¿¡¿ä

±×·¯´Ï±î, ¿ø·¡ arm ¾î¼Àºí¸® ¸í·É¾î´Â ¾Æ´Ï¶õ ¼Ò¸®¿¡¿ä!

ÀÌ .sectionÅ°¿öµå´Â, ÀÏ´Ü, ¼½¼Ç¿¡ ´ëÇÑ ¾à°£ÀÇ Áö½ÄÀÌ ÇÊ¿äÇѵ¥¿ä,

ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼­´Â ¸î°¡Áö ±âÁØÀ» µÎ°í, ±× ±âÁØ¿¡ µû¶ó¼­ º¯¼ö³ª ÇÔ¼ö³ª Äڵ带 ºÐ¸®½ÃÄÑ¿ä

Çб³¿¡¼­ ¹è¿ì½ÅºÐµéÀÌ ¸¹À¸½Ã°ÚÁö¸¸, Àü¿ªº¯¼ö´Â data ȤÀº bss section¿¡ ÀúÀåµÈ´Ù´Â »ç½ÇÀ» ¾Ë°í °è½Ç°Å¿¡¿ä

¶ÇÇÑ, ÄÚµå ºÎºÐÀº text ¼½¼Ç¿¡ ÀúÀåµÈ´Ù´Â°Í ¶ÇÇÑ ¾Ë°í °è½Ç°Å¿¡¿ä

±×¸®°í, Áö¿ªº¯¼ö´Â stack ÀúÀåµÈ´Ù´Â°Í ±îÁöµÎ¿ä!

¹Ù·Î ±×°Ô ¿©±â¼­ ¸»ÇÏ´Â ±× "¼½¼Ç"À̶ó´Â ³à¼®Àä,

.section Å°¿öµå´Â ¸»·Î Ç®ÀÌÇÏ¸é ´ÙÀ½°ú °°¾Æ¿ä

.section .init
"¿©±â¼­ºÎÅÍ´Â .init¼½¼Ç ¿µ¿ªÀÓ"

Áï, init¶ó´Â ¼½¼Ç¿µ¿ª¿¡ ÀÌ Äڵ带 ³Ö¾î¶ó´Â ¼Ò¸®°¡ µÇ´Â°ÅÁÒ!

±×·³ 2¹ø° ÁÙ·Î ³Ñ¾î°¡¼­

.global _start

ÀÌ ¶ÇÇÑ ¾î¼Àºí¸®¾î°¡ ¾Æ´Ï¶ó gas Å°¿öµåÀä

.global _start´Â, _start¶ó´Â ·¹À̺í(c¾ð¾î¼¼¾î ÇÔ¼ö¿Í °°¾Æ¿ä!) À» global·Î ¼±¾ðÇϴ°ſ¡¿ä

Áï, ÀÌ Äڵ尡 ¸µÅ·µÇ´Â ¾î¶² °÷¿¡¼­µç _start¶ó´Â ·¹À̺íÀ» È£ÃâÇÒ ¼ö ÀÖ¾î¿ä!(¹°·Ð ¾î¼Àºí¸®¿¡¼­¸¸...)

±×¸®°í 3¹ø° ÁÙ·Î ³Ñ¾î°¡¸é,

_start: °¡ ³ª¿Í¿ä

ÀÌ°É c¾ð¾î·Î Ç®¾îº¸¸é

void _start(void) { ...}

¿Í °°¾Æ¿ä! ¿©±â¼­ ÁÖÀÇÇÒ Á¡Àº, ÆíÀÇ»ó ¸®ÅÏÇüÀ» void ±×¸®°í, ÆĶó¹ÌÅ͸¦ void·Î Ç¥ÇöÇßÁö¸¸,

½ÇÁ¦ ¾î¼Àºí¸®¾î¿¡¼­´Â ±×·±°Å ¾ø´Ù´Â°Í Á¤µµ¸¸ ¾Ë¾ÆµÎ¼¼¿ä!

±×¸®°í 4¹ø°·Î ³Ñ¾î°¡¸é

b init°¡ ³ª¿À´Âµ¥¿ä,

b´Â arm¾î¼Àºí¸®¾î·Î½á, Branch ¶ó´Â ¶æÀ» ÀǹÌÇÏ°í Àִµ¥¿ä

¿ì¸®¸»·Î "ºÐ±â"¶ó°í ÇØ¿ä

ºÐ±â´Â ¿ì¸®¸»ÀÌÁö¸¸, Àß ¾²ÀÌÁö ¾Ê´Â ¸»ÀÏÅÙµ¥¿ä.. ±×³É, c¾ð¾î·Î Ç®¸é

init(); ¿Íµµ °°Àº°Å¿¡¿ä

x86¾î¼À¿¡¼­´Â jmp¶ó°í ÇÏÁÒ??

** armÀº ¿µ±¹¿¡¼­ ¸¸µé¾îÁ®¼­ °°Àº ¶æÀÌ¶óµµ ´Ù¸¥ ´Ü¾î¸¦ »ç¿ëÇÑ°Ô ²Ï µÇ´Â°Í °°¾Æ¿ä!
óÀ½¿£ »ý¼ÒÇÑ°Ô ¾Ë°íº¸´Ï "±×°Ô ±× ¶æÀÌ¿´¾î?"¶ó´Â°Ô ²Ï µÇ´Â°Í °°¾Æ¿ä ¤»

±×¸®°í ´Ù½Ã ¹Ø¿¡ º¸¸é

.section .text
init:
°¡ ³ª¿À´Âµ¥, À§¿¡ ¼³¸íÇÑ°Í°ú µ¿ÀÏÇϱ¸¿ä
¹Ø¿¡ mov sp, #0x8000
°¡ ³ª¿À°Ô µÇ´Âµ¥¿ä,

mov´Â move¶ó´Â ¸í·É¾îÀä, °¡Àå ±âº»ÀûÀÎ ¸í·É¾îÁß ÇϳªÁÒ

°£´ÜÈ÷ c¾ð¾î·Î Â¥º¸¸é,

sp = 0x8000;

¿¡¿ä, À̶§, Áß¿äÇÑ°ÍÀÌ sp¶ó´Â³à¼®Àä,

ÀÌ ºÎºÐÀº ³ªÁß¿¡ ¼³¸íÇÏ°ÚÁö¸¸, Áö±ÝÀº ´ÜÁö "½ºÅÃÀÇ ÁÖ¼Ò¸¦ 0x8000·Î ³Ö¾ú´Ù" Á¤µµ·Î ¾Ë¾ÆµÎ¼¼¿ä!

±×¸®°í b mainÀÌ ³ª¿À°Ô µÇ´Âµ¥!

¿©±â°¡ main.sÀÇ ¸¶Áö¸·ÀÌ¿¡¿ä! ¤¾¤¾


5. ±×¸®°í main.c·Î!!

main.c¿¡¼­´Â ½ÇÁ¦ main¹®ÀÌ ÀÖ°í, È­¸éÀ» ÇϾé°Ô »öÄ¥ÇÒ°Å¿¡¿ä!

#include 

#define MAILBOX_READ                0x2000B880
#define MAILBOX_STATUS        0x2000B898
#define MAILBOX_WRITE                0x2000B8A0


#define MAILBOX_FULL                0x80000000
#define MAILBOX_EMPTY                0x40000000


void initFB();

volatile struct _framebuffer
{
        unsigned int width;
        unsigned int height;
        unsigned int vWidth;
        unsigned int vHeight;
        unsigned int pitch;
        unsigned int depth;
        unsigned int x;
        unsigned int y;
        unsigned int* pointer;
        unsigned int size;
};
unsigned short* pt = 0x00100000;

volatile struct _framebuffer fb;

volatile int main(void)
{
        int i = 0;
        int j = 0;
        initFB();
        *pt = (unsigned short)0xffff;
        pt = 0x00100000;
        for(i = 0; i<768; i++)
        {
                for(j = 0; j<1024; j++)
                {
                                *pt = (unsigned short)0xffff;
                                pt++;
                }
        }
        //draw_pixel(300, 300, 0x0000);
        draw_line(10, 150, 700, 700, 0x0000);
        
        return 0;
}


void initFB(void)
{
        unsigned int* fb_addr = (unsigned int*)&fb;
        int ret = 0;
        fb.width = 1024;
        fb.height = 768;
        fb.vWidth = 1024;
        fb.vHeight = 768;
        fb.pitch = 0;
        fb.depth = 16;
        fb.x = 0;
        fb.y = 0;
        fb.pointer = 0x00100000;
        fb.size = 0;

        fb_addr += 0x40000000;
                ret = mailbox_write(&fb, 1);
        //ret = mailbox_read(1);

        return 0;
}
                
int mailbox_write(unsigned int fb_addr, unsigned int channel)
{
        volatile unsigned int* mail_status = MAILBOX_STATUS;
        volatile unsigned int* mail_write =  MAILBOX_WRITE;
        if( (fb_addr & 0xf) != 0)
        {
                return -1;
        }

        while(*mail_status & MAILBOX_FULL)
        {
                //flush the cache
        }
        
        *mail_write = (fb_addr | channel);
        return 0;
}

int mailbox_read(unsigned int channel)
{
        unsigned int data;
        unsigned int cnt = 0;
        unsigned int* mail_read = MAILBOX_READ;
        unsigned int* mail_status = MAILBOX_STATUS;
        if(channel > 15)
        {
                return -1;
        }

        while( *mail_status & MAILBOX_EMPTY)
        {
                //flushcache
                if(cnt++ > (1<<25) )
                {
                        return 0xffffffff;
                }
        }

        data = *mail_read;

        if( (data & 15) == channel)
        {
                return data;
        }
        else
        {
                return -2;
        }
}
</pre>

Á» ¹Î¸ÁÇÑ ÄÚµå±ä ÇÏÁö¸¸... ¾î·µç ½ÃÀÛÇغÁ¿ä!

ÀÏ´Ü Àá±ñ mainÀ» º¸½Ã¸é, initFB¸¦ È£ÃâÇÏ´Â°É º¼ ¼ö Àִµ¥¿ä, main¿¡ ¾Õ¾î¼­ initFBºÎÅÍ »ìÇÇ°í °¡µµ·Ï ÇÒ°Ô¿ä

initFB´Â, ÇÁ·¹ÀÓ ¹öÆÛ¸¦ ÃʱâÈ­ ÇÏ´Â ÇÔ¼öÀä,

ÇÁ·¹ÀÓ ¹öÆÛ¶õ ¹«¾ùÀ̳ĸé, È­¸é¿¡ Ãâ·ÂÇϱâÀ§ÇÑ µ¥ÀÌÅÍ Çü½Ä(?)À» ÇÁ·¹ÀÓ ¹öÆÛ¶ó°í ÇØ¿ä

´Ü¼øÈ÷, »ö»ó°ª¸¸ µé¾î°¡´Â°Ô ¾Æ´Ï°í, È­¸é ÇØ»óµµ, RGBºñÆ®¼ö, µ¥ÀÌÅÍ µîµîÀÌ µé¾î°¡¿ä

óÀ½ º¸½Ã¸é, width = 1024;

ÀÌ Äڵ尡 º¸À̽ÇÅÙµ¥, ÀÌ°Ç, ÇÁ·¹ÀÓ ¹öÆÛÀÇ °¡·Î ÇØ»óµµÀÇ °ªÀ» ³Ö¾îÁִ°ſ¡¿ä

ÀÌ ºÎºÐÀº 1280À¸·Î ³Ö´Â´Ù°í Çϸé, 1280Çػ󵵸¦ ¾²°ÔµÇ´Â°ÅÁÒ

±×¸®°í ±× ¹Ø¿¡ height¶ÇÇÑ °°±¸¿ä

±×¸®°í, vWidth¿Í vHeight´Â °¡»ó(?)Çػ󵵶ó°í Çϴµ¥, Á¤È®È÷ ¸ð¸£°Ú³×¿ä~ ¼ýÀÚ¸¦ °íÃ常é

´Þ¶óÁö´Â°É È®ÀÎÇÒ ¼ö´Â ÀÖ¾ú´Âµ¥, ¾î¶² ±ÔÄ¢ÀÎÁö´Â Àß...

pitch´Â 0À¸·Î ÇؾßÇѴٳ׿ä.. gpu¿¡¼­ ¾Ë¾Æ¼­ ó¸®ÇÑ´Ù°í ÇØ¿ä

depth´Â RGBÇÒ¶§¿¡, ÃÑ ¸îºñÆ®¸¦ »ç¿ëÇÒÁö´Â °áÁ¤Çϴ°ǵ¥¿ä,

ÀϹÝÀûÀÎ ÇÏÀÌÄ÷¯´Â 16bit¸¦ ¾²±¸¿ä.. Æ®·çÄ÷¯°¡ 24ºñÆ®, ±×¸®°í RGBA¶ó´Â Åõ¸íµµ±îÁö ÀÖ´Â°Ô 32ºñÆ®¶ó°í Çϳ׿ä

±× ¿Ü¿¡µµ ¸î°³ ÀÖÁö¸¸, ÀÏ´Ü ÆíÀÇ»ó 16ºñÆ®·Î ÇÒ°Ô¿ä!

x,yµµ gpu¿¡¼­ ¾Ë¾Æ¼­ Çϴϱî 0À¸·Î ¼ÂÆÃÇϱ¸¿ä

¿©±â¼­ Áß¿äÇÑ pointerÀä

pointer´Â ½ÇÁ¦ RGB°ªÀ» ÀǹÌÇÏ´Â°Ô ¾Æ´Ï¶ó, RGB°ªÀÌ µé¾îÀÖ´Â ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ÀǹÌÇØ¿ä

¿©±â¼­ 0x00100000À¸·Î ¼³Á¤Ç߱⶧¹®¿¡, RGB°ªÀº 0x00100000¿¡ µé¾îÀÖ¾î¾ßÇØ¿ä

±×¸®°í, sizeµµ gpu°¡ ¾Ë¾Æ¼­ ÇØÁִϱî 0À¸·Î ÇϽñ¸¿ä

±× ´ÙÀ½¿¡, mailbox_write(&fb, 1); ·Î½á mailbox¶ó´Â ³à¼®¿¡ ÇÁ·¹ÀÓ¹öÆÛ¸¦ ÀԷ½ÃÅ°´Â ÀÛ¾÷À» ÇØ¿ä!

mailbox_write¸¦ º¸¸é¿ä,

¸Å°³º¯¼ö·Î ÇÁ·¹ÀÓ¹öÆÛ ±¸Á¶Ã¼ÀÇ ÁÖ¼Ò¿Í, channelÀ» ¹Þ°íÀÖ´Â°É º¼ ¼ö Àִµ¥¿ä,

ä³ÎÀº arm°ú gpu»çÀÌ¿¡ ¾î¶² µ¥ÀÌÅ͸¦ ÁÖ°í ¹ÞÀ»Áö¸¦ °áÁ¤ÇÏ´Â º¯¼ö¿¡¿ä

1¹øÀº, framebuffer¸¦ ÁÖ°í¹Þ°Ú´Ù´Â°Å¿¡¿ä

Äڵ带 º¸¸é, mail_status, mail_write º¯¼ö¸¦ º¼ ¼ö ÀÖÀ»ÅÙµ¥¿ä,

status¶ó´Â ·¹Áö½ºÅÍ¿Í write·¹Áö½ºÅÍÁÖ¼Ò¸¦ ÇÒ´ç¹Þ°í ÀÖ´Â ºÎºÐÀÌ¿¡¿ä

ÇÁ·¹ÀÓ ¹öÆÛÀÇ ÁÖ¼Ò ÇÏÀ§ 4ºñÆ®´Â ¹Ýµå½Ã 0ÀÌ µÇ¾î¾ß¸¸ÇØ¿ä!!!

±×°É °Ë»çÇÏ´Â°Ô Ã¹¹ø° if¹®ÀÌ¿¡¿ä

while(*mail_status & MAILBOX_FULL)

ÀÌ ºÎºÐÀº, mail_status¶ó´Â ·¹Áö½ºÅÍÀÇ µ¥ÀÌÅÍ°¡ 0x80000000À̶ó¸é,

¸ÞÀϹڽº ·¹Áö½ºÅÍ°¡ °¡µæÂ÷ Àֱ⶧¹®¿¡ µ¥ÀÌÅ͸¦ ¾µ ¼ö ¾ø´Â »óŶó´Â ¸»ÀÌ¿¡¿ä

±×·¸±â¶§¹®¿¡, gpu°¡ ¸ÞÀϹڽº¸¦ ºñ¿ï¶§±îÁö busy-wait·Î ±â´Ù·Á¾ßÇϴ°ſ¡¿ä
(ÀÌ ºÎºÐ¿¡¼­´Â Á¦°¡ Á¤È®È÷ ¾Ë°íÀÖ´Â ºÎºÐÀº ¾Æ´Ñµ¥¿ä, 2°¡Áö ÃßÃøÀ» ÇÏ°íÀÖ¾î¿ä
1. gpu°¡ ÀÚµ¿À¸·Î ¸ÞÀϹڽº¸¦ ºñ¿öÁØ´Ù.
2. cache flush¸¦ ÅëÇؼ­ ¸ÞÀϹڽº¸¦ ºñ¿ö¾ß ÇÑ´Ù.)

±×¸®°í, *mail_write¿¡ µ¥ÀÌÅÍ¿Í Ã¤³ÎÀ» or¿¬»êÀ¸·Î ³Ö¾îÁִ°ÍÀ¸·Î ¸¶¹«¸® µÇ¿ä


ÀÌ·¸°Ô ¸ÞÀϹڽº¿¡ µ¥ÀÌÅÍ Áý¾î³Ö´Â°Í±îÁö Çؼ­ initFBÇÔ¼ö°¡ ¸¶¹«¸® µÇ¾ú³×¿ä

ÀÌÁ¦ main¹®À¸·Î µé¾î°¡º¼±î¿ä

initFB¹Ù·Î ¹Ø¿¡¼­ºÎÅÍ ½ÃÀÛÇϸé¿ä

Áßø for¹®À¸·Î 1024, 768 µ¹¸é¼­ µ¥ÀÌÅÍ 0xffff¸¦ ³Ö´Â°ÍÀ» È®ÀÎÇÒ ¼ö Àִµ¥¿ä,

ÀÌ ºÎºÐÀº Çػ󵵸¸Å­ ÁÖ¼Ò¸¦ À̵¿½ÃÄѼ­, ÇØ´ç Çȼ¿¿¡ µ¥ÀÌÅ͸¦ ³Ö´Â°Å¿¡¿ä

16ºñÆ® RGB¸¦ »ç¿ëÇ߱⶧¹®¿¡ shortÀÚ·áÇüÀ» ½è°í, µ¥ÀÌÅ͸¦ ³Ö°í, ÁÖ¼Ò Áõ°¡½ÃÅ°°í.. ¹Ýº¹ÇÏ°íÀÖ¾î¿ä

±×¸®°í, draw_lineÀ¸·Î ¼±À» ±×¸®°í Àִµ¥¿ä, ÀÌ°Ç Á¶±ÝÀÖ´Ù°¡!

** Áß¿äÇÑÁ¡Àº ptÀÇ ÁÖ¼Ò¸¦ ´«¿©°ÜºÁ¾ßÇØ¿ä

ptÀÇ ÁÖ¼Ò´Â °ð Çȼ¿ÀÇ ÁÖ¼Ò¸¦ ÀǹÌÇÏ°í, ptÀÇ °ªÀº °ð Çȼ¿ÀÇ °ªÀ» ÀǹÌÇØ¿ä!!


6¹øÀº ´ÙÀ½ ±Û¿¡¼­ ºÁ¿ä~

1
ÃßõÇϱ⠴ٸ¥ÀÇ°ß 0
ºÏ¸¶Å©¹öÆ° °øÀ¯¹öÆ°

´Ù¸¥ÀÇ°ß 0 Ãßõ 0 20³â°£ÀÏÇߴµ¥µü¹Ý³â¸¸½¬¸é¾ÈµÇ°ÚÁö
2013-09-09 Á¡¾ÆÀÌÄÜ
  1. ´ñ±ÛÁÖ¼Òº¹»ç

´Ù¸¥ÀÇ°ß 0 Ãßõ 0 [* ºñȸ¿ø *]
2013-09-09 Á¡¾ÆÀÌÄÜ
  1. ´ñ±ÛÁÖ¼Òº¹»ç
  • ¾Ë¸² ¿å¼³, »óó ÁÙ ¼ö ÀÖ´Â ¾ÇÇÃÀº »ï°¡ÁÖ¼¼¿ä.
©¹æ »çÁø  
¡â ÀÌÀü±Û¡ä ´ÙÀ½±Û -¸ñ·Ïº¸±â