主题 : 使用友善之臂Mini2440(X35 LCD)烧写系统,直接执行韦东山三期视频程序 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 103084
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2014-04-17
最后登录: 2014-04-18
楼主  发表于: 2014-04-17 15:01

 使用友善之臂Mini2440(X35 LCD)烧写系统,直接执行韦东山三期视频程序

首先说明一下我的情况,我很早以前就看过韦东山老师的书。
也看过老师的一期视频。
但是当时我是嵌入式小白。完全看不懂。
当时一方面害怕老师的JZ2440开发板就是为老师的视频特制的。
一方面也是因为看不懂老师的视频,因此上也害怕买了以后看不懂老师的视频,花冤枉钱。

因此上在网上做了很久的选择。
最后决定购买了申嵌的开发板。友善之臂Mini2440。
感觉这个网上的资料多一些。另外也是看中了附送的10张光盘的教程。

等我学完了申嵌视频,我先是学了一点国嵌。当时国嵌的二期还没有出来。
所谓的一期的视频就是课堂录像。学习效果也不太好。

顺便说一句,国嵌二期,我下载了。但是所谓的国嵌二期,第一部分的C语言教程和第三部分的Android下的JAVA开发根本就用不到开发板的。第二部分总共才5个G,大部分都是一些裸机视频。我就不评论了。

于是开始学习老师的二期。后来因为换工作,就没有学习了。
级别: 新手上路
UID: 103084
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2014-04-17
最后登录: 2014-04-18
1楼  发表于: 2014-04-17 15:02
今年又开始学3期。发现板子被我烧写成不知道什么样子了。
因此上,决定重头烧写一次。也就是说,按照这个步骤,可以不用学老师的二期,就可以直接学3期了。
如果你用的是申嵌的友善之臂Mini2440开发板,下面的整个步骤完全是傻瓜式操作。

在这之前,请保证按照申嵌第一张光盘搭建好了环境。
下面的命令都是在申嵌的友善之臂Mini2440开发板附送的fedora中执行的。

开始编译u-boot。

这个打了韦东山补丁的u-boot1.1.6是通用的。

在百问网JZ2440v2主光盘的\system\中取得压缩包和补丁。

1. u-boot
tar xjf u-boot-1.1.6.tar.bz2
cd u-boot-1.1.6/
patch -p1 < ../u-boot-1.1.6_jz2440.patch
make

使用3.4.5的编译器
tar xjf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2
设置PATH,我的命令是:
export PATH=/usr/lib/qt-3.3/bin:/usr/lib/ccache:\
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:\
/usr/local/arm/gcc-3.4.5-glibc-2.3.6/bin:/root/bin

参考手册的《8.3 配置和编译U-Boot》
要烧写 U-Boot, 需要把开发板拨动开关 S2 设置为 Nor Flash启动, 连接好串口和USB
线,打开超级终端,打开电源.

选择功能号 “a” , 打开 DNW, 确认 USB连接正常 OK, 点 UsbPort->Transmit/Restore,
选择刚才所编译的 u-boot.bin,下载和烧写很快就会结束。

然后之前的编译u-boot请不要关掉,再开一个新的窗口。编译内核。

2. LINUX
tar xjf linux-2.6.22.6.tar.bz2
cd linux-2.6.22.6
patch -p1 < ../linux-2.6.22.6_jz2440.patch

对于MINI2440, 从http://dl.vmall.com/c06bbt0sxp上下载"MINI2440源码.rar":
把MINI2440源码\drivers_and_test\17th_dm9000c\修改好的\dm9dev9000c.c 复制进内核drivers/net

下面是关键:
友善之臂Mini2440用的X35 LCD这个屏十分的坑爹。
LCD原理图跟别人的好多不一样,时序图也有很大的差别,LCD上vline 和vframe根本没有,只能通过pci和mck两个时钟进行设置;
还一个就是:不知道是uboot的原因还是友善官网提供的原理图有错 ,vden必须反转才能正常!!

