雪铁龙世嘉试驾视频:ARM学习笔记

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 08:06:13

ARM
上次修改日期 2008年9月14日
cfa 提供的更多内容 »
願~~: Bookmark:YAGARTO, OpenOCD、GNU ARM Toolchain、GDB with Eclipse
kunyi.spaces.live.com/blog/cns!30484CDA412A1D29!64...
http://www.yagarto.de/
一個提供OpenOCD(Open On-Chip Debugger)、GNU ARM Toolchain and GDB with Eclipse 的網站
我的 FT2232D 已經收到一星期了 剛剛又找到免錢的漆包線
USB JTAG with OpenOCD support.
http://www.fh-augsburg.de/~hhoegl/proj/usbjtag/usbjtag.html
希望這兩天能手工用漆包線焊一塊版子作個 USB JTAG來玩玩
嵌入开发网--下载中心-Vivi Bootloader简介(3)
www.embed.com.cn/downcenter/Article/Catalog42/2329...
3. vivi的使用
3.1. Interface between an user and the vivi
The vivi uses the serical communication for user interface. Therefore, to connect the vivi, you
1) connect a serial cable between host platform and target platform.
2) already have a serial communication program like the minicom.
3) properly make the vivi binary to support a UART port when you configure the vivi.
If all of above is ok, you can see messages on the screen printed by the vivi. For example, below messages catched from the SMDK-2410
VIVI version 0.1.4 (nandy@nandy.mizi.com) (gcc version 2.95.2 20000516 (release)
[Rebel.com]) #0.1.4 荐 10岿 16 16:19:11 KST 2002
MMU table base address = 0x33DFC000
Succeed memory mapping.
NAND device: Manufacture ID: 0xec, Chip ID: 0x75 (Samsung KM29U256T)
Found saved vivi parameters.
Press Return to start the LINUX now, any other key for vivi
See the last line on the screen. (As I mentioned section 1.1) the vivi has two mode: an autoboot mode and a prompt mode. The vivi wait for a key input. If an user want to enter the prompt mode, press andy key (except Enter key). And then you can see the "vivi>" prompt. Otherwise, the vivi try boot the linux kernel after waiting a few seconds or minutes.
3.2. Built-in user commands
This is not full-described built-in user comamnd. But following commands is enough to use the vivi (as far as I know).
3.2.1. load command
A load command is loading binaries to the flash or the ram.
Usage:
load [ | ]
This argument is where to load. Availabe values are *flash* and *ram*.
[ ] or [ ]
This arguement determines location where to load a binary. If you want to use pre-defined mtd partiton informations, just type a partition name. Otherwise you specify an address and a size.
This arguement determines the file transfer protocol. I shy that the vivi only supprot xmodem curruntly. So, Available value is "x".
For exampe, you load zImage to flash memroy.
vivi > load flash kernel x
or you specify an address and a size.
vivi > load flash 0x80000 0xc0000 x
3.2.2. part command
The vivi has mtd partiton informations for the vivi. This informatin not related to mtd partition informations of mtd device drivers. The vivi uses partition informations when load a binary, boot the linux kernel, erase flash memroy, etc...
Avalilable commands are:
Display mtd partition informations.
part show
Add a new mtd partition.
part add
is name of a new mtd partiton.
is offset in the mtd device.
is a size of a mtd parition.
is flags of a mtd parition. Available valuse are JFFS2, LOCKED, and BONFS.
Delete a mtd partiton.
part del
Reset mtd partitions to default values.
part reset
Save paramter valuse and mtd parition informations to flash permanently.
part save
3.2.3. param command
The vivi has some parameter values. For example, the "boot_delay" paramter determines how long wait keystroke when the vivi is in the autoboot mode. I'm sorry that this feature is in progress. So all listed parameter is not available.
Here, I give several tips for you.
If you change the "linxu command line",
vivi> param set linux_cmd_line "you wish.."
If you want to see paramters,
vivi> param show
If you want to wait a long time when recevie file via xmodem,
vivi> param set xmodem_initial_timeout 3000000
If you want to boot imediately when a hardware reset,
vivi> param set boot_delay 100000
3.2.4. boot command
A boot command is boot the linux kernel which is stored in the flashmemroy or ram.
Usage:
boot [ | ]
This argument is where to store the linux kernel image. Availabe values are ram, nor and smc.
[ ] or [ ]
This arguement determines location where to store the linux kernel. If you want to use pre-defined mtd partiton information, just type a partition name. Otherwise you shuld specify an address and a size.
Note that all argument is optional. If you omit all argument (just type boot), all arguments is parsing from pre-defined mtd parititon information called "kernel" For example,
vivi> boot
the vivi read the linux kernel binary from the "kernel" mtd parititons.
vivi> boot nor 0x80000
the vivi read the linux kernel binary form the nor flash memory. The offset is 0x80000 and the size is default value (0xc0000). Ocassionally, you want to test the kernel on the ram (not store kernel to flash). you can do it on the vivi On the SA-1110 based machine,
vivi> load ram 0xc0008000 x
vivi> boot ram
On the S3C2410 based machine,
vivi> load ram 0x30008000 x
vivi> boot ram
On the PXA-240 based machine,
vivi> load ram 0xA0008000 x
vivi> boot ram
the vivi boot the linux kernel from the ram.
3.2.5. flash command
A flash comamnd manages the flash memory. If you want to erase flash memory
BusyBox v1.4.1 移植 s3c2410 - WeiBing
weibing.blogbus.com/logs/4453804.html
init started:  BusyBox v1.4.1 (2007-02-03 10:47:43 CST) multi-call binary
Starting pid 743, console /dev/console: '/etc/init.d/rcS'
Please press Enter to activate this console.
Starting pid 753, console /dev/console: '/bin/sh'
BusyBox v1.4.1 (2007-02-03 10:47:43 CST) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
-sh: can't access tty; job control turned off
Set search library path int /etc/profile
Set user path in /etc/profile
#
可恶的shell终于出来拉...
搞了两天,原来又犯老毛病--粗心...自从数据结构成绩出来后,心情一直都不好,那么简单的卷子分数竟然这么垃圾,还以为老师故意为难...直到前两天才发现,原来是自己粗心,做错三题,没什么好说的,只能怪自己。月满自亏,水满自溢,人满容易跌倒...人真奇怪,越是提醒,越是容易忘记。以此为训,不要在同一个地方跌倒多次!
哈哈,牢骚发完,该总结以下移植过程了:
1.制作 ramdisk 。本打算直接用NFS挂文件系统的,可惜网卡驱动还没完全ok... 该部分内容可以参考Linux系统移植 (十分感谢前辈的共享) 和  http://www.hhcn.com/cgi-bin/topic.cgi?forum=3&topic=816 。
#dd if=/dev/zero of=/dev/ram1 bs=1k count=8000
# losetup /dev/loop2 ramdisk
# mkfs.ext2 /dev/loop2
#mkdir ram
# mount -t ext2 /dev/loop2 ram
#cd ram
#mkdir bin dev etc lib mnt proc sbin sys tmp root usr
#mkdir mnt/etc
#mkdir usr/bin usr/lib usr/sbin
#mknod -m 660 dev/console c 5 1
#mknod -m 660 dev/null c 1 3
#touch linuxrc  (至此,空ramdisk制作完毕)
当然,lib里面还要拷入一些库文件,为了方便,我将交叉编译的库全放进去。
#cp -rfd /usr/local/arm/3.4.1/arm-linux/lib/* ./  (注意-d,保持库文件的链接关系)
2.下载,当然是最新版的BusyBox 1.4.1 (stable)  。解压,修改Makefile:
ARCH            ?= arm
CROSS_COMPILE   ?= /usr/local/arm/3.4.1/bin/arm-linux-
接着便是make menuconfig 。如果不确定选哪些的话,可以用make depconfig 。值得注意的是 shell 的选择,在 Choose your default shell (none) 这一项回车后选择 ash , 否则,你会想我一样头疼大半天,make 后bin目录下就是没有sh ,而默认shell命令就是sh。错误提示如下:
Please press Enter to activate this console.
Starting pid 739, console /dev/console: '/bin/sh'
sh: applet not found
Process '-/bin/sh' (pid 739) exited.  Scheduling it for restart.
关于Build Options 的 Build BusyBox as a static binary (no shared libs) 静态编译,我用3.4.1版的交叉编译怎么都不通过,提示 glibc 有问题:
applets/applets.c:20:2: #warning Static linking against glibc produces buggy executables
applets/applets.c:21:2: #warning (glibc does not cope well with ld --gc-sections).
applets/applets.c:22:2: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:23:2: #warning Note that glibc is unsuitable for static linking anyway.
applets/applets.c:24:2: #warning If you still want to do it, remove -Wl,--gc-sections
applets/applets.c:25:2: #warning from top-level Makefile and remove this warning
2.95.3更加不行,唯有选用 Build shared lib busybox 。这样,就需要往 ram/lib 目录拷入相关的库文件。make , make install 后就出来 _install 目录,全拷到 ram 目录下。
#gzip -9c ramdisk > ramdisk.image.gz
到这里,基本的都已搞定,可以 reset 开发板看看。下面是常见的错误:
Failed to execute /linuxrc.
如果传给内核的参数 init=/linuxrc 没错的话,就要看看linuxrc文件是否正确,是否有权限运行。刚开始,由于没有选中 ash shell ,bin 目录下还没有 sh ,而我修改的 linuxrc 第一句的内容是 #!/bin/sh ,根本就不能解析。后来改为 #!/bin/ash ,能解析了,也高兴了一下,可惜提示 sh: applet not found 。选中默认的shell后问题解决。关于Linux的启动详细过程,可以参考 Linux 初始 RAM 磁盘(initrd)概述 、Linux Root Filesystem Primer 这两篇文章。Linux2.6 还引入了新的ram文件系统,配置起来相对简单,有机会尝试一下...
Warning: unable to open an initial console
新的ramdisk不行,我换回原来的ramdisk,发现可以跑,只是提示找不到终端。于是,对比我和其它网友的串口输出。发现我的Linux-2.6.19.2没有 Mounted devfs on /dev 这项。大段大段的搜索后发现,这个devfs已被提出内核,而替代者udev在嵌入式方面还没有一点资料...网上的资料全都说从fs/Kconfig添加:
onfig DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depends on DEVFS_FS
可是,一点用处都没有...从Linux-2.6.18开始,包括文档在内已没有一点devfs的使用信息。而网上移植的Linux版本都比较低,所以...本想尝试从旧版本中移植相关代码过来(有点奇怪^_^),幸好当我对比新旧ramdisk时发现旧的ramdisk dev目录下缺少 console ,mknod 后可以进入旧版的 busybox 0.6 ...
最后是BusyBox的编译问题,使用3.4.1带的libc库编译,很容易出现与BusyBox里的程序不兼容现象。如:
modutils/lib.a(insmod.o)(.text.insmod_main+0x444): In function `insmod_main':
: undefined reference to `query_module'
miscutils/readahead.c: In function `readahead_main':
miscutils/taskset.c:17: error: parse error before '*' token
miscutils/taskset.c:18: warning: function declaration isn't a prototype
miscutils/taskset.c: In function `__from_cpuset':
......
最根本的解决办法是换一个libc库,可是现在还不知道哪个库最合适,唯有暂时将有问题的命令关掉...
两个星期过得真快,我的系统也终于跑起来,虽然还有很多问题,但总算有点收获 ^_^
CSDN技术中心 u-boot在s3c2410开发板上移植(NAND Flash Boot)过程
dev.csdn.net/article/84/84538.shtm
1)u-boot版本1.1.3,gcc version 3.3.3 (DENX ELDK 3.1.1 3.3.3-9)
2)在Makefile中加入
bks2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t bks2410 NULL s3c24x0
我把我的板子起名叫bks2410,可以依自己的喜好修改
3)建立board/bks2410目录,拷贝board/smdk2410下的文件到board/bks2410目录,将smdk2410.c更名为bks2410.c
4)cp include/configs/smdk2410.h include/configs/bks2410.h
5)将arm-linux-gcc的目录加入到PATH环境变量中,我的是目录/opt/eldk/usr/bin:/opt/eldk/bin
6)测试编译能否成功:
make bks2410_config
make all ARCH=arm
生成u-boot.bin就OK了
7)依照你自己开发板的内存地址分配情况修改board/bks2410/memsetup.S文件,我的程序:
#include
#include
#define BWSCON 0x48000000
/* BWSCON */
#define DW8    (0x0)
#define DW16    (0x1)
#define DW32    (0x2)
#define WAIT    (0x1<<2)
#define UBLB    (0x1<<3)
#define B1_BWSCON    (DW32)
#define B2_BWSCON    (DW16)
#define B3_BWSCON    (DW16 + WAIT + UBLB)
#define B4_BWSCON    (DW16)
#define B5_BWSCON    (DW16)
#define B6_BWSCON    (DW32)
#define B7_BWSCON    (DW32)
/* BANK0CON */
#if 0
#define B0_Tacs    0x0 /*  0clk */
#define B0_Tcos    0x0 /*  0clk */
#define B0_Tacc    0x7 /* 14clk */
#define B0_Tcoh    0x0 /*  0clk */
#define B0_Tah    0x0 /*  0clk */
#define B0_Tacp    0x0
#define B0_PMC    0x0 /* normal */
#endif
#define B0_Tacs    0x3 /*  0clk */
#define B0_Tcos    0x3 /*  0clk */
#define B0_Tacc    0x7 /* 14clk */
#define B0_Tcoh    0x3 /*  0clk */
#define B0_Tah    0x3 /*  0clk */
#define B0_Tacp    0x1
#define B0_PMC    0x0 /* normal */
/* BANK1CON */
#if 0
#define B1_Tacs    0x0 /*  0clk */
#define B1_Tcos    0x0 /*  0clk */
#define B1_Tacc    0x7 /* 14clk */
#define B1_Tcoh    0x0 /*  0clk */
#define B1_Tah    0x0 /*  0clk */
#define B1_Tacp    0x0
#define B1_PMC    0x0
#endif
#define B1_Tacs    0x3 /*  0clk */
#define B1_Tcos    0x3 /*  0clk */
#define B1_Tacc    0x7 /* 14clk */
#define B1_Tcoh    0x3 /*  0clk */
#define B1_Tah    0x3 /*  0clk */
#define B1_Tacp    0x3
#define B1_PMC    0x0
#define B2_Tacs    0x0
#define B2_Tcos    0x0
#define B2_Tacc    0x7
#define B2_Tcoh    0x0
#define B2_Tah    0x0
#define B2_Tacp    0x0
#define B2_PMC    0x0
#if 0
#define B3_Tacs    0x0 /*  0clk */
#define B3_Tcos    0x3 /*  4clk */
#define B3_Tacc    0x7 /* 14clk */
#define B3_Tcoh    0x1 /*  1clk */
#define B3_Tah    0x0 /*  0clk */
#define B3_Tacp    0x3     /*  6clk */
#define B3_PMC    0x0 /* normal */
#endif
#define B3_Tacs    0x0 /*  0clk */
#define B3_Tcos    0x0 /*  4clk */
#define B3_Tacc    0x7 /* 14clk */
#define B3_Tcoh    0x0 /*  1clk */
#define B3_Tah    0x0 /*  0clk */
#define B3_Tacp    0x0     /*  6clk */
#define B3_PMC    0x0 /* normal */
#define B4_Tacs    0x0 /*  0clk */
#define B4_Tcos    0x0 /*  0clk */
#define B4_Tacc    0x7 /* 14clk */
#define B4_Tcoh    0x0 /*  0clk */
#define B4_Tah    0x0 /*  0clk */
#define B4_Tacp    0x0
#define B4_PMC    0x0 /* normal */
#define B5_Tacs    0x0 /*  0clk */
#define B5_Tcos    0x0 /*  0clk */
#define B5_Tacc    0x7 /* 14clk */
#define B5_Tcoh    0x0 /*  0clk */
#define B5_Tah    0x0 /*  0clk */
#define B5_Tacp    0x0
#define B5_PMC    0x0 /* normal */
#define B6_MT    0x3 /* SDRAM */
#define B6_Trcd     0x1
#define B6_SCAN    0x1 /* 9bit */
#define B7_MT    0x3 /* SDRAM */
#define B7_Trcd    0x1 /* 3clk */
#define B7_SCAN    0x1 /* 9bit */
/* REFRESH parameter */
#define REFEN    0x1 /* Refresh enable */
#define TREFMD    0x0 /* CBR(CAS before RAS)/Auto refresh */
#define Trp    0x0 /* 2clk */
#define Trc    0x3 /* 7clk */
#define Tchr    0x2 /* 3clk */
#define REFCNT    1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
/**************************************/
_TEXT_BASE:
.word TEXT_BASE
.globl memsetup
memsetup:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
adr     r0, SMRDATA
/*ldr r1, _TEXT_BASE*/
/*sub r0, r0, r1*/
ldr r1, =BWSCON /* Bus Width Status Controller */
add     r2, r0, #13*4
0:
ldr     r3, [r0], #4
str     r3, [r1], #4
cmp     r2, r0
bne     0b
/* everything is fine now */
mov pc, lr
.ltorg
/* the literal pools origin */
SMRDATA:
.word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
.word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
.word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
.word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
.word 0x1f7c/*((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))*/
.word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
.word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
.word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
.word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
.word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
.word 0x31
.word 0x30
.word 0x30
8)在board/bks2410加入NAND Flash读函数,建立nand_read.c,加入如下内容(copy from vivi):
#include
#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE  0x4e000000
#define NFCONF  __REGi(NF_BASE + 0x0)
#define NFCMD  __REGb(NF_BASE + 0x4)
#define NFADDR  __REGb(NF_BASE + 0x8)
#define NFDATA  __REGb(NF_BASE + 0xc)
#define NFSTAT  __REGb(NF_BASE + 0x10)
#define BUSY 1
inline void wait_idle(void) {
int i;
while(!(NFSTAT & BUSY))
for(i=0; i<10; i++);
}
#define NAND_SECTOR_SIZE 512
#define NAND_BLOCK_MASK  (NAND_SECTOR_SIZE - 1)
/* low level nand read function */
int
nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
int i, j;
if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
return -1; /* invalid alignment */
}
/* chip Enable */
NFCONF &= ~0x800;
for(i=0; i<10; i++);
for(i=start_addr; i < (start_addr + size);) {
/* READ0 */
NFCMD = 0;
/* Write Address */
NFADDR = i & 0xff;
NFADDR = (i >> 9) & 0xff;
NFADDR = (i >> 17) & 0xff;
NFADDR = (i >> 25) & 0xff;
wait_idle();
for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
*buf = (NFDATA & 0xff);
buf++;
}
}
/* chip Disable */
NFCONF |= 0x800; /* chip disable */
return 0;
}
9)修改board/bks2410/Makefile为
OBJS := bks2410.o flash.o nand_read.o
10)修改cpu/arm920t/start.S文件
在ldr pc, _start_armboot之前加入:
#ifdef CONFIG_S3C2410_NAND_BOOT
bl    copy_myself
@ jump to ram
ldr   r1, =on_the_ram
add  pc, r1, #0
nop
nop
1:    b     1b          @ infinite loop
on_the_ram:
#endif
在_start_armboot: .word start_armboot之后加入:
#ifdef CONFIG_S3C2410_NAND_BOOT
copy_myself:
mov r10, lr
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr   r2, =0xf830           @ initial value
str   r2, [r1, #oNFCONF]
ldr   r2, [r1, #oNFCONF]
bic  r2, r2, #0x800              @ enable chip
str   r2, [r1, #oNFCONF]
mov r2, #0xff         @ RESET command
strb r2, [r1, #oNFCMD]
mov r3, #0                   @ wait
1:add  r3, r3, #0x1
cmp r3, #0xa
blt   1b
2:ldr   r2, [r1, #oNFSTAT]      @ wait ready
tst    r2, #0x1
beq  2b
ldr   r2, [r1, #oNFCONF]
orr  r2, r2, #0x800              @ disable chip
str   r2, [r1, #oNFCONF]
@ get read to call C functions (for nand_read())
ldr   sp, DW_STACK_START       @ setup stack pointer
mov fp, #0                    @ no previous frame, so fp=0
@ copy vivi to RAM
ldr   r0, =UBOOT_RAM_BASE
mov     r1, #0x0
mov r2, #0x20000
bl    nand_read_ll
tst    r0, #0x0
beq  ok_nand_read
#ifdef CONFIG_DEBUG_LL
bad_nand_read:
ldr   r0, STR_FAIL
ldr   r1, SerBase
bl    PrintWord
1:b     1b          @ infinite loop
#endif
ok_nand_read:
#ifdef CONFIG_DEBUG_LL
ldr   r0, STR_OK
ldr   r1, SerBase
bl    PrintWord
#endif
@ verify
mov r0, #0
ldr   r1, =UBOOT_RAM_BASE
mov r2, #0x400     @ 4 bytes * 1024 = 4K-bytes
go_next:
ldr   r3, [r0], #4
ldr   r4, [r1], #4
teq   r3, r4
bne  notmatch
subs r2, r2, #4
beq  done_nand_read
bne  go_next
notmatch:
#ifdef CONFIG_DEBUG_LL
sub  r0, r0, #4
ldr   r1, SerBase
bl    PrintHexWord
ldr   r0, STR_FAIL
ldr   r1, SerBase
bl    PrintWord
#endif
1:b     1b
done_nand_read:
#ifdef CONFIG_DEBUG_LL
ldr   r0, STR_OK
ldr   r1, SerBase
bl    PrintWord
#endif
mov pc, r10
@ clear memory
@ r0: start address
@ r1: length
mem_clear:
mov r2, #0
mov r3, r2
mov r4, r2
mov r5, r2
mov r6, r2
mov r7, r2
mov r8, r2
mov r9, r2
clear_loop:
stmia      r0!, {r2-r9}
subs r1, r1, #(8 * 4)
bne  clear_loop
mov pc, lr
#endif @ CONFIG_S3C2410_NAND_BOOT
在文件的最后加入:
.align     2
DW_STACK_START:
.word      STACK_BASE+STACK_SIZE-4
11)修改include/configs/bks2410.h文件,添加如下内容:
/*
* Nandflash Boot
*/
#define CONFIG_S3C2410_NAND_BOOT 1
#define STACK_BASE    0x33f00000
#define STACK_SIZE    0x8000
#define UBOOT_RAM_BASE    0x33f80000
/* NAND Flash Controller */
#define NAND_CTL_BASE            0x4E000000
#define bINT_CTL(Nb)        __REG(INT_CTL_BASE + (Nb))
/* Offset */
#define oNFCONF               0x00
#define oNFCMD                0x04
#define oNFADDR               0x08
#define oNFDATA               0x0c
#define oNFSTAT               0x10
#define oNFECC                0x14
12)重新编译u-boot
make all ARCH=arm
13)通过jtag将u-boot烧写到flash中就可以从NAND flash启动了
我的u-boot启动信息:
U-Boot 1.1.3 (May  6 2006 - 18:13:59)
U-Boot code: 33F80000 -> 33F967C4  BSS: -> 33F9AAAC
RAM Configuration:
Bank #0: 30000000 64 MB
Flash: 512 kB
*** Warning - bad CRC, using default environment
In:    serial
Out:   serial
Err:   serial
BKS2410 #
作者Blog:http://blog.csdn.net/bekars/
相关文章
u-boot在s3c2410开发板上移植(NAND Flash Boot)过程
MIZI Linux SDK for S3C2410
ArmLinux BOOTLOADER全程详解
S3C2410快速启动的实现
千千万万的IT开发工程师路在何方?
嵌入式LINUX-2.6内核技术 - nand flash启动u-boot源码分享
www.hhcn.com/cgi-bin/topic.cgi?forum=3&topic=562&s...
[这个贴子最后由luofuchong在 2007/04/20 01:08pm 第 6 次编辑]
小弟现有一个可用的nand flash启动的u-boot源代码愿意分享,具体下载地址如下:
www.hhcn.org/maindoc/nandboot-2410-luofuchong.rar
在些感谢华恒斑竹hn的帮助和提供空间^_^
小弟不敢贪功,先注明一下这个源码的出处:
补丁来源于以下网站:
http://linux.insigma.com.cn/devbbs/dispbbs.asp?boardID=15&ID=382&page=1
其实这个补丁早就下载了,但小弟不懂cvs的用法,怕麻烦一直没下载其对应版本的源码(在这里的显示版本虽然是1.1.4,但可是经过多人修改的,所以和官方的版本相差甚远)。
后来我哥把它下载下来,于是抽空把它编译了一下,串口居然有输出,兴致来了,花了几天搞了一下,现在基本可以用了。
这是cvs下载源码的方法:
cvs -d:pserver:anonymous@u-boot.cvs.sourceforge.net:/cvsroot/u-boot login
cvs -z3 -d:pserver:anonymous@u-boot.cvs.sourceforge.net:/cvsroot/u-boot co -D 20060523 -P u-boot
我经已经试过可以下载的了,不过最好晚上再下载成功率会高一点^_^
登录的时候提示密码的时候直接按回车就行。
在些说一下这几天编译的经验:
1)打上补丁的过程中提示2、3个文件有些地方未能正常打补丁,但不影响编译。
2)要用2.95.3的交叉编译器来编译,我试过用3.3.2的编译器来编译通过,但nand flash检测的那段代码没有运行,导致nand flash检测不出来,这可花了我不少的时间~_~
3)附上的补丁是我修改过的(主要是一些提示信息和env地址的修改),打补丁的方法如下(假如你把补丁放到u-boot目录下):
代码: patch -p1 好了,下面介绍一下这个u-boot的用法:
U-Boot 1.1.4 (Oct 23 2006 - 22:04:37)
U-Boot code: 33F80000 -> 33F9DC98  BSS: -> 33FA2308
RAM Configuration:
Bank #0: 30000000 64 MB
Nor Flash: 512 kB
Nand Flash:    64 MB
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0
sbc2410=> printenv
bootargs=noinitrd root=/dev/mtdblock/3 console=ttySAC0
bootdelay=3
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
bootfile="zImage"
filesize=13469c
fileaddr=30008000
netmask=255.255.255.0
ipaddr=192.168.1.128
serverip=192.168.1.15
bootcmd=nand read 30008000 30000 1d0000;go 30008000
stdin=serial
stdout=serial
stderr=serial
Environment size: 319/65532 bytes
sbc2410=> help nand
nand    - NAND sub-system
info  - show available NAND devices
nand device [dev] - show or set current device
nand read[.jffs2[s]  addr off size
nand write[.jffs2] addr off size - read/write `size' bytes starting at offset `off' to/from memory address `addr'
nand erase [clean] [off size] - erase `size' bytes from offset `off' (entire device if not specified)
nand bad - show bad blocks
nand read.oob addr off size - read out-of-band data
nand write.oob addr off size - read out-of-band data
按照提示应该都会它的用法了吧?不过在此还是举一个烧写内核的例子吧:
sbc2410=> tftp 30008000 zImage
TFTP from server 192.168.1.15; our IP address is 192.168.1.128
Filename 'zImage'.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#################################################################
####################################################
done
Bytes transferred = 1263260 (13469c hex)
注:可以看出,网络也是好的^_^
sbc2410=> nand erase 30000 1d0000
NAND erase: device 0 offset 196608, size 1900544 ... OK
sbc2410=> nand write 30008000 30000 1d0000
NAND write: device 0 offset 196608, size 1900544 ...  1900544 bytes written: OK
OK,现在内核已经写入nand flash了,想开机引导它?
sbc2410=> setenv bootcmd nand read 30008000 30000 1d0000\;go 30008000
sbc2410=> saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done
这样就可以了。好了,现在按一下你的复位键试试:
U-Boot 1.1.4 (Oct 23 2006 - 21:28:24)
U-Boot code: 33F80000 -> 33F9DC88  BSS: -> 33FA22F8
RAM Configuration:
Bank #0: 30000000 64 MB
Nor Flash: 512 kB
Nand Flash:    64 MB
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0
NAND read: device 0 offset 196608, size 1900544 ...  1900544 bytes read: OK
## Starting application at 0x30008000 ...
Uncompressing Linux................................................................................. done, booting the kernel.
Linux version 2.6.14 (root@luofuchong) (gcc version 3.4.1) #21 Fri Oct 20 17:20:39 CST 2006
CPU: ARM920Tid(wb) [41129200] revision 0 (ARMv4T)
Machine: SMDK2410
ATAG_INITRD is deprecated; please update your bootloader.
Memory policy: ECC disabled, Data cache writeback
CPU S3C2410A (id 0x32410002)
S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz
S3C2410 Clocks, (c) 2004 Simtec Electronics
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
USB Control, (c) 2006 sbc2410
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: noinitrd root=/dev/mtdblock/3 console=ttySAC0
irq: clearing subpending status 00000002
PID hash table entries: 512 (order: 9, 8192 bytes)
timer tcon=00500000, tcnt a509, tcfg 00000200,00000000, usec 00001e4c
Console: colour dummy device 80x30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 64MB = 64MB total
Memory: 62208KB available (1924K code, 529K data, 108K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
softlockup thread 0 started up.
NET: Registered protocol family 16
S3C2410: Initialising architecture
SCSI subsystem initialized
usbcore: registered new driver usbfs
usbcore: registered new driver hub
S3C2410 DMA Driver, (c) 2003-2004 Simtec Electronics
DMA channel 0 at c4800000, irq 33
DMA channel 1 at c4800040, irq 34
DMA channel 2 at c4800080, irq 35
DMA channel 3 at c48000c0, irq 36
NetWinder Floating Point Emulator V0.97 (double precision)
devfs: 2004-01-31 Richard Gooch (rgooch@atnf.csiro.au)
devfs: devfs_debug: 0x0
devfs: boot_options: 0x1
yaffs Oct 18 2006 12:39:51 Installing.
Console: switching to colour frame buffer device 30x40
fb0: s3c2410fb frame buffer device
fb1: Virtual frame buffer device, using 1024K of video memory
led driver initialized
s3c2410 buttons successfully loaded
s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2410
s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2410
s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2410
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
usbcore: registered new driver ub
Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410)
eth0: CS8900A rev E at 0xe0000300 irq=53, no eeprom , addr: 08: 0:3E:26:0A:5B
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c2410-nand: mapped registers at c4980000
s3c2410-nand: timing: Tacls 10ns, Twrph0 30ns, Twrph1 10ns
NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 1884 at 0x01d70000
Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00020000 : "vivi"
0x00020000-0x00030000 : "param"
0x00030000-0x00200000 : "kernel"
0x00200000-0x04000000 : "root"
usbmon: debugfs is not available
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
usbcore: registered new driver usbmouse
drivers/usb/input/usbmouse.c: v1.6:USB HID Boot Protocol mouse driver
mice: PS/2 mouse device common for all mice
s3c2410 TouchScreen successfully loaded
UDA1341 audio driver initialized
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 2, 16384 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
TCP bic registered
NET: Registered protocol family 1
Root-NFS: No NFS server available, giving up.
VFS: Unable to mount root fs via NFS, trying floppy.
yaffs: dev is 32505859 name is "mtdblock3"
yaffs: Attempting MTD mount on 31.3, "mtdblock3"
block 1757 is bad
VFS: Mounted root (yaffs filesystem).
Mounted devfs on /dev
Freeing init memory: 108K
init started:  BusyBox v1.1.3 (2006.09.20-14:52+0000) multi-call binary
Starting pid 695, console /dev/tts/0: '/etc/init.d/rcS'
Please press Enter to activate this console.
注:这就是在我的板上的启动信息了^_^
遗留的问题:
1:这个u-boot只提供jffs2文件系统的烧写功能(具体未用过,因为我只搞过yaffs文件系统~_~),没有对yaffs文件系统的烧写支持,我想这部分就留给各位去做吧^_^
2:好像用同样的方法来启动2.4内核解压后内核不能启动,但2.6内核就可以,具体不知道原因,知道的朋友请告知并把修改好的补丁共享,发挥一下共享精神,谢谢!
s3c2410 - CSDN tag
tag.csdn.net/tag/s3c2410.xml
This is a “feed” of frequently changing content on this site.
You can subscribe to this feed to receive updates when this content changes.
Error Processing Feed
There was an error processing this feed. It's our fault. :-( You can still subscribe to the feed if you know what it is. For reference, the error was:
s3c2410 - CSDN tag
s3c2410 - CSDN tag
2.6内核移植NOR FLASH 驱动
二、添加配置项 1、修改 drivers/mtd/maps/Kconfig文件,添加如下内容:config MTD_S3C2410tristate "CFI Flash device mapped on S3C2410"depends on ARM &&MTD_CFIhelp.四、建立设备文件 # mknod -m 666 mtd0 c 90 0 # mknod -m 666 mtd1 c 90 2 # mknod -m 666 mtd2 c 90 4 # mknod -m 666 mtd3 c 90 6 # mknod -m 666 mtd4 c 90 8 # mknod -m 666 mtd5 c 90 10.#ifdef CONFIG_MTD_PARTITIONSmtd_parts_nb = parse_mtd_partitions(mymtd, probes, &mtd_parts, MTDID);add_mtd_partitions(mymtd, mtd_parts, mtd_parts_nb);
基于嵌入式Linux与S3C2410平台视频采集
在系统平台上对USB口数码摄像头驱动,首先把USB控制器驱动模块静态编译进内核,使平台中支持USB接口,再在需要使用摄像头采集时,使用insmode动态加载其驱动模块,这样摄像头就可正常工作了,接着进行了下一步对视频流的采集编程。(2)采集程序实现过程 首先打开视频设备,摄像头在系统中对应的设备文件为/dev/video0,采用系统调用函数grab_fd=open("/dev/video0",O_RDWR),grab_fd是设备打开后返回的文件描述符(打开错误返回-1),以后的系统调用函数就可使用它来对设备文件进行操作了。
ramdisk 制作
制作空的ramdisk:# dd if=/dev/zero of=ramdisk bs=1k count=8000 在本地目录下出现一个rmdisk的块文件# losetup /dev/loop2 ramdisk# mkfs.ext2 /dev/loop2挂载ramdisk至/mnt下# mount -t ext2 /dev/loop2 /mnt㈢.准备lib库文件# cd /mnt# mkdir lib# cd /usr/local/arm/3.4.1/arm-linux/lib# for file in libc libcrypt libdl libm libpthread libresolv libutil> do> cp $file-*.so /mnt/lib> cp -d $file.so.[*0-9] /mnt/lib> done# cp -d ld*.so* /mnt/lib.
嵌入式Linux资源
(3)armlinux:除ARM7 NOMMU的处理器外,其它的ARM9/XSCALE等ARM系列处理器都跑armlinuxarmlinux发行包下载:通用的下载方式ftp://ftp.uk.kernel.org/pub/linux/kernel/v2.4/还有可以是CVS的方式:一般的都在sourceforge.nethttp://sourceforge.net/cvs/?group_id=33360CVS命令如下: (这是你的Redhat Linux PC必须能够接通Internet)cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/armlinux logincvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/armlinux co linux-2.4
ramfs制作实录
无奈之下我想起了babylinux的制作过程,里面就有用到ramfs,以下是参考其制作ramfs的制作过程:1、dd if=/dev/zero of=/dev/ram1 bs=1k count=80002、mkfs.ext2 -m0 /dev/ram13、mount /dev/ram1 /mnt/ramdisk/4、详细的复制文件的过程我在这不再详细说明,请参考以上两个贴。此时你可以使用"mount -o loop ramdisk.img /mnt/ramdisk"命令把这个ramfs挂载在你pc的/mnt/ramdisk目录,它对pc来说就等同于光盘iso镜像文件7、gzip -v9 ramdisk.img.
制作ramdisk根文件系统
制作空的ramdisk:# dd if=/dev/zero of=ramdisk bs=1k count=8000 在本地目录下出现一个rmdisk的块文件# losetup /dev/loop2 ramdisk# mkfs.ext2 /dev/loop2挂载ramdisk至/mnt下# mount -t ext2 /dev/loop2 /mnt㈢.准备lib库文件# cd /mnt# mkdir lib# cd /usr/local/arm/3.4.1/arm-linux/lib# for file in libc libcrypt libdl libm libpthread libresolv libutil> do> cp $file-*.so /mnt/lib> cp -d $file.so.[*0-9] /mnt/lib> done# cp -d ld*.so* /mnt/lib.
S3C2410 bootloader ----VIVI阅读笔记
mmu_init()函数用于启动MMU,它直接调用arm920_setup()函数。假设需要动态申请一块sizeA大小的内存,则 mmalloc函数从gHeapBase开始搜索blockhead数据结构,如果发现某个blockhead满足:(1) allocated = 0 //表示未分配(2) size >sizeA,则找到了合适的blockhead,满足上述条件后,进行如下操作:a.allocated设为1b.如果size -sizeA >sizeof(blockhead),则将剩下的内存组织成一个新的blockhead,放入链表中c.返回分配的内存的首地址释放内存的操作更简单,直接将要释放的内存对应的blockhead数据结构的allocated设为0即可。
LCD 移植过程
LCD 控制器的功能是显示驱动信号,进而驱动LCD。.regs = {.lcdcon1= S3C2410_LCDCON1_TFT16BPP | S3C2410_LCDCON1_TFT | S3C2410_LCDCON1_CLKVAL(1),.lcdcon2= S3C2410_LCDCON2_VBPD(25) | S3C2410_LCDCON2_VFPD(5) | S3C2410_LCDCON2_VSPW(1),.lcdcon3= S3C2410_LCDCON3_HBPD(67) | S3C2410_LCDCON3_HFPD(40),.lcdcon4= S3C2410_LCDCON4_HSPW(31) | S3C2410_LCDCON4_MVAL(13),.lcdcon5= S3C2410_LCDCON5_FRM565 | S3C2410_LCDCON5_HWSWP | S3C2410_LCDCON5_PWREN|S3C2410_LCDCON5_INVVLINE|S3C2410_LCDCON5_INVVFRAME ,},
2410mon的DIY
我的开发板为友善之臂的SBC-2410X,64M Nand flash ,64 ram,1M nor flash.板子带了三星公司提供的2410mon程序,以及2410test程序。于是就考虑修改2410mon来做USB烧写nand flash。策略:板子支持跳线选择nor flash或者 nand flash启动,于是在nor flash上固定一个程序来烧写nand flash,而boot load和linux 内核都在nand flash上操作。
ARM,S3C2410中脉宽调制定时器
当定时器被使能之后,定时器计数缓冲寄存器(TCNTBn)中初始的数值就被加载到递减计数器中。自动加载功能被打开后,当TCNTn数值递减到0时,芯片自动将TCNTBn的数值拷贝到TCNTn,从而开始下一次循环,若TCNTBn数值为0,则不会有递减操作,定时器停止。1, 使能自动加载功能,设置TCNTBn=160,TCMPBn=110,设置人工加载位并配置极性转换位,人工加载位将时TCNTBn、TCMPBn的数值加载到TCNTn、TCMPn。4, 当TCNTn计数至0,定时器产生中断请求,同时TCNTBn、TCMPBn的数值被自动加载到TCNTn、TCMPn,前者为80,后者为40。
s3c2410初始化(下)
s3c2410初始化(下)[ 2006-5-10 16:09:00 | By: ly_zw ]无cache,有写缓冲,读操作直接反映到ASB总线上。写操作CPU将数据写入到写缓冲后继续运行,由写缓冲进行ASB操作。l 中断初始化2410的内存空间没有remap的机制,应该中断入口时钟位于零地址。可见,中断向量表存放的是各个中断服务程序的入口地址,它是用来被加载的,而并不是可执行代码。为了统一,所有示例程序都将中断向量表放在0x33ffff00开始的地址,并根据入口地址依次排列。
s3c2410初始化
S3C2410初始化。2410的MMU支持1级&2级地址映射,在我们目前的应用中均采用1级section模式的地址映射,一个section的大小为1M,也就是说从逻辑地址到物理地址的转变是这样的一个过程:一个32位的地址,高12位决定了该地址在页表中的index,这个index的内容决定了该逻辑section对应的物理section;这段代码的含义是通过堆栈将中断向量表中的内容赋给PC指针(如HandleFIQ是存放着FIQ服务程序入口地址的地址),自然程序就跳到相应的入口地址。为了统一,所有示例程序都将中断向量表放在0x33ffff00开始的地址,并根据入口地址依次排列。
嵌入式Linux系统的图像采集与显示
但Linux内核本身不具备强实时性,且内核体积较大,而且嵌入式系统的硬件资源有限,因此把Linux用于嵌入式系统,必须对Linux进行实时化和嵌入式化,即通过配置内核,裁减shell和嵌入式C库对系统定制,使整个系统能够存放到容量较小的Flash中,Linux的动态模块加载,使Linux的裁减极为方便,高度模块化的部件使添加非常容易。3 基于Video4Linux的图像采集 Video4Linux是Linux中关于视频设备的内核驱动,他为针对视频设备的应用程序编程提供一系列接口函数,在Linux下,视频采集设备的正常使用依赖于对Video4 Linux标准的支持。
S3c2410软件调试总结
玩过2410的朋友都知道 2410初始化代码中有一段搬运RW和ZI初始化的代码,没错,它确实能够在一定程度上完成上面所说的任务,只要我们在生成二进制可执行代码的时候在编译 器链接项的地方填写正确的RO&RW地址,(比如RO = 0, RW = 0x30000000), 那么将程序下到 NOR flash的零地址并从nor flash启动,启动代码会将RW&ZI数据弄到0x30000000,程序就能跑起来了。运行空间的初始化 这段代码主要完成两个功能,一是将RW数据搬运到RW空间(我们生成ROM镜像时,RW数据是跟在RO数据之后的),二是 初始化ZI数据段。
转:S3C2410 bootloader ----VIVI阅读笔记
mmu_init()函数用于启动MMU,它直接调用arm920_setup()函数。假设需要动态申请一块sizeA大小的内存,则 mmalloc函数从gHeapBase开始搜索blockhead数据结构,如果发现某个blockhead满足:(1) allocated = 0 //表示未分配(2) size >sizeA,则找到了合适的blockhead,满足上述条件后,进行如下操作:a.allocated设为1b.如果size -sizeA >sizeof(blockhead),则将剩下的内存组织成一个新的blockhead,放入链表中c.返回分配的内存的首地址释放内存的操作更简单,直接将要释放的内存对应的blockhead数据结构的allocated设为0即可。
LCD驱动程序往2.6.11内核移植
LCD驱动程序往2.6.11内核的移植总结硬件环境:SBC-2410X开发板(CPU:S3C2410X)内核版本:2.6.11.1运行环境:Debian2.6.8交叉编译环境:gcc-3.3.4-glibc-2.3.3注:本驱动移植是基于s3c2400 framebuffer 的驱动。在对驱动程序进行了函数替代以及改写了一些函数之后,将驱动程序编译进内核里,内核可以正确的编译连接并生成镜像文件,把镜像文件下载到开发板上,可以看到drivers/video目录下看到系统注册的一个设备文件,但是在系统启动之后就是无法看见小企鹅的图标并且用测试程序去测试,LCD屏幕上也无法显示任何有色的线条。
U-Boot在S3C2410上的移植
//标记列表开始 setup_memory_tags(bd); //设置内存的起始位置和大小 setup_commandline_tag(bd, commandline); /*Linux内核在启动时可以命令行参数的形式来接收信息,利用这一点可以向内核提供那些内核不能检测的硬件参数信息,或者重载(override)内核检测到的信息,这里char *commandline "initrd=0x30800000,0x440000 root=/dev/ram init=/linuxrc console=ttyS0";//表示内核解压后ramdisk的大小 setup_initrd_tag(bd, initrd_start, initrd_end); //设置ramdisk的大小和物理起始地址 setup_end_tag(bd); //标记列表结束。
今天的项目进展
如何利用vidcat测试MC2410E开发板与USB摄像头的连接。4、运行vidcat shell启动后,输入命令行ln -s /dev/v4l/video0 /dev/video(或者在rcS文件中加入这一条) 然后输入:vidcat -s 640x480 -p c >test.jpg 运行完成后,即可查看test.jpg来观察抓图的效果。看起来好象是某变量没定义,修改webcam_server.c的那几个struct定义到main顶部即可,再次 make,成功。
如何利用vidcat测试MC2410E开发板与USB摄像头的连接
如何利用vidcat测试MC2410E开发板与USB摄像头的连接。(2)进入USB Suppot, 在 ---USB Multimedia devices中选中。USB OV511 Camera Support后退出。4、运行vidcat shell启动后,输入命令行ln -s /dev/v4l/video0 /dev/video(或者在rcS文件中加入这一条) 然后输入:vidcat -s 640x480 -p c >test.jpg 运行完成后,即可查看test.jpg来观察抓图的效果。
内核编译的基本方法
内核编译的基本方法。驱动程序和支持的文件系统也是内核的一部分,在这里我们要确定你所要支持的文件系统及所要涉及的外部设备。常见驱动程序存放位置如下:网卡驱动 ---- cs8900A.Usb摄像头驱动(ov511芯片)声卡驱动:请看另外的文章--手动编写驱动程序。当文件系统和驱动程序都配置好后,就可以编译内核了,以下是编译内核的步骤。
s3c2410下使用usb
按照Using a USB Card Reader in Linux 安装相应驱动2。
嵌入式Linux的图像采集与显示
Video4Linux是Linux中关于视频设备的 内核驱动,他为针对视频设备的应用程序编程提供一系列接口函数,在Linux下,视频采集设备的正常使用依赖于对Video4 Linux标准的支持。但该方法并不是每个图像采集设备都支持。由于Linux的驱动模型支持模块堆叠技术,内核开发者已提供了一些通用模块,因此,虽然文中是以USB摄像头为例,但只要针对自己的图像采集设备编写基于Video4 Linux的驱动程序, 针对自己的LCD编写基于FrameBuffer的驱动程序,以上的程序便可成为通用的图像采集与显示程序。
移植linux2.6.11.7到s3c2410
# CONFIG_MTD_CFI is not set# CONFIG_MTD_JEDECPROBE is not setCONFIG_MTD_MAP_BANK_WIDTH_1=yCONFIG_MTD_MAP_BANK_WIDTH_2=yCONFIG_MTD_MAP_BANK_WIDTH_4=y# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set# CONFIG_MTD_MAP_BANK_WIDTH_32 is not setCONFIG_MTD_CFI_I1=yCONFIG_MTD_CFI_I2=y# CONFIG_MTD_CFI_I4 is not set# CONFIG_MTD_CFI_I8 is not set# CONFIG_MTD_RAM is not set# CONFIG_MTD_ROM is not set# CONFIG_MTD_ABSENT is not set.
uboot
2.1 支持ARM-922T内核的代码修改修改以下代码,使U-BOOT支持arm-922t内核。① 在include/目录下新建文件arm922t.h,内容如下:#ifndef __ARM922T_H__#define __ARM922T_H__#endif② 在include/目录下新建文件wt-arm9.h,该文件描述了ARM922T中Timer、UART等寄存器的结构及若干宏定义。2.4 修改Makefile  在u-boot-1.1.0/Makefile中加入lh7a400_config : unconfig@./mkconfig $(@:_config=) arm arm922t wt-arm9其中"arm"是CPU的种类, arm922t 是ARM CPU对应的代码目录,wt-arm9是自己开发板对应的目录。
基于S3C2410处理器目标板的Linux移植
把REDHATLinux90的安装光盘放入光驱中,执行装载光驱命令: moumt/dev/cdrom /nmt/cdrom 如果系统不能识别/mnt/cdrom,可以使用如下命令(假设cdrom为/dev/had),则用mount -t iso9660 /dev/hdb/mnt。mkdir /usr/local/arm mount /dev/cdrom /mnt/cdrom cd/ cp /mnt/cdrom/bin/cross-2.95.3.tar.bz2 /usr/local/arm/ cp /mnt/cdrom/bin/Linux_for_s3c2410.gz tar zxvf Linux_for_s3c2410.gz cd /usr/local/arm/ tar -jxvf cross-2.95.3.tar.bz2 程序执行完后,Linux源代码和编译环境都已建立起来了。
基于S3C2410处理器目标板的Linux移植
把REDHATLinux90的安装光盘放入光驱中,执行装载光驱命令: moumt/dev/cdrom /nmt/cdrom 如果系统不能识别/mnt/cdrom,可以使用如下命令(假设cdrom为/dev/had),则用mount -t iso9660 /dev/hdb/mnt。mkdir /usr/local/arm mount /dev/cdrom /mnt/cdrom cd/ cp /mnt/cdrom/bin/cross-2.95.3.tar.bz2 /usr/local/arm/ cp /mnt/cdrom/bin/Linux_for_s3c2410.gz tar zxvf Linux_for_s3c2410.gz cd /usr/local/arm/ tar -jxvf cross-2.95.3.tar.bz2 程序执行完后,Linux源代码和编译环境都已建立起来了。
基于S3C2410处理器目标板的Linux移植
把REDHATLinux90的安装光盘放入光驱中,执行装载光驱命令: moumt/dev/cdrom /nmt/cdrom 如果系统不能识别/mnt/cdrom,可以使用如下命令(假设cdrom为/dev/had),则用mount -t iso9660 /dev/hdb/mnt。mkdir /usr/local/arm mount /dev/cdrom /mnt/cdrom cd/ cp /mnt/cdrom/bin/cross-2.95.3.tar.bz2 /usr/local/arm/ cp /mnt/cdrom/bin/Linux_for_s3c2410.gz tar zxvf Linux_for_s3c2410.gz cd /usr/local/arm/ tar -jxvf cross-2.95.3.tar.bz2 程序执行完后,Linux源代码和编译环境都已建立起来了。
基于S3C2410处理器目标板的Linux移植
本文描述了将Linux移植到基于S3C2410处理器目标板上的方法与过程。移植后Linux在嵌入式系统中运行良好。1 目标平台介绍 文中使用的目标平台S3C2410是SAMSUNG公司使用920T处理器内核开发的一款嵌入式处理器。该芯片还包含有16kB一体化的Cache/MMU,这一特性使开发人员能够将Linux和VXwork移植到基于该处理器的目标系统中。在某工作站PC上安装ftp客户端程序和Telnet工具 ,安装完毕后应该可以在该工站PC和Linux服务器之间进行文件的传输,并在工作站PC可以通过Telnet登陆到Linux服务器(可能需要将Linux服务器 的防火墙服务关闭才能完成)。
S3C2410中音频驱动的实现
S3C2410中的音频驱动是通过IIS总线接口实现的,并采用了中断和DMA技术。首先进行时钟频率和GPIO端口的设置,之后设置中断屏蔽与表决寄存器,然后指定对应的中断服务程序,初始化L3接口后,进行DMA的设置和IIS的设置,最后,开启DMA传输,即可。保证WAV格式的数据存放在了0x31000000.
基于S3C2410处理器目标板的Linux移植 (1)
1 2 3 下一页 本文描述了将Linux移植到基于S3C2410处理器目标板上的方法与过程。介绍了目标平台和Linux,并说明了如何搭建移植环境,着重介绍了Bootloader的架构和功能以及Linux内核的移植。Linux内核 ;1 目标平台介绍文中使用的目标平台S3C2410是SAMSUNG公司使用920T处理器内核开发的一款嵌入式处理器。在某工作站PC上安装ftp客户端程序和Telnet工具 ,安装完毕后应该可以在该工站PC和Linux服务器之间进行文件的传输,并在工作站PC可以通过Telnet登陆到Linux服务器(可能需要将Linux服务器 的防火墙服务关闭才能完成)。
LCD驱动程序往2.6.11内核的移植总结
转自:http://loveuzz.blogchina.com/1958039.htmlLCD驱动程序往2.6.11内核的移植总结硬件环境:SBC-2410X开发板(CPU:S3C2410X)内核版本:2.6.11.1运行环境:Debian2.6.8交叉编译环境:gcc-3.3.4-glibc-2.3.3注:本驱动移植是基于s3c2400 framebuffer 的驱动。在驱动程序移植过程中由于是基于S3C2400的驱动,所以主要的修改工作就是根据所用开发板的硬件修改相应的寄存器的设置。修改s3c2400fb_set_controller_regs和s3c2400fb_lcd_init函数,这个函数涉及到了CPU与LCD的物理连接,要根据LCD与CPU的具体连接来设置各个CPIO寄存器。
CodeSourcery GCC-Arm
www.codesourcery.com/
ARM体系结构和编程学习笔记- - - ARM开发 - 电子工程社区 - Powered by Discuz!
bbs.ee365.cn/redirect.php?fid=17&tid=4238&goto=nex...
ARM体系结构和编程学习笔记- -
第一章
1.Arm体系结构的版本和ARM处理器系列的关系
Arm体系结构的版本指的是ARM对应的各种指令集。目前一共定义了6个版本(1~60)
Arm 处理器系列则是由各个厂家实现的各种实际物理MCU或CPU,目前主要有
ARM7:130MIPS(MAX),TDMI版本不支持MMU
ARM9:5级整数流水线,支持MMU
ARM9E:支持DSP,5级整数流水线,300MIPS(MAX),
ARM10E:400MIPS(MAX),支持DSP,6级整数流水线,
SecurCore:安全支持,软内核,防扫描探测
这里主要目的用于CPU的选型,根据自己的需求选择对应的MCU,从而减少开发时间和降低成本,这里附上一文:
嵌入式硬件平台的选择
北理 FTP 联盟 - 嵌入式开发技术 - 嵌入式 LiNUX 开发 - 【求助】怎样使vivi具有TFTP下载功能? - BitUnion.org
kiss.bitunion.org/thread-357208-2-1.html
http://www.samsung.com/Products/Semiconductor/MobileSoC/ApplicationProcessor/ARM9Series/S3C2410/USBDownloaderFirware.zip
H-JTAG
www.hjtag.com/chinese/index.html
使用ELDK4.1构建交叉编译环境及AT91RM9200EK的引导攻略 - 嵌入式开发--蒹葭的专栏 - CSDNBlog
blog.csdn.net/flylonginsky/archive/2007/07/10/1684...
前言
今年1月份到2月份在自己博客上发表了几篇关于AT91RM9200引导程序的文章,分别是
建立交叉编译工具链
TFTP和NFS服务的设置
U-Boot1.1.4在AT91RM9200上的移植
时间过的很快,工作也很忙,一晃就过了半年多。再回头看,已经发现很多都落伍了。新版本出了一波又一波。linux已经到了2.6.20。federo也已经到了FC7。如果不对本人以前的文章更新的话,势必会误导初学者。所以针对目前比较新的环境,重新写下整个过程。不过,由于实在挺忙的,所以比第一次写的要简洁许多,大家如果有不明白的地方,可以参考以前的文章。大多数内容都大同小异,只不过一些细节需要注意。由于比较匆忙,没有仔细核对。如果您在文中发现有不当之处敬请批评指正。
这次使用的环境及软件源码版本如下:
软件环境
宿主机:FC6 ,虚拟机vmware 6.0
Linux-2.6.19.2 +at91patch
U-Boot 1.2 , busybox1.2.2.1(或者busybox-1.6.1)
硬件环境
母板:AT91RM9200EK
CPU:AT91RM9200 ,180MHz(200MIPS)
存储器:32M SDRAM(MT48LC8M16A2)
64Mbits Flash(SST39VF6401B)
USB接口:USB-Host USB-Device
网络接口: 10/100M DM9161E
DBGU串行调试接口
JTAG接口
使用ELDK4.1 构建交叉编译环境
1. 下载ELDK4.1的iso文件。在www.denx.de网站上可以找到。其有两个版本,一个是使用uclibc库,另一个使用libc库。建议使用uclibc,因为用uclibc库编译出来的二进制可执行文件要小许多。
#mkdir /mnt/iso
#mount –o loop ./arm-2007-01-22-uclibc.iso /mnt/iso
2. 安装ELDK,普通用户即可执行,无需根用户,只要保证普通用户有执行权限和拥有权限。
#mkdir /ELDK
#./install –d /ELDK
等待安装结束。
3. 设置环境变量
#PATH=$PATH:/ELDK/usr/bin (注意:$PATH与冒号之间无空格)
本人使用的板子是以EK板为母板设计的。他和DK板有一点不同。无论是Linux内核还是U-Boot,都对DK板做了很好的支持,对EK板没有相应的配置及修改文件。所以,本人针对EK板做修改。至于用DK板的朋友,就不用那么麻烦了。
Linux-2.6.19.2的移植
1. 首先下载2.6.19.2的内核源代码,同时要下载针对AT91RM9200的patch包。然后执行
# tar zxvf linux-2.6.19.tar.gz
#cp 2.6.19-at91.patch.gz linux-2.6.19
# cd linux-2.6.19
# zcat ./2.6.19-at91.patch.gz | patch -p1打补丁
2. 修改Makefile:
ARCH ?=arm
CROSS_COMPILE ?=/ELDK/usr/bin/arm-linux-修改Makefile,使交叉编译
3. 修改好之后进行编译。
# make mrproper
# make distclean
# make at91rm9200ek_defconfig
# make menuconfig
说明:这里大家会出现一个出现ics1523.c错误,原因是linux2.6.19.2里的EK默认配置将一个视频驱动编进去了,但是该驱动已经很老了。所以会出现错误。将device drivers->graphic support ->CONFIG_FB_S1D13XXX 去除,即能消除错误。
4. 修改其中Boot Options->Default Kernel Command String:
mem=32M console=ttyS0,115200 initrd=0x20410000,3145728 root=/dev/ram0 rw initrd=/linuxrc
最后#make 则在arch/arm/boot/下生成zImage内核映象文件。
U-Boot1.2在AT91RM9200EK板上的移植
1. 在Makefile中添加at91rm9200ek_config 编译项
2. 建立目录 board/at91rm9200ek
3. 将原目录at91rm9200dk里的文件拷到at91rm9200ek目录下
4. 参照前一篇文章“U-Boot1.1.4在AT91RM9200上的移植”,对文件进行修改
5. 针对at91rm9200ek,改at91rm9200ek.c里
gd->bd->bi_arch_number = MACH_TYPE_AT91RM9200EK;
不过,光这样还不行,光这样,EK板的机器类型码还不能传输到内核参数里。因为go只是执行普通的应用程序,不考虑到传递参数给内核。需要修改U-boot的common/cmd_boot.c的do_go()函数:
/*#if defined(CONFIG_I386)*/            <==注释掉
DECLARE_GLOBAL_DATA_PTR;   (在使用gd之前)
/*#endif*/                                        <==注释掉
....
#if !defined(CONFIG_NIOS)
/*******************add here*******************************/
if(argc==2)
rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number);
else
/*********************add end *****************************/
rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);
经过编译后一切OK,这样就大功告成了。完美的AT91RM9200EK启动程序就这样产生了,享受ARM带给你的乐趣吧。
使用Busybox制作Ramdisk根文件系统
这部分说难也不难,但是网上资料特别是中文资料奇少。因为很多人都是用现成的根文件系统,而不是自己做的。如果要自己做,会发现有很多问题没有考虑到。我也的确走了一些弯路。
Linux的根文件系统至少包含以下几个内容:
1. 基本的文件系统结构。包含一些必需的目录如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等
2. 基本程序运行所需的库函数,如glibc等
3. 必要的设备文件:如hd*,tty*等
4. 基本的配置文件:如rcS,inittab等
5. 基本的应用程序,如sh,ls,cp等
我们使用busybox来定制嵌入式的应用程序,从而可以运行ls,cp,mount 等shell命令,并且可以应用ftp,NFS等服务。之前选用busybox1.0.0,发现NFS不能使用,换成1.2.2.1之后,NFS可用。你可以从busybox官方网站下载busybox源代码包,解压缩,然后进行配置。
#tar xvfz busybox-1.2.2.1.tar.gz
#cd busybox-1.2.2.1
#make menuconfig
配置选项特别要注意几点:
1) Busybox Setting->General Configuration->show verbose applet usage messages
2) Build Options
[*] Build Busybox as a static binary (no shared libs)――这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作.
3) Install Options
[*] Don’t use /usr――注意必须选上。否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令
4) Linux System Utilities 选中mount ,支持NFS
5) Shells -> choose your default shell(ash)――注意:在这里我也犯了一个错误:就是defaultshell为none。结果启动后找不到shell解释程序。

