OK6410裸机之LCD调色板

发布者:xrmilk最新更新时间:2018-10-11 来源: eefocus关键字:OK6410  裸机  LCD调色板 手机看文章 扫描二维码
随时随地手机看文章

lcd.c源码:

#define GPECON  (*((volatile unsigned long *)0x7F008080))

#define GPEDAT  (*((volatile unsigned long *)0x7F008084))

#define GPFCON  (*((volatile unsigned long *)0x7F0080A0))

#define GPFDAT  (*((volatile unsigned long *)0x7F0080A4))

#define GPICON  (*((volatile unsigned long *)0x7F008100))

#define GPJCON  (*((volatile unsigned long *)0x7F008120))

// display controller 

#define MIFPCON     (*((volatile unsigned long *)0x7410800C))

#define SPCON         (*((volatile unsigned long *)0x7F0081A0))

#define VIDCON0      (*((volatile unsigned long *)0x77100000))

#define VIDCON1      (*((volatile unsigned long *)0x77100004))

#define VIDTCON0     (*((volatile unsigned long *)0x77100010))

#define VIDTCON1     (*((volatile unsigned long *)0x77100014))

#define VIDTCON2     (*((volatile unsigned long *)0x77100018))

#define WINCON0      (*((volatile unsigned long *)0x77100020))

#define VIDOSD0A      (*((volatile unsigned long *)0x77100040))

#define VIDOSD0B      (*((volatile unsigned long *)0x77100044))

#define VIDOSD0C      (*((volatile unsigned long *)0x77100048))

#define VIDW00ADD0B0      (*((volatile unsigned long *)0x771000A0))

#define VIDW00ADD1B0      (*((volatile unsigned long *)0x771000D0))

#define VIDW00ADD2          (*((volatile unsigned long *)0x77100100))

#define WPALCON                (*((volatile unsigned long *)0x771001A0))

#define WIN0_PALENTRY0      0x77100400

#define  VSPW         9

#define  VBPD          1

#define  LINEVAL     271

#define  VFPD          1

#define  HSPW         40    

#define  HBPD          1

#define  HOZVAL      479

#define  HFPD          1

#define LeftTopX     0

#define LeftTopY     0

#define RightBotX   479

#define RightBotY   271

#define FRAME_BUFFER   0x54000000

unsigned int fb_base_addr;

unsigned int bpp;

unsigned int xsize;

unsigned int ysize;

void palette_init(void)

{

    int i;

    volatile unsigned long *p = (volatile unsigned long *)WIN0_PALENTRY0; //调色板地址

    

    WPALCON |= (1<<9);   // 允许CPU修改调色板 

    WPALCON &= ~(0x7);   

    WPALCON |= 1;            // 调色板的数据格式: 24-bit ( 8:8:8 ) 

    p[0] = 0x000000;          //只初始化了调色板的前五格的颜色值

    p[1] = 0x00ff00;

    p[2] = 0xff0000;

    p[3] = 0x0000ff;

    p[4] = 0xffffff;

    for (i = 0; i <256; i++)  //用调色板以后显存的bpp=8,8最大能表示256个地址,也就是调色板最大有256项

    {

        //p[i] = ;

    }

    

    WPALCON &= ~(1<<9);   // 禁止CPU访问调色板 

}

void clean_screem(void)

{

    int x;

    int y;

    int cnt = 0;

    

    volatile unsigned char *p = (volatile unsigned char *)fb_base_addr;

    for (x = 0; x <=HOZVAL; x++)

        for (y = 0; y <= LINEVAL; y++)

            p[cnt++] = 0;

}

void lcd_init(void)