因为老师的《第0课第8节_在TQ2440,MINI2440上搭建视频所用系统.WMV》
给出的MINI2440的lcd裸机里,用的LCD并不是x35,所以不适合X35 LCD这个屏。
这个是我通过百问网的邮件列表和韦东山老师确认过的。

所以根据网上的这个网页:
http://blog.csdn.net/comwise/article/details/11727445
需要使用这个网页上面提供的lcd.c文件。

复制进内核drivers/video, 并修改drivers/video/Makefile:
obj-$(CONFIG_FB_S3C2410)          += lcd.o  # s3c2410fb.o

在编译内核的时候提示Makefile:1449: *** mixed implicit and normal rules.  Stop.
在网上查找后得到如下原因:
是由于我的系统的make工具太新(系统:fedora16),make的旧版规则已经无法兼容新版。
按照以下方式,问题得到解决:
修改前:416行 config %config: scripts_basic outputmakefile FORCE
修改后:416 行 %config: scripts_basic outputmakefile FORCE
修改前:1449 行 / %/: prepare scripts FORCE
修改后:1449 行 %/: prepare scripts FORCE
问题得以解决 !

要烧写 Kernel, 在u-boot界面:
        ##### 100ask Bootloader for OpenJTAG #####
        [n] Download u-boot to Nand Flash
        [k] Download Linux kernel uImage
        [j] Download root_jffs2 image
        [y] Download root_yaffs image
        [d] Download to SDRAM & Run
        [z] Download zImage into RAM
        [g] Boot linux from RAM
        [f] Format the Nand Flash
        [s] Set the boot parameters
         Boot the system
        [r] Reboot u-boot
        [q] Quit from menu
        Enter your selection:
选择功能号 “k” , 打开 DNW, 确认 USB连接正常 OK, 点 UsbPort->Transmit/Restore,
选择刚才所编译的 uIamge,下载和烧写很快就会结束。

在UBOOT界面输入y, 用DNW发送JZ2440主光盘bin目录下的fs_qtopia.yaffs2

烧写完了以后,进入QT:

然后在开发板的串口界面输入:
        mount -t nfs -o nolock 192.168.1.231:/home/student/share /mnt
        cd /mnt
mount虚拟机上的目录。

之后在之前的编译u-boot的那个窗口使用arm-linux-gcc-3.4.5编译老师3期的视频。
级别: 新手上路
UID: 103084
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2014-04-17
最后登录: 2014-04-18
2楼  发表于: 2014-04-17 15:03
附录:
网上的这个网页:
http://blog.csdn.net/comwise/article/details/11727445
提供的lcd.c文件。

#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/errno.h>  
#include <linux/string.h>  
#include <linux/mm.h>  
#include <linux/slab.h>  
#include <linux/delay.h>  
#include <linux/fb.h>  
#include <linux/init.h>  
#include <linux/dma-mapping.h>  
#include <linux/interrupt.h>  
#include <linux/workqueue.h>  
#include <linux/wait.h>  
#include <linux/platform_device.h>  
#include <linux/clk.h>  
  
#include <asm/io.h>  
#include <asm/uaccess.h>  
#include <asm/div64.h>  
#include <linux/types.h>  
#include <asm/mach/map.h>  
#include <mach/regs-lcd.h>  
#include <mach/regs-gpio.h>  
#include <mach/fb.h>  
  
struct lcd_regs{  
    unsigned long   lcdcon1;  
    unsigned long   lcdcon2;  
    unsigned long   lcdcon3;  
    unsigned long   lcdcon4;  
    unsigned long   lcdcon5;  
    unsigned long   lcdsaddr1;  
    unsigned long   lcdsaddr2;  
    unsigned long   lcdsaddr3;  
    unsigned long   redlut;  
    unsigned long   greenlut;  
    unsigned long   bluelut;   
    unsigned long   reserved[9];  
    unsigned long   dithmode;  
    unsigned long   tpal;  
    unsigned long   lcdintpnd;  
    unsigned long   lcdsrcpnd;  
    unsigned long   lcdintmsk;  
    unsigned long   lpcsel;  
};  
static volatile struct lcd_regs *lcd_regs_base;  
  
static struct fb_info *fb_x35;  
  