6) Init要选中,否则没有linuxre以及初始化函数。
配置完成后,退出保存。
编译安装busybox
#make
#make install
编译好之后,在busybox目录下生成子目录_install,里面的内容:
drwxr-xr-x 2 root root 4096 12月 24 15:28 bin
lrwxrwxrwx 1 root root 11 12月 24 15:28 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 12月 24 15:28 sbin
其中可执行文件busybox在bin目录下,其它的都是指向他的符号链接。
7)修改Makefile ,使之用交叉编译工具链来编译。
一些开发调试必需的applet:nfs,ls,more,hostname,ip ,ifconfig,tftp,tee,dmesg,insmod,lsmod,mknode,find,grep,awk,vi等等
制作根文件系统
我们新建一个目录/mylinux/rootf作为我们的根文件系统目录。以后我们将向该目录陆续添加一些嵌入式Linux系统必需的文件以及目录,从而形成一个完整的嵌入式Linux根文件系统。
首先,我们将busybox下
创建必要的目录,建立必要的设备文件名,我们必须需要的设备有console ,tty,tty0,tty1,tty2,tty3,null,zero,loop0,loop1,cdrom,fd0,fd1,ram,ram0,ram1等。
需要的配置文件有/etc/init.d/rcS ,fstab等.
添加共享链接库
具体操作如下:
#cd /opt/croostool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu / arm-softfloat-linux-gnu/lib
#cp *-*.so /rootf/lib
# cp –d *.so.[*0-9] /rootfs/lib
我制作的根文件系统所有文件目录如下,其中/dev参考了atmel的原ramdisk文件系统:
bin
dev
etc
home
lib
ash
bunzip2
busybox
bzcat
cat
chmod
chown
clear
cp
cut
date
diff
dmesg
echo
egrep
fgrep
grep
gunzip
gzip
ip
ls
mesg
mkdir
mount
mv
ping
printf
pwd
rm
rmdir
sh
tar
telnet
test
tftp
umount
vi
who
zcat
cdrom
console
fb0
fd
fd0
fd1
full
hda
hda1
hda10
hda11
hda12
hda13
hda14
hda15
hda16
hda17
hda18
hda19
hda2
hda20
hda3
hda4
hda5
hda6
hda7
hda8
hda9
hdb
hdb1
hdb10
hdb11
hdb12
hdb13
hdb14
hdb2
hdb20
hdb3
kmem
loop0
loop1
mem
null
ram
ram0
ram1
ram2
ram3
ramdisk
random
shm
stderr
stdin
stdout
tty
tty0
tty1
tty2
tty3
tty4
ttySA0
ttySA1
ttySA2
urandom
zero
……
fstab
inetd.conf ld.so.conf
init.d—目录,其下包含rcS文件
ld-2.3.3.so
ld-linux.so.2
libanl-2.3.3.so
libanl.so.1
libBrokenLocale-2.3.3.so
libBrokenLocale.so.1
libc-2.3.3.so
libcrypt-2.3.3.so
libcrypt.so.1
libc.so.6
libdl-2.3.3.so
libdl.so.2
libgcc_s.so.1
libm-2.3.3.so
libm.so.6
libnsl-2.3.3.so
libnsl.so.1
libnss_compat-2.3.3.so
libnss_compat.so.2
libnss_dns-2.3.3.so
libnss_dns.so.2
libnss_files-2.3.3.so
libnss_files.so.2
libnss_hesiod-2.3.3.so
libnss_hesiod.so.2
libnss_nis-2.3.3.so
libnss_nisplus-2.3.3.so
libnss_nisplus.so.2
libnss_nis.so.2
libpthread-0.10.so
libpthread.so.0
libresolv-2.3.3.so
libresolv.so.2
librt-2.3.3.so
librt.so.1
libstdc++.so.6
libthread_db-1.0.so
libthread_db.so.1
libutil-2.3.3.so
libutil.so.1
linuxrc初始文件
mnt
proc
root
sbin
halt
httpd
ifconfig
inetd
init
losetup
mdev
pivot_root
poweroff
reboot
start-stop-daemon
telnetd
tmp
usr
var
work挂载点
制作ramdisk映象文件
写了制作映象文件的shell脚本,该脚本基于2.6内核:
#!/bin/sh
umount /mnt/loop
dd if=/dev/zero of=/mylinux/loop_tmp bs=1k count=3072>/dev/null
losetup /dev/loop0 /mylinux/loop_tmp
mke2fs -m 0 /dev/loop0 2>/dev/null
mount /dev/loop0 /mnt/loop -t ext2
cp -a /mylinux/rootf/* /mnt/loop/
umount /mnt/loop
生成的/mylinux/loop_tmp即为ramdisk映象文件。连同内核编译生成的zImage,拷贝到tftpboot/下,则arm板启动后自动下载这两个文件,并解压缩。最终成功在目标板上运行linux系统。
Trackback:http://tb.blog.csdn.net/TrackBack.aspx?PostId=1684472
用仿真器初始化的问题解决了有两种方法可以完成分别是使用setmem命令和fillmem命令
方法如下:
setmem 0x48000000 0x22111114 32
setmem 0x48000004 0x700 32
setmem 0x48000008 0x700 32
setmem 0x4800000c 0x700 32
setmem 0x48000010 0x700 32
setmem 0x48000014 0x700 32
setmem 0x48000018 0x700 32
setmem 0x4800001c 0x18705 32
setmem 0x48000020 0x18705 32
setmem 0x48000024 0x8E0459 32
setmem 0x48000028 0x10 32
setmem 0x4800002c 0x30 32
setmem 0x48000030 0x30 32
或者
fillmem 0x48000000 0x48000000 0x2211111432
fillmem 0x48000004 0x48000004 0x00000700 32
fillmem 0x48000008 0x48000008 0x00000700 32
fillmem 0x4800000c 0x4800000c 0x00000700 32
fillmem 0x48000010 0x48000010 0x00000700 32
fillmem 0x48000014 0x48000014 0x00000700 32
fillmem 0x48000018 0x48000018 0x00000700 32
fillmem 0x4800001c 0x4800001c 0x00018005 32
fillmem 0x48000020 0x48000020 0x00018005 32
fillmem 0x48000024 0x48000024 0x008e0459 32
fillmem 0x48000028 0x48000028 0x00000010 32
fillmem 0x4800002c 0x4800002c 0x00000030 32
fillmem 0x48000030 0x48000030 0x00000030 32
前一种方法于horseboss说的不同的是在每一命令行后面增加 “32”参数用来指明是32为操作
使用时发现配置寄存器不能采用直接修改的方法修改,只能用命令行的形似!不知道有没有这个问题,且每一次运行完命令时,都要全速运行一次程序,再停止后寄存器的值才能够被更新。
Bootloader/zh cn - OpenMoko
wiki.openmoko.org/wiki/U-boot/zh_cn#.E4.BD.BF.E7.9...
活用AXD Debugger调试器的命令行,实现u-boot的源代码级调试_八度空间
hi.baidu.com/andylgh/blog/item/114abf23a2035444ac3...
其实AXD的功能非常强大,特别是其命令行。
打开AXD,按下 Alt + L ,就可以打开一个命令行,
非常有用的命令如:
LoadBinary = 将一个文件导入SDRAM
LoadSymbols = 导入符号表
SetPC = 设置PC寄存器
Run = 开始运行
OB + 文件名 = 按照批处理文件运行
所有的命令在GUI里面也是有的,可以利用批处理文件(OB命令)来免去敲命令和点菜单的麻烦,
以调试u-boot为例,写一个批处理文件放在D盘,文件名为u-boot.txt,内容如下:
loadbinary Y:\u-boot-1.1.4\u-boot.bin 0x00100000
loadsymbols Y:\u-boot-1.1.4\u-boot.axf
setpc 0x00100000
run
打开AXD,按下ALT+L,键盘输入:ob d:\u-boot.txt
那么AXD会自动运行批处理文件内的命令,自动载入u-boot的二进制代码,自动载入符号表,设置指针为0x00100000,并开始运行,如果在AXD中断运行,会自动显示源代码! cool~~!
如果有命令不清楚的话,在命令行下,输入 help ,可以打开帮助文件!
gdb-jtag-arm
gdb-jtag-arm.sourceforge.net/
gdb-jtag-arm: GDB Stub for ARMs JTAG interface
Short description
GDB Remote Stub Backend for debugging an embedded ARM system via JTAG common hardware debug interface. Communication is done via standard TCP/IP GDB Remote Serial Protocol.
Long description
Most ARM processors found in embedded application have a JTAG interface, for debugging hardware and software while the system is running. ARM processors can be found in almost all hardware routers and a lot of mobil phones.
On the other end, there is the GNU Debugger GDB. It is available with comfortable graphical frontends, like Insight from RedHat. GDB usually debugs a running or new process on the local system. But it is also possible to connect to a remotely running GDB stub on another host, where the actual program to be debugged runs.
The protocol for this remote connections is documented as GDB Remote Serial Protocol. Most commands are pretty simple: read/write registers/memory, halt, continue, set break-/watchpoints.
The goal of this program was to write an GDB Stub for interfacing with the JTAG interface to debug a running system. It is already finished and should be made public via sourceforge. I few minor bugs are known, but work is already in progress.
The project is based on jtag-arm9, also hosted by sourceforge, but longer unmaintained. As I wasn't able to contact the jtag-arm9 author and IMO projects cannot be renamed to a more suitable name for the new functionality, I ask for registering this project as gdb-jtag-arm.
A frontend is publicly available in source and binary versions by macraigor systems and will be put on the new project page then:http://www.macraigor.com/full_gnu.htm
Implementation
The used hardware interface is known as wiggler interface. A line driver IC (74244) connects the printer port with the jtag interface. The circuit can easily be build on a breadboard. There are alsoeagle layouts available.
The software is written in highly modular C. There are modules for:
the parallel port interface
the state machine, jtag and scan chain functions
the EmbeddedICE macrocell programming
the debugging and register functions
the memory functions and
the LPEC P2001 specific functions.
The command line tool jtag-arm consists on a command line parser, which is compatible with jtag-arm9. The gdb remote stub is therefore named gdb-jtag-arm. History
Tobias Lorenz and Lars-Kristian Klauske were both computer engineering students of the Technical University of Berlin, Germany. There diploma thesis was porting ucLinux 2.6 to the ARM9TDMI based microcontroller P2001 of the MAZ Brandenburg GmbH, Germany. As precondition they needed a debug environment and a network bootloader.
The debug environment, which is published with this SourceForge project gdb-jtag-arm, was developed till april 2004.
The porting of the network bootloader Etherboot to ARMNOMMU let to the new version 5.4. Tobias Lorenz is now the registered maintainer of the ARMNOMMU architeture and the P2001 machine in Etherboot. He is also registered maintainer of the P2001 machine in Linux. He is still working with Hyok S. Choi (armnommu maintainer) on inclusion in the official kernel.
References
MAZ Brandenburg GmbH LPEC-P2001
Jtag-Arm9
Macraigor Systems GNU Tools
Homepage of Tobias Lorenz
The gdb-jtag-arm is documentated aspart of Tobias Lorenz's diploma thesis (pages 80-95, german). The complete diploma thesis is available upon request.
© 2005Tobias Lorenz

博客:中国电子工程网,电子工程师的家园!
space.ee365.cn/index.php
阿K@空间--ARM板上构造gdb +gdbserver调试环境
www.ds9ok.com/oblog/more.asp?name=kwiner&id=178
S3C2410 ARM板上构造gdb +gdbserver调试环境
远程调试环境由宿主机gdb和目标机调试stub共同构成,两者通过串口或TCP连接。使用GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。
就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:
用ROMMonitor调试目标机程序、
用KGDB调试系统内核
用gdbserver调试用户空间程序。
这三种调试方法的区别主要在于,目标机远程调试stub的存在形式的不同,而其设计思路和实现方法则是大致相同的。
而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。Gdbserver在目标系统中运行,gdb则在宿主机上运行。
目标系统必须包括gdbserver程序,宿主机也必须安装gdb程序。一般linux发行版中都有一个可以运行的gdb,但开发人员不能直接使用该发行版中的gdb来做远程调试,而要获取gdb的源代码包,针对arm平台作一个简单配置,重新编译得到相应gdb如armv4l-unknown-linux-gdb  。
1.source compile
download  from http://cygwin.mirrors.pair.com/gdb/old-releases/
$ tar jxf gdb-5.2.1.tar.bz2
$ cd gdb-5.2.1
$ mkdir obj
$ cd obj
../configure --target=armv4l-unknown-linux \
--enable-shared --prefix=/tmp/g \
--without-x --disable-gdbtk --disable-tui \
--without-included-regex --without-included-gettext
$ make
$ make install
$ mkdir gdb/gdbserver
$ cd gdb/gdbserver
$ chmod +x ../../../gdb/gdbserver/configure
$ CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc \
../../../gdb/gdbserver/configure armv4l-unknown-linux \
--without-included-regex --without-included-gettext
$ make
$ cp -vf gdbreplay gdbserver /tmp/g/bin
2.remote debugging
o cp  gdbserver from  host  to  target machine
o target machine
gdbserver 59.69.74.87:2345 hello
出现
Process hello created; pid = 68
o host
/tmp/g/bin/armv4l-unknown-linux-gdb hello
(gdb) b main
(gdb) target remote 203.239.30.207:2345
出现 Remote debugging using 59.69.75.186:2345
0x40002a00 in ?? ()
(gdb) c  //相当于主机gdb的run命令
此时目标机上出现
Remote debugging from host 59.69.74.87
hello,world
连接成功后,这时候就可以输入各种gdb命令如list、run、next、step、break等进行程序调试了。
调试结束出现
Child exited with retcode = 0
Child exited with status 236
GDBserver exiting
说明:
1)目标机上的被调试程序hello, 与主机上的程序hello, 是相同的程序, 但位置不一样,并非是用网络共享的同一个位置的同一个文件, 一个在目标机上 ,一个在主机上, 没有关系.
2) host ip  : 59.69.74.87
target  2410  ip is  59.69.75.186
都是局域网ip.
Index of ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain
ftp.arm.linux.org.uk/pub/armlinux/toolchain/
ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain
ARM GCC
交叉编译
ARM开发软件及实用工具介绍
www.dzkf.cn/html/qianrushixitong/2006/0721/36.html
一、编译器介绍
1、ADS1.2
ADS是ARM公司的集成开发环境软件,他的功能非常强大。他的前身是SDT,SDT是ARM公司几年前的开发环境软件,目前SDT早已经不再升级。ADS包括了四个模块分别是:SIMULATOR;C 编译器;实时调试器;应用函数库。
ADS 的编译器调试器较SDT都有了非常大的改观, ADS1.2提供完整的WINDOWS界面开发环境。C编译器效率极高,支持c 以及c++,使工程师可以很方便的使用C语言进行开发。提供软件模拟仿真功能,使没有Emulators的学习者也能够熟悉ARM的指令系统。配合FFT -ICE使用,ADS1.2提供强大的实时调试跟踪功能,片内运行情况尽在掌握。ADS1.2需要硬件支持才能发挥强大功能。目前支持的硬件调试器有 Multi-ICE以及兼容Multi-ICE的调试工具如FFT-ICE。而简易下载电缆不能支持ADS1.2
版本:ADS1.2
软件大小:130M
2、ARM REALVIEW DEVELOPER SUITE
RealView Developer Suite工具是ARM公司是推出的新一代ARM集成开发工具。支持所有ARM 系列核,并与众多第三方实时操作系统及工具商合作简化开发流程。开发工具包含以下组件:
完全优化的ISO C/C++编译器
C++ 标准模板库
强大的宏编译器
支持代码和数据复杂存储器布局的连接器
可选 GUI调试器
基于命令行的符号调试器(armsd)
指令集仿真器
生成无格式二进制工具、Intel 32位和Motorola 32位ROM映像代码的指令集模拟工具
库创建工具
内容丰富的在线文档
官方网址:www.arm.com/products/DevTools/RealViewDevSuite.html
版本:ARM.RealView.Developer2.2
软件大小:500M
3、IAR EWARM
Embedded Workbench for ARM 是IAR Systems 公司为ARM 微处理器开发的一个集成开发环境(下面简称IAR EWARM)。比较其他的ARM 开发环境,IAR EWARM 具有入门容易、使用方便和代码紧凑等特点。
IAR Systems 公司目前推出的最新版本是IAR Embedded Workbench for ARM version 4.30。这里提供的是32k 代码限制、但没有时间限制的Kickstart版。
EWARM 中包含一个全软件的模拟程序(simulator)。用户不需要任何硬件支持就可以模拟各种ARM 内核、外部设备甚至中断的软件运行环境。从中可以了解和评估IAR EWARM 的功能和使用方法。
IAR EWARM 的主要特点如下:
高度优化的IAR ARM C/C++ Compiler
IAR ARM Assembler
一个通用的IAR XLINK Linker
IAR XAR 和XLIB 建库程序和IAR DLIB C/C++运行库
功能强大的编辑器
项目管理器
命令行实用程序
IAR C-SPY 调试器(先进的高级语言调试器
版本:IAR EWARM 4.40a
软件大小:93M
4、KEIL ARM-MDKARM
Keil uVision调试器可以帮助用户准确地调试ARM器件的片内外围功能(I2C、 CAN、UART、SPI、中断、I/O口、A/D转换器、D/A转换器和PWM模块等功能)。ULINK USB-JTAG转换器将PC机的USB端口与用户的目标硬件相连(通过JTAG或OCD),使用户可在目标硬件上调试代码。通过使用Keil uVision IDE/调试器和ULINK USB-JTAG转换器,用户可以很方便地编辑、下载和在实际的目标硬件上测试嵌入的程序。
支持Philips、Samsung、 Atmel、 Analog Devices、 Sharp、 ST等众多厂商ARM7内核的ARM微控制器。
高效工程管理的uVision3集成开发环境
Project/Target/Group/File的重叠管理模式,并可逐级设置;
高度智能彩色语法显示;
支持编辑状态的断点设置,并在仿真状态下有效。
高速ARM指令/外设模拟器
高效模拟算法缩短大型软件的模拟时间;
软件模拟进程中允许建立外部输入信号;
独特的工具窗口,可快速查看寄存器和方便配置外设;
支持C调试描述语言,可建立与实际硬件高度吻合的仿真平台;
支持简单/条件/逻辑表达式/存储区读写/地址范围等断点。
多种流行编译工具选择
Keil高效率C编译器;
ARM公司的ADS/RealView 编译器;
GNU GCC 编译器;
后续厂商的编译器。
官方网址:www.keil.com
版本: MDKARM V3.10A
软件大小:53M
5、WINARM (GCCARM)
WINARM  是一个免费的开发工具。
WinARM 可以在http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/ 下载得到,里面除了包含 C/C++ 编译器——GCC,汇编、连接器——Binutils,调试器——GDB等工具,也包括了通过 GDB 使用 Wiggler JTAG 的软件——OCDRemote。所以,所需要的工具都包括在了这个 WinARM 发行版中,就可以比较省心了。
官方发布网址:http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/
软件大小:90M
二、相关开发工具介绍
1、简易的JTAG制作:
/html/dianziDIY/2006/0814/305.html
2、H-JTAG调试代理
H-JTAG是一个免费的ARM调试代理,程序没有任何限制,希望能给ARM的爱好者提供一个简单实用的学习工具。欢迎访问作者的BLOG:http://twentyone.blogchina.comblog提供了安装程序的下载,同时,也提供了常见的Q&A.
支持ARM7/ARM9,支持自动检测和手动指定内核
使用RDI接口,支持SDT,ADS,REALVIEW和IAR
支持ADS1.2和SDT2.51和RREAL VIEW
支持个硬件断点或者数量不限的软件断点
支持ARM/THUMB模式
支持LITTLEENDIAN & BIGENDIAN
支持SEMIHOSTING
支持WIGGLER SDTJTAG和自定义接口
3、LPC2000系列ISP工具
a、飞利普官方网站下载工具
b、
4、Macraigor Systems Wiggler 调试工具
5、J-LINK
IAR公司的J-LINK是一款小巧的ARM JTAG硬件调试器,它是通过USB口与PC机相连。IAR的J-LINK与该公司的嵌入式开发平台紧密结合,且完全支持即插即用。
主要特征:
支持所有ARM7和ARM9
下载速度高达600KB/sec
无需电源供电,可直接通过USB取电
JTAG速度是8MHz
自动辨速
监控所有的JTAG管脚信号,测量电压
20pin标准JTAG连接器
配带USB口和20pin插槽
支持Windows 2000 和Windows XP
更强的几点:
1、支持ADS,KEIL,IAR,WINARM,RV等几乎所有开发环境;并且可以和IAR无缝连接
2、支持FLASH软件断点,可以设置2个以上断点(无限个断点),极大的提高调试效率;
3、带J-Link TCP/IP server,允许通过TCP/ IP 网络使用J-Link
4、支持几乎所有ARM7,ARM9,暂时不支持XSCALE;
* ARM7TDMI(Rev 1)
* ARM7TDMI(Rev 3)
* ARM7TDMI-S(Rev 4)
* ARM720T
* ARM920T
* ARM926EJ-S
* ARM946E-S
官方网站:http://www.segger.com/
6、U-LINK
ARM7 TDMI结构的Keil开发套件采用最新设计的超豪华uVision3集成开发环境,内嵌C编译器/汇编器/工程管理器/调试器等功能功能模块,是一款稳定/可靠/高效的开发工具,适用于不同层次的的用户,完全满足从专业的应用开发工程师到初学嵌入式软件开发的学生的所有使用要求。类似于8051的智能平台将大幅度缩短您的开发周期,各大半导体厂商的所有ARM型号将逐一得到全面支持。
Keil uVision调试器可以帮助用户准确地调试ARM器件的片内外围功能(I2C、 CAN、UART、SPI、中断、I/O口、A/D转换器、D/A转换器和PWM模块等功能)。ULINK USB-JTAG转换器将PC机的USB端口与用户的目标硬件相连(通过JTAG或OCD),使用户可在目标硬件上调试代码。通过使用Keil uVision IDE/调试器和ULINK USB-JTAG转换器,用户可以很方便地编辑、下载和在实际的目标硬件上测试嵌入的程序。
支持Philips、Samsung、 Atmel、 Analog Devices、 Sharp、 ST等众多厂商ARM7内核的ARM微控制器。
高效工程管理的uVision3集成开发环境
Project/Target/Group/File的重叠管理模式,并可逐级设置;
高度智能彩色语法显示;
支持编辑状态的断点设置,并在仿真状态下有效。
高速ARM指令/外设模拟器
高效模拟算法缩短大型软件的模拟时间;
软件模拟进程中允许建立外部输入信号;
独特的工具窗口,可快速查看寄存器和方便配置外设;
支持C调试描述语言,可建立与实际硬件高度吻合的仿真平台;
支持简单/条件/逻辑表达式/存储区读写/地址范围等断点。
多种流行编译工具选择
Keil高效率C编译器;
ARM公司的ADS/RealView 编译器;
GNU GCC 编译器;
后续厂商的编译器。
JTAG仿真器ULINK
* USB通讯接口高速下载用户代码;
* 存储区域/寄存器查看;
* 快速单步程序运行;
* 多种程序断点;
* 片内Flash编程 。
官方网站:http://www.keil.com/ulink
VxWorks LPC2104 BSP ARM
摘要:在新的目标板上安装VxWorks的过程极具挑战性。本文较详细地介绍基于LPC2104的ARM开发板的BSP设计方法,并给出源代码。
关键词:VxWorks LPC2104 BSP ARM
VxWorks 是一种商用嵌入式实时操作系统(RTOS)多年来,风河公司为用户提供了一系列广泛的板级支持包(BSP)。但是,随着CPU的发展,用户自己设计的硬件平台越来越多,分散性越来越大,因此介于硬件平台和操作系统之间的BSP的自主设备也日益紧迫。EasyARM开发板是广州周立功单片机有限公司开发的基于飞利浦LPC2104型ARM7TDMI芯片的低价位学习板,具有128KB的Flash,16KB的RAM,满足VxWorks运行的最低要求。
1 格式说明及格式转换程序的制作
Tornado产生的目标代码的默认格式是Motorola开发板的Flash下载工具只能下载Intel 32bit格式。必须将它们进行转换才能将代码写入到Flash中去。下面以Motorola的S2格式为例说明格式的转换。
S2的一种实际格式如下:
S0120000626F6F74726F6D5F726532E686578CF
S214000000060000EABD0300EAA50300EAB70300EA1B
S804000000FB
其中第一条是记录的头部。第二条是地址和对应的数据记录,S2表示24位地址的格式,14表示起始地址000000和对应的数据及奇偶效验对的总和。最后两位表示所有十六进制数对的校验和。最后一条是记录的结束标志。
Intel 32 bit的一种实际格式如下:
:020000040000FA
:10000000060000EABD0300EABB50300EAB70300EA20
…………
:00000001FF
其中第一条是记录的头部,表示32位地址的高16位为0000。在第二条记录中,:表示记录的开始,10表示记录对的个数,0000表示起始地址的值,最后两位表示校验和。最后一条是记录的结束标志。
了解这两种格式后,编写格式转换程序就是很简单的一件事件。
2 BSP的设计过程及软件仿真方法
2.1 驻留ROM/Flash的系统各段分配情况
由于LPC2104只有16KB的RAM,故只能程序代码和数据放在Flash中,开机后再将数据拷贝到RAM内,而程序依然放在Flash中并在其中运行,即所谓的ROM Resident Image设计。在Tornado集成开发环境下,选取templatARM的BSP生成的bootrom_res.hex文件就是这种 ROM_Resident文件,其代码段、数据段、堆栈段分别在Flash和RAM中的情况如图1。
Flash的分配和对应常量的定义
片内Flash的地址空间为0x00000000~0x00020000
ROM_TEXT_ADRS=00000000代码段的起始地址
ROM_SIZE=00020000 Flash的大小
RAM的分配和对应常量的定义
片内RAM的地址空间为0x40000000~0x40003FFF
0x40000000~0x4000003F共64字节,放中断向量表LOCAL_MEM_LOCAL_ADRS=0x400000000
RAM_LOW_ADRS=0x40000600
RAM_HIGH_ADRS=0x40000F00
LOCAL_MEM_SIZE=0x00020000
根据上面的分析,修改Makefile和config.h中相应的部分,使两者一样。
堆栈的分配
堆栈的地址设为STACK_ADRS,由系统定义,从RAM_LOW_ADRS开始向下伸展。
2.2 romlnit.s文件
ARM的异常向量表如表1。LPC2104的异常向量表也一样,只不过它可以重新映射到RAM的头部,即从0x40000000开始的32个字节。
表1 ARM异常向量位置
地 址 异 常
0x0000 0000 复位
0x0000 0004 未定义指令
0x0000 0008 软件中断
0x0000 000C 预取指中止(从存储器取指出错)
0x0000 0010 数据中止(数据访问存储器出错)
0x0000 0014 保留
0x0000 0018 IRQ
0x0000 001C FIQ
*在ARM文档中标识为保留,该位置被Boot装载程序用作者有效的用户程序关键字。
基于ARM体系结构的VxWorks的其中四个异常入口函数为:excEnterUndef、ecxEnterSwi、excEnterPrefetchAbort、excEnterDataAbort。直接在对应的位置用B指令跳到对应的函数中即可。代码如下:_ARM_FUNCTION(romInit)
_romInit:
ARM的异常向量表如表1。LPC2104的异常向量表也一样,只不过它可以重新映射到RAM的头部,即从0x40000000开始的32个字节。
基于ARM体系结构的VxWorks的其中四个异常入口函数为:excEnterUndef、excEnterSwi、excEnterPrefetchAbort、excEnterDataAbort。直接在对应的位置用B指令跳到对应的函数中即可。代码如下:
_ARM_FUNCTION(romInit)
_romInit:
cold:
B start /*复位异常*/
B excEnterUndef /*未定义异常 */
B excEnterSwi /*软中断*/
B excEnterPreftchAbort/*予取指异常*/
B excEnterDataAbort /*数据异常*/
.ascii "20B9" /*保留空间,由格式转换程序超填入0xB9205F80*/
LDR pc,[pc,#-0xFF0]/*IRQ中断入口函数*/
B FIQ_Hander /*FIQ中断入口函数*/
IRQ中断函数的入口函数是C语言写的sysClkInt()和sysAuxClkInt(),需要自己保存现场和恢复现场,代码为:
_ARM_FUNCTION(TIME0_IRQ_Hander)
_TIME0_IRQ_Hander:
SUB LR,LR,#4 /*计算返回地址*/
STMFD SP!,{R0-R11,R12,LR} /*保存任务环境*/
MRS R3,SPSR /*保存状态*/
STMFD SP!,{R3}
BL sysClkInt /*调用C语言的中断处理程序*/
LDMFD SP!,{R3}
MSR SPSR_cxsf,R3
LDMFD SP!,{R0-R11,R12,PC}
_ARM_FUNCTION(TIME1_IRQ_Hander)
_TIME1_IRQ_Hander:
SUB LR,LR,#4 /*计算返回地址*/
STMFD SP!,{R0-R11,R12,LR} /*保存任务环境*/
MRS R3,SPSR /*保存状态*/
STMFD SP!,{R3}
BL sysAuxClkInt /*调用C语言的中断处理程序*/
LDMFD SP!,{R3}
MSR SPSR_cxsf,R3
LDMFD SP!,{R0-R11,R12,PC}
快速中断函数VxWorks不用由用户自己定义。其框架如下:其中FIQ_Exception()函数由C语言定义,在文件开始用globl FUNC(FIQ_Exception)声明。
FIQ_Hander:
STMFD SP!,{R0-R12,LR}
BL FIQ_Exception
LDMFD SP!,{R0-R12,LR}
SUBS PC,LR,#4
当系统上电时,如果地址0x00000014内的数据是0xB9205F80,则从Flash的零地址开始执行,也就是执行romInit()函数。此函数将启动方式BOOT_COLD放在R0中,作为romStart的参数,将系统设为SVC32模式,并禁止IRQ和FIR中断,设置好系统堆栈指针跳到 romStart()执行。验证此部分程序执行情况的最简单的一种方法是用汇编写一段点灯程序,用以指令程序的执行情况。其中常量PINSEL0、 PINSEL1、IODIR、SPI_IOCON可以头文件templatARM.h中用define定义。
#define PINSEL0 0xE002C000
#define PINSEL1 0xE002C004
#define IODIR 0xE0028008
#define SPI_IOCON 0x00003DD0
我们设计的点灯程序如下。将其放在romInit.s适当的位置,可以定位程序的运行情况。
LDR r0,=PINSEL0
MOV r1,#0
STR r1,[R0],#4
STR r1,[R0]
LDR r0,=PINSEL1
MOV r1,#0
STR r1,[R0],#4
STR r1,[R0]
LDR r0,=IODIR
LDR r1,SPI_IOCON
STR r1,[R0]
在Tornado集成开发环境下,templatARM的BSP生成bootrom_res.bin文件后,可以借助ASD1.2的AXD反汇编调方式器进行单步仿真和调试。
2.3 sysLib.c文件
在这个文件中,主要是在sysHwInit()函数内实现系统外设的配置,中断向量表的拷贝和重映射,系统定时器中断向量的安装,串口初始化等功能。在串口还没有调通之前,可以借助上面提到的简单点灯函数实现程序的定位。其用C语言重新定义如下(将它插入本文件的适当地址,可以指示各个函数的执行情况):
#include “LPC2106.h”
PINSEL0=0x00000000;
PINSEL1=0x00000000;
IODIR=0x00003DD0;
系统的初始化和配置与硬件系统高度相关。对这部分的代码不作过多的解释,请参看代码注释。几个常量定义如下:
#define Fosc 11059200 /*晶振频率,10MHz~25MHz应与实际一致*/
#define Fcclk(Fosc *4)
/*系统频率,必须为Fosc的整数倍(1~32),且<=60MHz*/
#define Fcco (Fosc *4)
/*CCO频率,必须为Fcclk的1、2、4、8倍,范围为156MHz~320MHz*/
#define Fpclk (Fcclk/4)*2
/*VPB时钟频率,只能为(Fcclk/4)的1、2、4倍*/
2.4 templateTimer.c文件
本文件主要实现与系统时钟和系统辅助时钟相关的函数。关于系统时钟的各函数定义如下(系统辅助时钟的各函数与系统时钟一样,只须将T0换成T1即可):
/*SysClkInt(),此函数每个时钟Tick被调用一次*/
void sysClkInt(void){
/*通知系统中断结束*/
T0IR=0x01;
T0MR0 =(Fpclk/sysClkTicksPerSecond);
VICVectAddr=0;
/*调用系统中断函数*/
if(sysClkRoutine!=NULL)
(*sysClkRoutine)(sysClkArg);
}
/*sysClkDisable()禁止系统时钟*/
void sysClkDisable(void){
if(sysClkRunning){
/*禁止系统时钟中断*/
VICIntEnClr=0x10;
T0TC=0;
SysClkRunning=FLASE;
}
}
/*sysClkEnable()启动系统时钟*/
void sysClkEnable(void){
static BOOL connected=FALSE;
if(!connected){
/*定时器0初始化*/
T0TC=0;
T0TCR=0x01;
T0MCR=0x01;
T0MR0=(Fpclk/sysClkTicksPerSecond);
VICIntEnable=0x10;
Connected=TRUE;
}
if(!sysClkRunning){
T0TC=0;
sysClkRunning=TRUE;
}
}
3 应用程序设计
由于EasyARM开发板本身资源较少,不可能与PC机连接成宿主机一目标机的调试环境,通过主机将代码下载到目标机再执行。因此在设计应用程序时,可以修改bootConfig.c文件中的bootCmdLoop()函数,生成bootrom_res.hex文件,格式转换后,下载到Flash中运行,在 PC机上借助串口调试助手打印调试信息。具体过程是:在Tornado2.2集成开发环境下选取Build->Build Boot Rom,BSP选定templateARM,Image选定bootrom_res.hex,编译器选gnu,确认即可。
4 小结
VxWorks 所需要的唯一的驱动程序是系统时钟,本文详细给出了系统时钟源代码,同时还给出了串口通信的源代码,使得开发板与PC机能正常通信。另外,给出了基于 VxWorks的应用程序的设计方法。由于BSP的设计本身就是一件很具有挑战性的工作,相信本文对VxWorks的BSP设计得有所帮助。