ok6410的LCD裸机范例

/******************************************
        实验步骤
1.配置引脚功能,将其GPI、GPJ引脚设置为VD数据输出模式,及GPJ后几位设置成LCD时钟输出;
2.设置LCD时序值,初始化时序值。
    (1)需要初始化时序:VSPW、VBPD、LINEVAL、VFPD、HSPW、HBPB、HOZVAL、HFPD、
    CLKVAL(在LCD芯片手册中找到初始化时序图,然后找到对应的时序参数)
    (2)找到初始化这些时序信号相应的寄存器(在芯片手册中找到相应的寄存器,并对其初始化)
    (3)结合LCD芯片手册和时序图将对应参数的是设置出来
3.帧缓存初始化(帧缓冲指的是在内存中开辟出来的用来存储图像数据空间,并告知给LCD的CMA。)
    (1)设置窗口大小对应的寄存器
    (2)告诉ADM寄存器内存起始地址和大小
4.杂项初始化()
5.画点
6.画线
7.绘制QQ图
8.单色显示
**********************************************************/
#define GPICON (*(volatile unsigned long *)0x7F008100)
#define GPJCON (*(volatile unsigned long *)0x7F008120)
#define MOFPCON (*(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 VSPW 9
#define VBPD 1
#define LINEVAL 271
#define VFPD 1
//#define CLKVAL 4   //10 = 100/((CLKVAL+1)*2)
#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

extern unsigned char bmp[135300];/* 导出的时候切记不要包含图像头数据!!!!!! */

void lcd_port_init()
{
    GPICON = 0xaaaaaaaa;
    GPJCON = 0xaaaaaaaa;
}
void lcd_contral_init()
{
    MOFPCON = 0<<3;   /* 这一位必须设置为0 */
    SPCON = 0x01;    /* RGB模式下必须设置为1 */

    VIDCON0 = (14<<6)|(1<<4)|(3<<0); /* 禁止视频输出和控制信号 选择视频时钟源 确定VCLK和CLKVAL[7:0]的值[VCLK=视频时钟源/(CLKVAL+1)] */
    VIDCON1 = (1<<5)|(1<<6);

    VIDTCON0 = (VBPD<<16)|(VFPD<<8)|(VSPW<<0); /* 时钟初始化 */
    VIDTCON1 = (HBPD<<16)|(HFPD<<8)|(HSPW<<0);
    VIDTCON2 = (LINEVAL<<11)|(HOZVAL<<0);

    WINCON0 = (1<<16)|(0xb<<2)|(1<<0);   /* 禁止视频输出和视频控制信号 选择BPP图像窗口模式(24bpp) 打开半字交换控制位 */

    VIDOSD0A = (LeftTopX<<11)|(LeftTopY<<0);  /* 设置视频窗口0的位置 */
    VIDOSD0B = (RightBotX<<11)|(RightBotY<<0);
    VIDOSD0C = (LINEVAL+1)|(HOZVAL+1);  /* 设置视频窗口0的尺寸 */

    VIDW00ADD0B0 = FRAME_BUFFER;         /* 设置缓存区开始地址 */
    VIDW00ADD1B0 = ((FRAME_BUFFER+(HOZVAL+1)*4*(LINEVAL+1)))&(0xffffff); /* 设置缓存区结束地址 ????*/
}

void lcd_init()
{
    lcd_port_init();
    lcd_contral_init();

    //打开LCD电源
}

void point(int row, int col, int color)
{
    int red, green, blue;
    unsigned long *point = (unsigned long*)FRAME_BUFFER;
    red = (color>>16) & 0xff;
    green = (color>>8) & 0xff;
    blue = (color>>0) & 0xff;
    *(point + row*480 + col) = (green<<24) | (blue<<16) | red; /* 具体不知原因 试出来的 */

}

void paint_bmp(const unsigned char bmp[])
{
    int i,j;
    unsigned char *p = (unsigned char *)bmp;
    int blue, green,red;
    int color;

    for(i=0;i<205;i++)  /* 必须和导出的尺寸一致!!! */
    {
        for(j=0;j<220;j++)
        {
            red = *p++;    /* 必须和导出的颜色顺序一模一样!!!!!! */
            blue = *p++;
            green = *p++;

            color = (red<<16)|(green<<8)|(blue<<0); 

            point(i,j,color);
        }
    }
}

void lcd_test()
{
    int y;
    for(y=1;y<470;y++)
        point(110,y,0xFF0000);

    paint_bmp(bmp);
}
时间: 2024-11-07 11:15:26

ok6410的LCD裸机范例的相关文章

ok6410的DMA裸机总结