{

    // 1. 设置相关GPIO引脚用于LCD 

    GPICON = 0xaaaaaaaa;    // gpi0~gpi15用作lcd_vd[0~15] 

    GPJCON = 0xaaaaaaa;     // gpj0~gpi11用作lcd 

    //GPFCON &= ~(0x3<<28);

    //GPFCON |=  (1<<28);    // GPF14用作背光使能信号 

    GPECON &= ~(0xf);

    GPECON |= (0x1);             // GPE0用作LCD的on/off信号 

    // 2. 初始化6410的display controller 

    // 2.1 hsync,vsync,vclk,vden的极性和时间参数

    // 2.2 行数、列数(分辨率),象素颜色的格式

    // 2.3 分配显存(frame buffer),写入display controller

    MIFPCON &= ~(1<<3);   // Normal mode 

    SPCON    &= ~(0x3);

    SPCON    |= 0x1;              // RGB I/F style 

#if 0

    VIDCON0 &= ~((3<<26) | (3<<17) | (0xff<<6));     // RGB I/F, RGB Parallel format,  

    // vclk== 27MHz Ext Clock input / (CLKVAL+1) = 27/3 = 9MHz 

    VIDCON0 |= ((2<<6) | (1<<4) | (0x3<<2));      

#else

    VIDCON0 &= ~((3<<26) | (3<<17) | (0xff<<6)  | (3<<2));     // RGB I/F, RGB Parallel format,  

    VIDCON0 |= ((14<<6) | (1<<4) );      // vclk== HCLK / (CLKVAL+1) = 133/15 = 9MHz 

#endif

    VIDCON1 &= ~(1<<7);               // 在vclk的下降沿获取数据 

    VIDCON1 |= ((1<<6) | (1<<5));  // HSYNC高电平有效, VSYNC高电平有效, 

    VIDTCON0 = (VBPD << 16) | (VFPD << 8) | (VSPW << 0);

    VIDTCON1 = (HBPD << 16) | (HFPD << 8) | (HSPW << 0);

    VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);

    WINCON0 &= ~(0xf << 2);

    WINCON0 |= (0x3<<2) | (1<<17);    // 8 BPP (palletized), byte swap 

    VIDOSD0A = (LeftTopX<<11) | (LeftTopY << 0);

    VIDOSD0B = (RightBotX<<11) | (RightBotY << 0);

    VIDOSD0C = (LINEVAL + 1) * (HOZVAL + 1) / 4;

    VIDW00ADD0B0 = FRAME_BUFFER;

    VIDW00ADD1B0 =  (((HOZVAL + 1)*1 + 0) * (LINEVAL + 1)) & (0xffffff);

    // VBASEL = VBASEU + (LINEWIDTH+OFFSIZE) x (LINEVAL+1) 

    //        = 0 + (480*1 + 0) * 272

    //        = 

    //VIDW00ADD2 =  HOZVAL + 1;

    

    // 设置调色板 

    palette_init();    

    pwm_set(2);

                                    

    fb_base_addr = FRAME_BUFFER;

    xsize = HOZVAL + 1;

    ysize = LINEVAL + 1;

    bpp   = 8;

    clean_screem();

}

void backlight_enable(void)

{

    //GPFDAT |= (1<<14);

}

void backlight_disable(void)

{

    //GPFDAT &= ~(1<<14);

}

void lcd_on(void)

{

    GPEDAT |= (1<<0);

    // 等待10 frame 

}

void lcd_off(void)

{

    GPEDAT &= ~(1<<0);

}

void displaycon_on(void)

{

    VIDCON0 |= 0x3;

    WINCON0 |= 1;   //6410的lcd控制器有多个窗口,这里只使能了一个窗口

}

void displaycon_off(void)

{

    VIDCON0 &= ~0x3;

    WINCON0 &= ~1;   //6410的lcd控制器有多个窗口,这里只使能了一个窗口

}

void lcd_enable(void)

{

    // 使能LCD本身 

    lcd_on();

    

    // 打开背光 

    //backlight_enable();

    pwm_start();

    

    // 使能display controller 

    displaycon_on();

}

void lcd_disable(void)

{

    // 关闭背光 

    // 关闭LCD本身 

    // 关闭display controller 

}

void draw_line(void)