static volatile unsigned long *gpbcon;  
static volatile unsigned long *gpbdat;  
static volatile unsigned long *gpccon;  
static volatile unsigned long *gpdcon;  
static volatile unsigned long *gpgcon;  
  
static u32 pseudo_palette[16];  
  
static inline unsigned int chan_to_field(unsigned int chan,  
    struct fb_bitfield* bf)  
{  
    chan &= 0xffff;  
    chan >>= 16 - bf->length;  
      
    return chan << bf->offset;  
}  
  
  
//设置颜色  
static int x35_setcolreg(unsigned int regno, unsigned int red,   
        unsigned int green, unsigned int blue,  
        unsigned int transp, struct fb_info *info)  
{  
    unsigned int val;  
      
    if (regno > 16)  
        return 1;  
  
    val  = chan_to_field(red,   &info->var.red);  
    val |= chan_to_field(green, &info->var.green);  
    val |= chan_to_field(blue,  &info->var.blue);  
      
    pseudo_palette[regno] = val;  
      
    return 0;  
  
}  
  
  
static struct fb_ops mini_fb_ops = {  
    .owner          = THIS_MODULE,  
    .fb_setcolreg   = x35_setcolreg,  
    .fb_fillrect    = cfb_fillrect,  
    .fb_copyarea    = cfb_copyarea,  
    .fb_imageblit   = cfb_imageblit,  
};  
  
  
  
static int lcd_init(void)  
{  
    //1)分配一个fb_info  
    fb_x35 = framebuffer_alloc(0, NULL);  
  
    //2)填充fb_info结构  
    // 1 设置固定参数  
    // 2 设置可变参数  
    // 3 设置操作函数  
    // 4 其他的设置  
    strcpy(fb_x35->fix.id, "mylcd");   
    fb_x35->fix.smem_len         = 240 * 320 * 32 / 8;  // frambuffer的大小  
  
    fb_x35->fix.type             = FB_TYPE_PACKED_PIXELS;//扫描方式,以像素点扫描 非隔行扫描   
    fb_x35->fix.visual           = FB_VISUAL_TRUECOLOR; //色阶 真彩色  
    fb_x35->fix.line_length  = 240 * 4;  
  
    fb_x35->var.xres             = 240;  
    fb_x35->var.yres             = 320;  
    fb_x35->var.xres_virtual     = 240;  
    fb_x35->var.yres_virtual     = 320;  
    fb_x35->var.bits_per_pixel   = 32;  //每个像素点占有的字节数  
  
  
    //颜色放置的方式,这里是真彩色为 8:8:8,每种颜色占用8位  
    fb_x35->var.red.offset       = 16;  
    fb_x35->var.red.length       = 8;  
    fb_x35->var.blue.offset  = 8;  
    fb_x35->var.blue.length  = 8;  
    fb_x35->var.green.offset     = 0;  
    fb_x35->var.green.length     = 8;  
      
    fb_x35->var.activate         = FB_ACTIVATE_NOW; //设置颜色立即生效  
  
    //设置操作函数  
    fb_x35->fbops                = &mini_fb_ops;  
  
    fb_x35->pseudo_palette       = pseudo_palette; //调色板  
    fb_x35->screen_size      = 240 * 320 * 32 / 8;  //屏幕尺寸的大小  
  
  
    //3)设置硬件,驱动lcd  
    // 1 设置lcd引脚可用  
    // 2 设置lcd控制器寄存器  
    // 3 设置其他的  
    gpbcon = ioremap(0x56000010, 8);      
    gpbdat = gpbcon+1;  
    gpccon      =   ioremap(0x5600020, 4);  
    gpdcon      =   ioremap(0x5600030, 4);    
    gpgcon      =   ioremap(0x5600060, 4);  
  
    *gpccon     =   0xaaaaaaaa;  
    *gpdcon     =   0xaaaaaaaa;  
    *gpgcon     |=  (0x3 << (4 * 2));  //lcd_pwren lcd电源引脚  
      
    lcd_regs_base   = ioremap(0x4d000000, sizeof(struct lcd_regs));  
      
    lcd_regs_base->lcdcon1 = (9 << 8) | (3 << 5) | (0xd << 1);  
    lcd_regs_base->lcdcon2 = (8 << 24) | (319 << 14) | (4 << 6) | (9 << 0);  
    lcd_regs_base->lcdcon3 = (15 << 19) | (239 << 8) | (16 << 0) ;  
    lcd_regs_base->lcdcon4 = 5;  
    lcd_regs_base->lcdcon5 = (0 << 12) | (0 << 10) | (1<<6) | (0 << 1) | (0 << 0) ;  
            //vsync swap set error  
  
    //分配显存,将显存地址告诉framebuffer  
    fb_x35->screen_base      = dma_alloc_writecombine(NULL, fb_x35->fix.smem_len,   
                        &(fb_x35->fix.smem_start), GFP_KERNEL);//fb_x35->fix.smem_start = xxx;  /* 显存的物理地址 */  
    lcd_regs_base->lcdsaddr1     = (fb_x35->fix.smem_start >> 1) & (~(3 << 30)); //[31~0]=0b00xx xxxx ... 30误写成20  
    lcd_regs_base->lcdsaddr2     = ((fb_x35->fix.smem_start + fb_x35->fix.smem_len) >> 1) & 0x1fffff;  
    lcd_regs_base->lcdsaddr3     = (0 << 11) | ((240 * 32 / 16) << 0); //行的长度有错  
  
  
    //启动lcd  
    lcd_regs_base->lcdcon1       |= (1 << 0);  
    lcd_regs_base->lcdcon5       |= (1 << 3);  
    /* MINI2440的背光电路也是通过LCD_PWREN来控制的, 不需要单独的背光引脚 */  
      
    //4)注册framebuffer  
    register_framebuffer(fb_x35);  
      
    return 0;  
}  
  
