您的位置:首页 > 其它

skyeye下成功运行lcd程序

2010-03-02 19:37 351 查看
呵呵,往往在经过很复杂的过程之后,回头却发现原来确实如此的简单,为了直观的看到skyeye的仿真效果(呵呵,主要

还是经济原因啊,开发板买不起啊),于是就心血来潮的想要作s3c2410的lcd实验,说起来容易,首先是一直linux内核,

现在的linux内核中已经支持了s3c2410的板子,所以只要作少量的修改即可,然后编写lcd_show.c,最后编译该程序,加

在到linux中,skyeye仿真,但是实际的过程确实相当的困难啊



最初的尝试就是按照上面的思路来的,在网上找了许多的资料
http://www.linuxfans.org/bbs/thread-182101-1-1.html linux内核在skyeye上移植 http://www.linuxfans.org/bbs/thread-182082-1-1.html skyeye上lcd移植 http://www.diybl.com/course/6_system/linux/Linuxjs/200896/139481.html linux上lcd去的驱动


第一次配置内核

make menuconfig

make

最终得到的vmlinux竟然5M还多,于是打算放弃,重新编译linux内核,在第二次编译内核时,删减了大量的无用的driver,

make时,出现一大堆错误,无奈,又经过了几次的尝试还是没有成功,于是放弃了自己现在编译内核的做法,打算使用

skyeye-testuites中的编译好的内核,最终终于找到了一个包含了lcd驱动的linux内核,下载之,编写lcd_show.c



#include <unistd.h>

#include <stdio.h>

#include <fcntl.h>

#include <linux/fb.h>

#include <sys/mman.h>

#define RED_COLOR332 0xE0

#define GREEN_COLOR332 0x1C

#define BLUE_COLOR332 0x03

#define RED_COLOR565 0x0F100

#define GREEN_COLOR565 0x007E0

#define BLUE_COLOR565 0x0001F

int main(int argc, char **argv)

{

int fbfd = 0;

struct fb_var_screeninfo vinfo;

struct fb_fix_screeninfo finfo;

long int screensize = 0;

short *fbp565 = 0;

char *fbp332 = 0;

int x = 0, y = 0;

long int location = 0;

// open the file for reading and writing

fbfd = open("/dev/fb0", O_RDWR);

if (!fbfd) {

printf("Error: cannot open framebuffer device./n");

exit(1);

}

printf("The framebuffer device was opened successfully./n");

// get fixed screen information

if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) {

printf("Error reading fixed information./n");

exit(2);

}

// get variable screen information

if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {

printf("Error reading variable information./n");

exit(3);

}

// figure out the size of the screen in bytes

screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;

printf("%dx%d, %dbpp, screensize = %d/n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel, screensize );

// map the device to memory

fbp332 = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,

fbfd, 0);

fbp565 = (short*)fbp332;

if ((int)fbp332 == -1) {

printf("Error: failed to map framebuffer device to memory./n");

exit(4);

}

printf("The framebuffer device was mapped to memory successfully./n");

x = 100; y = 100; // Where we are going to put the pixel

if(vinfo.bits_per_pixel == 16) // 8bpp only

{

// 8bpp framebuffer test

printf("16 bpp framebuffer test/n");

printf("a byte in fbp is a pixel of LCD, just set the value of fbp to put color to LCD/n");

printf("byte format:/n");

printf(" bit:| 7 6 5 | 4 3 2 | 1 0 |/n");

printf(" | red | green | blue |/n");

// red Screen

printf("Red Screen/n");

for(y = 0; y < vinfo.yres/3; y++)

{

for(x = 0; x < vinfo.xres ; x++)

{

*(fbp565 + y * vinfo.xres + x) = 0;

}

}

// green Screen

printf("Green Screen/n");

for(y = vinfo.yres/3; y < (vinfo.yres*2)/3; y++)

{

for(x = 0; x < vinfo.xres/2 - 59; x++)

{

*(fbp565 + y * vinfo.xres + x) =GREEN_COLOR565/2;

}

}

// blue Screen

printf("Blue Screen/n");

for(y = (vinfo.yres*2)/3; y < vinfo.yres; y++)

{

for(x = 0; x < vinfo.xres; x++)

{

*(fbp565 + y * vinfo.xres + x) = BLUE_COLOR565;

}

}

}