{

    //不用调色板的时候画线传入的是24位颜色值,用调色板以后传入的是在调色板中的颜色索引值

    DrawLine(0,0, 0,271, 0);

    DrawLine(0,0, 479,0, 1);

    DrawLine(0,0, 479,271, 2);

    DrawLine(0,271, 479,0, 3);

    DrawLine(0,271, 479,271, 1);

    DrawLine(479,271, 479,0, 2);

    DrawLine(0,136, 479,136, 3);

    DrawLine(240,0, 240,271, 1);

}

void display_red(void)

{

    volatile unsigned char *p = (volatile unsigned char *)FRAME_BUFFER;

    int x, y;

    int cnt = 0;

    unsigned char colors[] = {0, 1, 2, 3};

    static int color_idx = 0;

    

    for (y = 0; y <= LINEVAL; y++)

    {

        for (x = 0; x <= HOZVAL; x++)

        {

            p[cnt++] =colors[color_idx] ;  // red 

        }

    }

    color_idx++;

    if (color_idx == 5)

        color_idx = 0;

}

void lcd_test(void)

{

    unsigned char c;

    static int lcdon = 0;

    static int blon = 0;

    static int dispon = 0;

    lcd_init();

    

    while (1)

    {

        printf("********LCD TEST MENU********\n\r");

        printf("[L] enable/disable LCD\n\r");

        printf("[B] enable/disable back light\n\r");

        printf("[C] enable/disable s3c6410 display controller\n\r");

        printf("[D] display color\n\r");

        printf("[I]  draw line\n\r");

        printf("[Q] quit\n\r");

        do {

            c = getc();

            if (c == '\n' || c == '\r')

            {

                printf("\n\r");

            }

            else

            {

                putc(c);

            }

        } while (c == '\n' || c == '\r');

        switch (c) {

            case 'l':

            case 'L':

            {

                if (lcdon)

                {

                    lcd_off();

                    printf("LCD off\n\r");

                }

                else

                {

                    lcd_on();

                    printf("LCD on\n\r");

                }

                lcdon = !lcdon;

                break;

            }

            case 'b':

            case 'B':

            {

                pwm_menu();

                break;

            }

            case 'c':

            case 'C':

            {

                if (dispon)

                {

                    displaycon_off();

                    printf("Display controller off\n\r");

                }

                else

                {

                    displaycon_on();

                    printf("Display controller on\n\r");

                }

                blon = !blon;

                break;

            }

            case 'd':

            case 'D':

            {

                display_red();

                break;

            }

            case 'i':

            case 'I':

            {

                draw_line();

                break;

            }

            case 'q':

            case 'Q':

            {

                return ;

                break;

            }

        }

    }

}

=====================================================================

framebuffer.c源码:

// FILE: framebuffer.c

// 实现在framebuffer上画点、画线、画同心圆、清屏的函数

#include "types.h"

#include "framebuffer.h"

extern unsigned int fb_base_addr;

extern unsigned int bpp;

extern unsigned int xsize;

extern unsigned int ysize;

//typedef UINT32 FB_24BPP[272][480];

// 画点

// 输入参数:

//     x、y : 象素坐标

//     color: 颜色值

//         对于16BPP: color的格式为0xAARRGGBB (AA = 透明度),

//     需要转换为5:6:5格式

//         对于8BPP: color为调色板中的索引值,

//     其颜色取决于调色板中的数值

void PutPixel(UINT32 x, UINT32 y, UINT32 color)

{

    UINT8 red,green,blue;

    switch (bpp){

        case 24:

        {

            //bpp=24位,但是为了对齐会浪费一个字节,一共4字节32位

            UINT32 *addr = (UINT32 *)fb_base_addr + (y * xsize + x);

            *addr =  color;

            break;

        }

        case 16:

        {

            UINT16 *addr = (UINT16 *)fb_base_addr + (y * xsize + x);

            red   = (color >> 19) & 0x1f;

            green = (color >> 10) & 0x3f;

            blue  = (color >>  3) & 0x1f;

            color = (red << 11) | (green << 5) | blue; // 格式5:6:5

            *addr = (UINT16) color;

            break;

        }

        

        case 8:

        {

            UINT8 *addr = (UINT8 *)fb_base_addr + (y * xsize + x);

            *addr = (UINT8) color;  // 调色板的索引值 

            break;

        }

        default:

            break;

    }

}