static void lcd_exit(void)  
{  
    //注销framebuffer结构  
    //释放分配的frambuffer显存  
    //关闭lcd控制器以及电源  
    //取消映射地址  
    //释放framebuffer结构  
    unregister_framebuffer(fb_x35);  
    lcd_regs_base->lcdcon1       &= ~(1 << 0);  
    lcd_regs_base->lcdcon5       &= ~(1 << 3);  
      
    dma_free_writecombine(NULL, fb_x35->fix.smem_len, fb_x35->screen_base, fb_x35->fix.smem_start);  
  
    iounmap(lcd_regs_base);  
    iounmap(gpccon);  
    iounmap(gpdcon);  
    iounmap(gpgcon);  
  
    framebuffer_release(fb_x35);  
}  
  
  
module_init(lcd_init);  
module_exit(lcd_exit);  
  
MODULE_LICENSE("GPL");  
MODULE_AUTHOR("LCL"); 


注意:里面的图像调整其实还不是最关键的,关键是vden不翻转 就没有图像,我调试过好多次,幸亏论坛网友热心帮助,才点亮lcd。
级别: 新手上路
UID: 106281
精华: 0
发帖: 4
金钱: 25 两
威望: 5 点
贡献值: 0 点
综合积分: 8 分
注册时间: 2014-07-19
最后登录: 2014-07-29
3楼  发表于: 2014-07-23 21:14
记住了。。
级别: 新手上路
UID: 77442
精华: 0
发帖: 24
金钱: 120 两
威望: 24 点
贡献值: 0 点
综合积分: 48 分
注册时间: 2012-09-07
最后登录: 2015-02-06
4楼  发表于: 2014-12-23 11:00
LCD屏Sony X35型号的时序图怎么看???怎么找出VBPD,VFPD,VSPW,脉冲宽度等参数呢??求解~~~
级别: 新手上路
UID: 118215
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
贡献值: 0 点
综合积分: 32 分
注册时间: 2015-08-14
最后登录: 2015-12-17
5楼  发表于: 2015-08-22 22:31
楼主你可以把你光盘的内容都发给我吗????
级别: 新手上路
UID: 127742
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
贡献值: 0 点
综合积分: 10 分
注册时间: 2016-09-02
最后登录: 2017-02-20
6楼  发表于: 2016-09-13 00:06
谢谢啊,谢谢