1.为何使用DMA:为了提高CPU的工作效率,避免多余的等待时间 2.关于DMA控制器:(1)通道数:2440有4个通道,6410有4个DMA控制器(初始化的时候要选择),32个通道.210有两种DMA一种是内存与内存之间,另外则是普通的内存与外设之间.(2)请求源:(3)基本时序 nXDREQ请求生效并经过2CLK周期同步后,nXDACK响应并开始生效,但至少还要经过3CLK的周期延迟,DMA控制器才可获得总线的控制权,并开始数据传输(4)工作模式:•Demond模式:如果DMA完成一次请求后

ok6410[000] 搭建裸机开发环境

1.安装交叉工具链arm-linux-gcc-4.3.2 先把这个工具复制到rhat系统中[rhel-server-6.3-i386-dvd.iso] 解压arm-linux-gcc-4.3.2到一个目录中,然后,配置环境变量 2.编译示例程序 编译 arm-linux-gcc -g -c led.S 链接 arm-linux-ld -Tled.lds -o led.elf led.o 格式转换 arm-linux-objcopy -O binary led.elf led.bin 这样就做出了

Linux3.6.7在OK6410下的移植

这是在本学期期末整项目时习得的,不知道以后会不会有用. 一个天天整js+css+html的,突然弄Linux C,学到的确实不少. 遗憾的是,虽然努力了,导师还是觉得我进度慢把这部分砍掉了,唉. 前言 对于我这个新手而言,第一次学习linux,面对庞大的代码,复杂的程序结构和自身对linux知识的严重缺乏,一下子还真不知道该做什么.想想开发板厂家提供的演示程序,其过程是这样:先运行bootloader,bootloade引导linux内核启动,启动后再运行UI程序.对应的程序也有三个分别为u-b

【华为云技术分享】小熊派华为物联网操作系统LiteOS裸机驱动移植02-LCD驱动移植及使用

1. LCD裸机驱动 小熊派开发板使用的LCD屏幕为1.3寸的TFT彩屏,色彩深度16bit,分辨率240*240,使用 SPI 接口与 MCU 之间通信. 如果你对裸机玩转LCD屏幕还不熟悉,请先阅读这篇文章: 2. 移植LCD裸机驱动到LiteOS 如果你对移植裸机驱动到LiteOS的方法还不了解,请先阅读这篇文章: 复制裸机驱动文件到LiteOS工程 LCD的底层是使用SPI驱动的,那么除了 STM32CubeMX 生成的spi.h和spi.c文件,还需要自己在此基础上手写LCD屏幕的驱动

【转】朱兆祺带你一步一步学习嵌入式(连载)

原文网址:http://bbs.elecfans.com/jishu_357014_2_1.html#comment_top  从最初涉及嵌入式Linux开始到现在,深深的知道嵌入式的每一步学习都是举步维艰.从去年11月份开始,我就着手整理各种学习资料,希望推动嵌入式学习的前进贡献自己微不足道的一份力量.从去年到现在,将C语言的学习经验整理成<攻破C语言笔试与机试陷阱及难点>(现在仍在更新),这份资料已经在电子发烧友论坛的单片机论坛连载(http://bbs.elecfans.com/jish

16.Linux-LCD驱动(详解)

在上一节LCD层次分析中,得出写个LCD驱动入口函数,需要以下4步: 1) 分配一个fb_info结构体: framebuffer_alloc(); 2) 设置fb_info 3) 设置硬件相关的操作 4) 使能LCD,并注册fb_info: register_framebuffer() 本节需要用到的函数: void *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp);

移植ok6410 LCD驱动

1.本次移植过程选择 ldd6410 lcd驱动为参考移植到 ok6410 开发板上,由于 ok6410 2.28内核已有相关驱动,故将其删除后再将新驱动移植. 2.移植过程 主要以给内核增加驱动的思想,在/driver/video/ 下增加 samsung目录,提取 ldd6410 中驱动相关源代码,将源代码复制到samsung 下. 修改 /driver/video 下的Makefile 文件,增加进入samsung目录编译的编译条目 修改 /driver/video 下的Kconfig 文

ok6410[002] ubuntu1604系统下搭配ckermit和dnw基于RAM的裸机程序调试环境

ubuntu1604系统下搭配ckermit和dnw基于RAM的裸机程序调试环境 系统:  ubuntu16.04 裸板: 飞凌公司OK6410开发板 目标:搭建基于ubuntu1604系统和基于RAM的裸机程序开发环境 1.安装配置ckermit 在ubuntu1604下一般做裸板开发时都是使用ckermit作为远程通讯终端,下面我们就开始讲解下其安装与配置. 1.1.安装ckermit 在ubuntu系统下安装ckermit,使用 sudo  apt-get  install  ckermi

嵌入式Linux裸机开发(十五)——LCD

嵌入式Linux裸机开发(十五)--LCD 一.LCD简介 LCD(Liquid Crystal Display)是液晶显示器简称.LCD的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的. 1.LCD类型 按照背光源的不同,LCD可以分为CCFL和LED两种. A.CCFL 指用CCFL(冷阴极荧光灯管)作为背光光源的液晶显示器(L