// 画线

// 输入参数:

//     x1、y1 : 起点坐标

//     x2、y2 : 终点坐标

//     color  : 颜色值

//         对于16BPP: color的格式为0xAARRGGBB (AA = 透明度),

//     需要转换为5:6:5格式

//         对于8BPP: color为调色板中的索引值,

//     其颜色取决于调色板中的数值

void DrawLine(int x1,int y1,int x2,int y2,int color)

{

    int dx,dy,e;

    dx=x2-x1; 

    dy=y2-y1;

    

    if(dx>=0)

    {

        if(dy >= 0) // dy>=0

        {

            if(dx>=dy) // 1/8 octant

            {

                e=dy-dx/2;

                while(x1<=x2)

                {

                    PutPixel(x1,y1,color);

                    if(e>0){y1+=1;e-=dx;}   

                    x1+=1;

                    e+=dy;

                }

            }

            else        // 2/8 octant

            {

                e=dx-dy/2;

                while(y1<=y2)

                {

                    PutPixel(x1,y1,color);

                    if(e>0){x1+=1;e-=dy;}   

                    y1+=1;

                    e+=dx;

                }

            }

        }

        else           // dy<0

        {

            dy=-dy;   // dy=abs(dy)

            if(dx>=dy) // 8/8 octant

            {

                e=dy-dx/2;

                while(x1<=x2)

                {

                    PutPixel(x1,y1,color);

                    if(e>0){y1-=1;e-=dx;}   

                    x1+=1;

                    e+=dy;

                }

            }

            else        // 7/8 octant

            {

                e=dx-dy/2;

                while(y1>=y2)

                {

                    PutPixel(x1,y1,color);

                    if(e>0){x1+=1;e-=dy;}   

                    y1-=1;

                    e+=dx;

                }

            }

        }   

    }

    else //dx<0

    {

        dx=-dx;     //dx=abs(dx)

        if(dy >= 0) // dy>=0

        {

            if(dx>=dy) // 4/8 octant

            {

                e=dy-dx/2;

                while(x1>=x2)

                {

                    PutPixel(x1,y1,color);

                    if(e>0){y1+=1;e-=dx;}   

                    x1-=1;

                    e+=dy;

                }

            }

            else        // 3/8 octant

            {

                e=dx-dy/2;

                while(y1<=y2)

                {

                    PutPixel(x1,y1,color);

                    if(e>0){x1-=1;e-=dy;}   

                    y1+=1;

                    e+=dx;

                }

            }

        }

        else           // dy<0

        {

            dy=-dy;   // dy=abs(dy)

            if(dx>=dy) // 5/8 octant

            {

                e=dy-dx/2;

                while(x1>=x2)

                {

                    PutPixel(x1,y1,color);

                    if(e>0){y1-=1;e-=dx;}   

                    x1-=1;

                    e+=dy;

                }

            }

            else        // 6/8 octant

            {

                e=dx-dy/2;

                while(y1>=y2)

                {

                    PutPixel(x1,y1,color);

                    if(e>0){x1-=1;e-=dy;}   

                    y1-=1;

                    e+=dx;

                }

            }

        }   

    }

}

// 绘制同心圆

void Mire(void)

{

    UINT32 x,y;

    UINT32 color;

    UINT8 red,green,blue,alpha;

    for (y = 0; y < ysize; y++)

        for (x = 0; x < xsize; x++){

            color = ((x-xsize/2)*(x-xsize/2) + (y-ysize/2)*(y-ysize/2))/64;

            red   = (color/8) % 256;

            green = (color/4) % 256;

            blue  = (color/2) % 256;

            alpha = (color*2) % 256;

            color |= ((UINT32)alpha << 24);

            color |= ((UINT32)red   << 16);

            color |= ((UINT32)green << 8 );

            color |= ((UINT32)blue       );

            PutPixel(x,y,color);

        }

}

 

