how this scaling down for css code is worked?
- by harris
this is a code for scaling down for css.
i was wondering, how this worked. please someone explain to me part by part.
thank you very much.
/* ======================================================================== /
/            Copyright (C) 2000 - 2009 ND-Tech. Co., Ltd.                  /
/                          All Rights Reserved.                            /
/ ======================================================================== /
/ Project  : ScaleDown                         Created  : 31-AUG-2009      /
/ File     : main.c                            Contact  : [email protected] /
/ ======================================================================== /
/ You are free to use or modify this code to the following restrictions:   /
/          Acknowledge ND Tech. Co. Ltd.                                   /
/          Or, put "Parts of code by ND Tech. Co., Ltd."                   /
/          Or, leave this header as it is.                                 /
/ in somewhere in your code.                                               /
/ ======================================================================== */
include               "vm3224k.h"
define                                CE0CTL                  *(volatile int *)(0x01800008)
define                                CE2CTL                  *(volatile int *)(0x01800010)
define                                SDCTL                    *(volatile int *)(0x01800018)
define     LED         *(volatile short *)(0x90080000)
// Definitions for async access(change as you wish)
define                                WSU                                      (2<<28) // Write Setup : 0-15
define                                WST                                       (8<<22)  // Write Strobe: 0-63
define                                WHD                                      (2<<20) // Write Hold  : 0-3
define                                RSU                                        (2<<16) // Read Setup  : 0-15
define                                TA                                           (3<<14) // Turn Around : 0-3
define                                RST                                         (8<<8)   // Read Strobe : 0-63
define                                RHD                                       (2<<0)   // Read Hold   : 0-3
define                                MTYPE                  (2<<4)
/* EDMA Registers */
define                                PaRAM_OPT      0              // Options
define                                PaRAM_SRC       1              // Source Address
define                                PaRAM_CNT      2              // Frame count, Element count
define                                PaRAM_DST       3              // Destination Address
define                                PaRAM_IDX       4              // Frame index, Element index
define                                PaRAM_RDL       5              // Element count reload, Link address
define                                EDMA_CIPR       *(volatile int *)0x01A0FFE4         // EDMA Channel interrupt pending low register
define                                EDMA_CIER        *(volatile int *)0x01A0FFE8         // EDMA Channel interrupt enable low register
define                EDMA_CCER      *(volatile int *)0x01A0FFEC         // EDMA Channel chain enable register
define                                EDMA_ER                            *(volatile int *)0x01A0FFF0         // EDMA Event low register
define                                EDMA_EER         *(volatile int *)0x01A0FFF4         // EDMA Event enable low register
define                                EDMA_ECR         *(volatile int *)0x01A0FFF8         // EDMA Event clear low register
define                                EDMA_ESR         *(volatile int *)0x01A0FFFC         // EDMA Event set low register
define                PRI                                         (2<<29) // 1:High priority, 2:Low priority
define                ESIZE                     (1<<27) // 0:32bit, 1:16bit, 2:8bit, 3:reserved
define                DS2                                        (0<<26) // 1:2-Dimensional
define                SUM                                      (0<<24) // 0:no update, 1:increment, 2:decrement, 3:by index
define                DD2                                        (0<<23) // 1:2-Dimensional
define                DUM                                     (0<<21) // 0:no update, 1:increment, 2:decrement, 3:by index
define                TCINT                    (1<<20) // 0:disable, 1:enable
define                TCC                                        (8<<16) // 4 bit code
define                LINK                       (0<<1)   // 0:disable, 1:enable
define                FS                                           (1<<0)   // 0:element, 1:frame
define                OptionField_0 (PRI|ESIZE|DS2|SUM|DD2|DUM|TCINT|TCC|LINK|FS)
define                DD2_1                   (1<<23) // 1:2-Dimensional
define                DUM_1                (1<<21) // 0:no update, 1:increment, 2:decrement, 3:by index
define                TCC_1                   (9<<16) // 4 bit code
define                OptionField_1 (PRI|ESIZE|DS2|SUM|DD2_1|DUM_1|TCINT|TCC_1|LINK|FS)
define                TCC_2                   (10<<16)// 4 bit code
define                OptionField_2 (PRI|ESIZE|DS2|SUM|DD2|DUM|TCINT|TCC_2|LINK|FS)
define                DS2_3                   (1<<26) // 1:2-Dimensional
define                SUM_3                 (1<<24) // 0:no update, 1:increment, 2:decrement, 3:by index
define                TCC_3                   (11<<16)// 4 bit code
define                OptionField_3 (PRI|ESIZE|DS2_3|SUM_3|DD2|DUM|TCINT|TCC_3|LINK|FS)
pragma              DATA_SECTION ( lcd,".sdram" )
pragma              DATA_SECTION ( cam,".sdram" )
pragma              DATA_SECTION ( rgb,".sdram" )
pragma              DATA_SECTION ( u,".sdram" )
extern cregister volatile unsigned int IER;
extern cregister volatile unsigned int CSR;
short           camcode = 0x08000;
short           lcdcode = 0x00000;
short           lcd[2][240][320];
short           cam[2][240][320];
short           rgb[64][32][32];
short           bufsel;
int             *Cevent,*Levent,*CLink,flag=1;
unsigned char   v[240][160],out_y[120][160];
unsigned char   y[240][320],out_u[120][80];
unsigned char   u[240][160],out_v[120][80];
void PLL6713()
{
                int i;
                // CPU Clock Input : 50MHz
            *(volatile int *)(0x01b7c100) = *(volatile int *)(0x01b7c100) & 0xfffffffe;
            for(i=0;i<4;i++);
            *(volatile int *)(0x01b7c100) = *(volatile int *)(0x01b7c100) | 0x08;
            *(volatile int *)(0x01b7c114) = 0x08001;  // 50MHz/2 = 25MHz
            *(volatile int *)(0x01b7c110) = 0x0c;     // 25MHz * 12 = 300MHz
            *(volatile int *)(0x01b7c118) = 0x08000;  // SYSCLK1 = 300MHz/1 = 300MHz
            *(volatile int *)(0x01b7c11c) = 0x08001;  // SYSCLK2 = 300MHz/2 = 150MHz // Peripheral Clock
            *(volatile int *)(0x01b7c120) = 0x08003;  // SYSCLK3 = 300MHz/4 =  75MHz // SDRAM Clock
            for(i=0;i<4;i++);
            *(volatile int *)(0x01b7c100) = *(volatile int *)(0x01b7c100) & 0xfffffff7;
            for(i=0;i<4;i++);
            *(volatile int *)(0x01b7c100) = *(volatile int *)(0x01b7c100) | 0x01;
}
unsigned short  ybr_565(short y,short u,short v)
{
                int                           r,g,b;
            b = y + 1772*(u-128)/1000;
            if (b<0) b=0;
            if (b>255) b=255;
            g = y - (344*(u-128) + 714*(v-128))/1000;
            if (g<0) g=0;
            if (g>255) g=255;
            r = y + 1402*(v-128)/1000;
            if (r<0) r=0;
            if (r>255) r=255;
            return ((r&0x0f8)<<8)|((g&0x0fc)<<3)|((b&0x0f8)>>3);
}
void yuyv2yuv(char *yuyv,char *y,char *u,char *v)
{
                int           i,j,dy,dy1,dy2,s;
            for (j=s=dy=dy1=dy2=0;j<240;j++) {
                            for (i=0;i<320;i+=2) {
                                            u[dy1++] = yuyv[s++];
                                            y[dy++]  = yuyv[s++];
                                            v[dy2++] = yuyv[s++];
                                            y[dy++]  = yuyv[s++];
                            }
            }
}             
interrupt void    c_int06(void)
{
                if(EDMA_CIPR&0x800){
                                EDMA_CIPR = 0xffff; 
                                bufsel=(++bufsel&0x01);
                                Cevent[PaRAM_DST] = (int)cam[(bufsel+1)&0x01];
                                Levent[PaRAM_SRC] = (int)lcd[(bufsel+1)&0x01];
                                EDMA_ESR = 0x80;
                                flag=1;
                }
}
void main()
{
                int           i,j,k,y0,y1,v0,u0;
                bufsel = 0;
                CSR &= (~0x1); 
                PLL6713();                                           // Initialize C6713 PLL
                CE0CTL = 0xffffbf33;// SDRAM Space
                CE2CTL = (WSU|WST|WHD|RSU|RST|RHD|MTYPE);
                SDCTL  = 0x57115000;
                vm3224init();       // Initialize vm3224k2
                vm3224rate(1);                 // Set frame rate
                vm3224bl(15);       // Set backlight
                VM3224CNTL = VM3224CNTL&0xffff | 0x2;                          // vm3224 interrupt enable
            for (k=0;k<64;k++)  // Create RGB565 lookup table
for (i=0;i<32;i++)
for (j=0;j<32;j++) rgb[k][i][j] = ybr_565(k<<2,i<<3,j<<3);
            Cevent                                   = (int *)(0x01a00000 + 24 * 7);
            Cevent[PaRAM_OPT] = OptionField_0;                                                                
            Cevent[PaRAM_SRC] = (int)&camcode;                               
            Cevent[PaRAM_CNT] = 1;
            Cevent[PaRAM_DST] = (int)&VM3224ADDH;
            Cevent                                 = (int *)(0x01a00000 + 24 * 8);
            Cevent[PaRAM_OPT] = OptionField_1;                                                                
            Cevent[PaRAM_SRC] = (int)&VM3224DATA;
            Cevent[PaRAM_CNT] = (239<<16)|320;
            Cevent[PaRAM_DST] = (int)cam[bufsel];             
            Cevent[PaRAM_IDX] = 0;
            Levent                                   = (int *)(0x01a00000 + 24 * 9);
            Levent[PaRAM_OPT] = OptionField_2;                                                                 
            Levent[PaRAM_SRC] = (int)&lcdcode;                                   
            Levent[PaRAM_CNT] = 1;
            Levent[PaRAM_DST] = (int)&VM3224ADDH;
            Levent                                   = (int *)(0x01a00000 + 24 * 10);
            Levent[PaRAM_OPT] = OptionField_3;                                                                 
            Levent[PaRAM_SRC] = (int)lcd[bufsel];                                
            Levent[PaRAM_CNT] = (239<<16)|320;
            Levent[PaRAM_DST] = (int)&VM3224DATA;
            Levent[PaRAM_IDX] = 0;             
            IER = IER | (1<<6)|3;
            CSR = CSR | 0x1;
            EDMA_CCER = (1<<8)|(1<<9)|(1<<10);
            EDMA_CIER = (1<<11);
            EDMA_CIPR = 0xffff;
            EDMA_ESR = 0x80;
            while (1) {
                            if(flag) {
//                                            LED = 0;
                                    yuyv2yuv((char *)cam[bufsel],(char *)y,(char *)u,(char *)v);
                                            for(j=0;j<240;j++)
                                            for(i=0;i<320;i++) lcd[bufsel][j][i]=0;
                                            for(j=0;j<240;j+=2)
                                            for(i=0;i<320;i+=2)
                                                            out_y[j>>1][i>>1]=(y[j][i]+y[j][i+1]+y[j+1][i]+y[j+1][i+1])>>2;
                                            for(j=0;j<240;j+=2)
                                            for(i=0;i<160;i+=2) {
                                                            out_u[j>>1][i>>1]=(u[j][i]+u[j][i+1]+u[j+1][i]+u[j+1][i+1])>>2;
                                                            out_v[j>>1][i>>1]=(v[j][i]+v[j][i+1]+v[j+1][i]+v[j+1][i+1])>>2;
                                            }
                                            for (j=0;j<120;j++)
                                            for (i=0;i<160;i+=2) {
                                                            y0 = out_y[j][i]>>2;
                                                            u0 = out_u[j][i>>1]>>3;                                               
                                                            v0 = out_v[j][i>>1]>>3;                                                
                                                            y1 = out_y[j][i+1]>>2;                                   
                                                            lcd[bufsel][j+60][i+80]=rgb[y0][u0][v0];
                                                            lcd[bufsel][j+60][i+81]=rgb[y1][u0][v0];
                                            }
                                            flag=0;
//                                            LED = 1;
                                }
                }
}