else if(vinfo.bits_per_pixel == 8)

{

// 8bpp framebuffer test

printf("8bpp framebuffer test/n");

printf("a byte in fbp is a pixel of LCD, just set the value of fbp to put color to LCD/n");

printf("byte format:/n");

printf(" bit:| 7 6 5 | 4 3 2 | 1 0 |/n");

printf(" | red | green | blue |/n");

// red Screen

printf("Red Screen/n");

for(y = 0; y < vinfo.yres/3; y++)

{

for(x = 0; x < vinfo.xres/2-100; x++)

{

*(fbp332 + y * vinfo.xres + x) = RED_COLOR332;

}

}

// green Screen

printf("Green Screen/n");

for(y = vinfo.yres/3; y < (vinfo.yres*2)/3; y++)

{

for(x = 0; x < vinfo.xres/2-50; x++)

{

*(fbp332 + y * vinfo.xres + x) = GREEN_COLOR332;

}

}

// blue Screen

printf("Blue Screen/n");

for(y = (vinfo.yres*2)/3; y < vinfo.yres; y++)

{

for(x = 0; x < vinfo.xres-10; x++)

{

*(fbp332 + y * vinfo.xres + x) = BLUE_COLOR332;

}

}

}

else

printf("8/16 bits only!/n");

munmap(fbp332, screensize);

close(fbfd);

return 0;

}



arm-linux-gcc -static -o lcd_show lcd_show.c

sudo mount -o loop initrd.img XXX (XXX -- your mount directory)

sudo cp lcd_show XXX/bin/

sudo umount XXX



skyeye -e vmlinux

xuqiang@ubuntu:~/Embedded/s3c2410x-2.6.14$ skyeye -e vmlinux

big_endian is false.

arch: arm

cpu info: armv4, arm920t, 41009200, ff00fff0, 2

mach info: name s3c2410x, mach_init addr 0x805f030

ethmod num=1, mac addr=0:4:3:2:1:f, hostip=10.0.0.1

failed to setup_module (name:net, type:cs8900a)

tapif_init: icotl TUNSETIFF errorlcd_mod:1

uart_mod:0, desc_in:, desc_out:, converter:

SKYEYE: use arm920t mmu ops

Loaded RAM ./initrd.img

start addr is set to 0xc0008000 by exec file.

Linux version 2.6.14 (root@lee) (gcc version 3.4.6) #48 Sat Feb 10 06:29:17 CST 2007

CPU: ARM920Tid(wb) [41009200] revision 0 (ARMvundefined/unknown)

Machine: SMDK2410

Warning: bad configuration page, trying to continue

Memory policy: ECC disabled, Data cache writeback

CPU S3C2410 (id 0x32410000)

S3C2410: core 62.400 MHz, memory 62.400 MHz, peripheral 62.400 MHz

S3C2410 Clocks, (c) 2004 Simtec Electronics

CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on

CPU0: D VIVT write-back cache

CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

Built 1 zonelists

Kernel command line: mem=32M console=ttySAC0 root=/dev/ram initrd=0xc0800000,0x00800000 ramdisk_size=2048 rw

PID hash table entries: 256 (order: 8, 4096 bytes)

timer tcon=00000000, tcnt cb1f, tcfg 00000200,00000000, usec 0000189e

Console: colour dummy device 80x30

Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)

Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)

Memory: 32MB = 32MB total

Memory: 22168KB available (1510K code, 373K data, 100K init)

Mount-cache hash table entries: 512

CPU: Testing write buffer coherency: ok

checking if image is initramfs...it isn't (bad gzip magic numbers); looks like an initrd

softlockup thread 0 started up.

Freeing initrd memory: 8192K

NET: Registered protocol family 16

S3C2410: Initialising architecture

S3C2410 DMA Driver, (c) 2003-2004 Simtec Electronics