// 将屏幕清成单色

// 输入参数:

//     color: 颜色值

//         对于16BPP: color的格式为0xAARRGGBB (AA = 透明度),

//     需要转换为5:6:5格式

//         对于8BPP: color为调色板中的索引值,

//     其颜色取决于调色板中的数值

void ClearScr(UINT32 color)

{   

    UINT32 x,y;

    

    for (y = 0; y < ysize; y++)

        for (x = 0; x < xsize; x++)

            PutPixel(x, y, color);

}

#define FONTDATAMAX 2048

extern const unsigned char fontdata_8x8[FONTDATAMAX];

void lcd_putc(unsigned char c)

{

    static int x = 0;

    static int y = 0;

    int i,j;

    unsigned char line_dots;

    // 获得字模 

    unsigned char *char_dots = fontdata_8x8 + c * 8;    

    // 在framebuffer里描点 

    if (c == '\n')

    {

        //y = (y + 8) % 272;

        y += 8;

        if (y > 272)

            y = 0;

        return ;

    }

    else if (c == '\r')

    {

        x = 0;

        return;

    }

    for (i = 0; i < 8; i++)    

    {

        line_dots = char_dots[i];

        

        for (j = 0; j < 8; j++)

        {

            if (line_dots & (0x80 >> j))

            {

                PutPixel(x+j,  y+i, 1);  // 调色板里面第1个条目的颜色值 

            }

            else

            {

                PutPixel(x+j,  y+i, 0);  // 调色板里面第0个条目的颜色值 

            }

        }

    }

    //x = (x + 8) % 480;

    x += 8;

    if (x > 480)

        x = 0;

    

    if (x == 0)

    {

        //y = (y + 8) % 272;

        y += 8;

        if (y > 272)

            y = 0;

    }

}


关键字:OK6410  裸机  LCD调色板 引用地址:OK6410裸机之LCD调色板

上一篇:自己写bootloader之OK6410
下一篇:OK6410裸机之LCD显