DMA channel 0 at c2800000, irq 33

DMA channel 1 at c2800040, irq 34

DMA channel 2 at c2800080, irq 35

DMA channel 3 at c28000c0, irq 36

NetWinder Floating Point Emulator V0.97 (double precision)

ERROR: s3c2410x_io_write_word(0x4d000060) = 0x00000000

ERROR: s3c2410x_io_write_word(0x4d000050) = 0x00000000

[GTK_LCD]: Can't find LCD DMA from address 0x0

ERROR: s3c2410x_io_write_word(0x4d000060) = 0x00000000

ERROR: s3c2410x_io_write_word(0x4d000050) = 0x00000000

Console: switching to colour frame buffer device 40x29

fb0: s3c2410fb frame buffer device

S3C2410 RTC, (c) 2004 Simtec Electronics

Software Watchdog Timer: 0.07 initialized. soft_noboot=0 soft_margin=60 sec (nowayout= 0)

ttySAC0 at MMIO 0x50000000 (irq = 70) is a S3C2410

ttySAC1 at MMIO 0x50004000 (irq = 73) is a S3C2410

ttySAC2 at MMIO 0x50008000 (irq = 76) is a S3C2410

io scheduler noop registered

io scheduler deadline registered

RAMDISK driver initialized: 16 RAM disks of 2048K size 1024 blocksize

cs89x0:cs89x0_probe(0x0)

ERROR: s3c2410x_io_write_word(0x1900030a) = 0x00000000

cs89x0: no cs8900 or cs8920 detected. Be sure to disable PnP with SETUP

mice: PS/2 mouse device common for all mice

NET: Registered protocol family 2

IP route cache hash table entries: 512 (order: -1, 2048 bytes)

TCP established hash table entries: 2048 (order: 1, 8192 bytes)

TCP bind hash table entries: 2048 (order: 1, 8192 bytes)

TCP: Hash tables configured (established 2048 bind 2048)

TCP reno registered

TCP bic registered

NET: Registered protocol family 1

RAMDISK: ext2 filesystem found at block 0

RAMDISK: Loading 2048KiB [1 disk] into ram disk... done.

VFS: Mounted root (ext2 filesystem).

Freeing init memory: 100K

init started: BusyBox v1.4.1 (2007-02-10 01:19:06 CST) multi-call binary

Starting pid 19, console /dev/console: '/etc/init.d/rcS'

ifconfig: SIOCSIFADDR: No such device

Welcome to

_ _____ __ __ _ _

/ / / __ / / /_/ / | | |_|

/ _ / | | | | / // // / | | _ ____ _ _ _ _

/ /_/ / | |__| | / / /_/ / /| | | | _ /| | | |/ // /

/ /___/ / | |__/ / | | | || |___ | | |_| | |_| |/ /

/_/ /_/| | /_/|_| |_||_____||_|_| |_|/____|/_//_/



ARMLinux for Skyeye

For further information please check:
http://www.skyeye.org/
BusyBox v1.4.1 (2007-02-10 01:19:06 CST) Built-in shell (ash)

Enter 'help' for a list of built-in commands.

/bin/ash: can't access tty; job control turned off

/ $ cd bin

/bin $ ./lcd_show

The framebuffer device was opened successfully.

240x320, 16bpp, screensize = 153600

The framebuffer device was mapped to memory successfully.

16 bpp framebuffer test

a byte in fbp is a pixel of LCD, just set the value of fbp to put color to LCD

byte format:

bit:| 7 6 5 | 4 3 2 | 1 0 |

| red | green | blue |

Red Screen

Green Screen

Blue Screen



上面的整个工程可以在下面下载:
http://hi.csdn.net/link.php?url=http://xuqianghit.download.csdn.net


还有就是注意在编译lcd_show.c时,如果没有使用-static的话,即便在mount之后,拷贝到/bin下,skyeye模拟是存在

该文件,但是无法运行的,一般出现的错误是XXX : not found



最后就是需要说明的是最后使用ctrl + c来结束仿真。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