推荐阅读最新更新时间:2024-03-16 16:15

Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动
前言 我们是要编译出在 ARM 开发板上运行的可执行文件,所以要使用交叉编译器 arm-linux-gnueabihf-gcc 来编译。 交叉编译链的安装参考另外一篇博文:交叉编译链的安装 编译代码 本试验就一个 leds.s 源文件,所以编译比较简单。 源文件代码(leds.s): .global _start @全局标号 _start: /*使能所有外设时钟 */ LDR R0 , =0x020c4068 @CCGR0 LDR R1 , =0xffffffff @要想CCGR0写入的数据 STR R1 , @将R1的值写入到R0中 LDR R0 , =0x020c406
[单片机]
Linux之ARM(IMX6U)<font color='red'>裸机</font>汇编LED驱动实验--编译驱动
s3c2440裸机-LCD编程(四、实现显示功能)
1.让LCD显示满屏红色 我们想要在LCD上显示出数据,所需步骤如下: a. 初始化LCD b. 使能LCD c. 获取LCD参数: fb_base, xres, yres, bpp d. 往framebuffer中写数据 1.初始化LCD工作我们在前面一节框架准备和LCD初始化已经详细介绍了。 2.使能LCD void lcd_enable() { lcd_controller_enalbe(); //会间接调用s3c2440_lcd_controller_enalbe } 3.获取LCD参数 void get_lcd_params(unsigned int *fb_base, int *xres, int
[单片机]
S3C2440开发板裸机程序系列01--流水灯
平台介绍:TQ2440开发板,NorFlash 2M,NandFlash 521M(K9F4G08U0B), 2个32MSDRAM(H57V2562GTR-60C) 本系列目的:记录TQ2440裸机编程过程,顺便兼顾mini2440。 本篇内容:1.介绍GPIO要点;2.TQ2440流水灯编程;3.ADS1.2建立工程;4.下载执行;5.介绍启动程序 1. S32440的GPIO 查阅TQ2440的底板和核心板原理图,如下: 可知,LED1--GPB5, LED2--GPB6, LED3--GPB7, LED4--GPB8 查S3C2440手册,可知GPB有3个控制寄存器 其中,GPBCON配置
[单片机]
S3C2440开发板<font color='red'>裸机</font>程序系列01--流水灯
S3C2440裸机------GPIO
1.S3C2440GPIO简单介绍 GPIO即General-purpose input/output ,这些管脚除了可以用作输入输出外,还可以配置成一些其他的功能,例如I2C,UART等,其实就是管脚复用的思想。 所有的这些管脚主要通过下面的寄存器进行控制, 2.JZ2440原理图 从上面的原理图截图中我们可以看到: 1.我们的nLED_1,nLED_2,nLED_4是连接到3.3V电源上的,所以我们的管脚需要输出低电平,LED灯才会亮。 2.我们的nLED_1,nLED_2,nLED_4是连接到s3c2440的GPF4,GPF5,GPF6上面的。 另外,在原理图中还有如下知识点。 3.控
[单片机]
S3C2440<font color='red'>裸机</font>------GPIO
s3c2440裸机-I2c编程-3.i2c中断服务程序
Start信号之后,发出设备地址,在第9个时钟就会产生一个中断,我们根据i2c的流程图来编写中断程序。 每传输完一个数据将产生一个中断,I2C操作的主体在中断服务程序,它可以分为两部分:写操作,读操作。 完整code如下: static p_i2c_msg p_cur_msg; int isLastData(void) { if (p_cur_msg- cnt_transferred == p_cur_msg- len - 1) return 1; /* 正要开始传输最后一个数据 */ else return 0; } void resume_iic_with_
[单片机]
s3c2440 ARM9 裸机驱动第一篇-GPIO驱动(C)
此文为对于LED驱动的补充: 废话不说,先上代码。 start.s .text .global _start _start: ldr r0 ,= 0x53000000 @WATCHDOG ADD mov r1 ,#0x0 str r1 , @r1 的数据写入r0 关看门狗 ldr sp ,=1024*4 @设置栈 bl main @跳转到main执行 halt: b halt led.c #define GPFCON (*(volatile unsigned long *)0x56000050) #define
[单片机]
S3C2440之裸机之汇编点亮LED灯
虚拟机环境:Oracle VM VirtualBox Linux系统:ubuntu_14.04.6 交叉编译工具: (https://eyun.baidu.com/s/3b1UtLc) 100ask分享的所有文件 002_JZ2440资料光盘_20180516(免费) 资料光盘 A盘 tools.zip arm-linux-gcc-4.3.2.tar.bz2 gcc-3.4.5-glibc-2.3.6/bin 第一步:查看原理图 输出低电平点亮LED灯 输出高电平熄灭LED灯 第二步:查看芯片手册 相应引脚配置为输出 输出低电平 第三步:编写程序 led_on.S: .text .global _
[单片机]
S3C2440之<font color='red'>裸机</font>之汇编点亮LED灯
ARM裸机开发222440中断原理
1CPU与外设之间的数据传送控制方式(I/O控制方式) 通常有以下三种方式 1.查询方式 2.中断方式 3.DMA方式(在独立开辟的一个空间不由CPU控制,有DMA自己进行管理。实现存储器与外设的高速的数据传输方式) 主要讲中断: 中断请求---- 中断仲裁---- 中断响应---- 中断处理---- 中断返回(要保存现场) 中断处理流程: 1.中断控制器捕获当前外设发出的中断信号,通知SOC(中央处理芯片:片上系统) 2.SOC保存当前程序的运行环境,调用中断服务程序(ISR:一小段代码)进行处理中断 3.在ISR中通过读取中断控制寄存器、外设的相关寄存器来识别那一个中断触发,获取硬件中断号IRQ,跳转到
[单片机]
ARM<font color='red'>裸机</font>开发222440中断原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved