NAND 的初始化 : 环境变量 :env_relocate () 环境变量从哪里来 : 以上经过如下 : 分析 :uboot 启动内核 : 从 flash 上读出内核 启动 即 : UBOO

Size: px
Start display at page:

Download "NAND 的初始化 : 环境变量 :env_relocate () 环境变量从哪里来 : 以上经过如下 : 分析 :uboot 启动内核 : 从 flash 上读出内核 启动 即 : UBOO"

Transcription

1 网名 鱼树 的学员聂龙浩, 学习 韦东山 Linux 视频第 2 期 时所写的笔记很详细, 供大家参考 也许有错漏, 请自行分辨 目录 UBOOT 配置过程 先创建了链接文件 : 创建 config.mk 这个文件 : 创建开发板相关的头文件 : UBOOT 编译过程 举例说明 : 总结 : UBOOT 命令实现 按上面的分析, 增加一个 hello 命令, 使其打印 hello world: 按 Cmd_bootm.c 中的结构来写 在 Cmd_bootm.c 中有 : 仿照着定义一个 U_BOOT_CMD 宏 (Cmd_bootm.c 有类似的 ) 总结 : UBOOT 第一阶段系统初始化 硬件相关初始化 : 初始化 : 若程序很大, 还要将程序从 NAND 拷贝到 SDRAM 中去 要设置栈 (sp), 因为要调用 C 函数时, 必须用到栈 UBOOT 运行的第一个文件是 :cpu/arm920t/start.s( 从程序的链接脚本中知道 ). 28 下面是 Clock_init 函数 ( 初始化时钟 ): 以上过程如下 : uboot 第二阶段 从 flash 拷贝代码到 SDRAM 中的函数 : 判断从 NOR 还是 NAND 启动 : 第二阶段启动内核过程 单板初始化 : 要从 FLASH 读出内核 : Board.c 中有如下初始化 :... 44

2 NAND 的初始化 : 环境变量 :env_relocate () 环境变量从哪里来 : 以上经过如下 : 分析 :uboot 启动内核 : 从 flash 上读出内核 启动 即 : UBOOT 基本命令 一, 下载文件 : , 通过 TFTP 下载文件 : ,loadb : 通过串口下载二进制文件 二, 内存操作 : , 显示内存内容 : , 修改内存中内容 : 三,Flash 操作 : ,flinfo 查看 FLASH 盲区信息 : , protect Flash 写保护 : ,erase 擦除 flash 扇区 : ,cp 数据拷贝 : , 程序的执行 : 四, 开发板信息 : ,bdinfo : 显示开发板信息 五, 自动启动 : , 设置自动启动 : 如要烧写一个测试程序, 可以如下 : , 烧写内核 : , 文件系统 : U-BOOT 的常用命令详解 : bootm bootp cmp cp crc echo erase flinfo go minfo loadb loads mw nfs... 61

3 15 nm printenv protect rarpboot run setenv sleep tftpboot NFS: 下载内核与挂载文件系统 一 系统网卡设置 : , 还回口 : , 以太网接口 : 二,LINUX 中 NFS 支持设置 : ,IP 地址的设置 : , 安装 NFS : , 配置 NFS 挂载环境 :Vim /etc/exports , 重启 NFS 服务 : 开启 NFS 服务并关闭系统防火墙 , 测试挂载共享目录的状态 : ,UBOOT 下载内核 : , 通过 "UBOOT" 下载 uimage linux 内核 : , 开发板 UBOOT 挂接 NFS 文件系统 : 三, 可能遇到的问题 : , NETDEV WATCHDOG: eth0: transmit timed out 错误 ( 网卡已工作了 ): 一, 由于我用的并不 100ask 的标准 2440 开发板, 所以曾经遇到过的错误 : 二, 设置 NFS 挂载 : 三, 配置 UBOOT 内核启动方式 :... 72

4 UBOOT 配置过程 单片机程序 UBOOT 补丁文件中修改过的代码表示 : --- 表示是原来代码 ,0 - 表示没有修改过的代码 ; + 表示修改后的代码原来代码的从 34 行始, 往下共 6 行 修改之后的代码也是从 34 行始, 但修改完后是往下 8 行 原来的 6 行是 1,2,3,6,7,8 行 中间 4,5 两行前面有 + 表示增加的内容 补丁打到哪里去 : 显示是打到 u-boot-1.1.6/cpu/arm920t/s3c24x0/speed.c 这个原代码中去 打补丁时一般已经是进到 u-boot 这个目录下了, 所以 path 时便忽略去目录 u-boot 用到参数 -p1 是指忽略去第一个 / UBOOT 命令 : print : 打印出环境变量 set bootdelay 10 : 设置 倒数计时 为 10 秒 加 save 命令保存,reset 重启后可见到 倒数计时 UBOOT 目标是启动内核 : 从 flash 上读出内核到 SDRAM 中去 启动内核 硬件相关的初始化 : 关 看门狗 初始化时钟 初始化 SDRAM 从 FLASH 读出内核 启动内核 增强功能 : 烧写 FLASH( 从网卡或从 USB) 串口 ( 通过串口写命令 ) 1, 读 flash: 2, 初始化 SDRAM: 初始化时钟, 单板上电后是以 12M 运行的 ( 晶振为 12M) 初始化串口 为开发方便要写 flash 功能 ( 通过网络或 USB 烧镜像到单板上 ).

5 3, 启动内核 : UBOOT 的源码中的 README 中说要先配置再编译 1. 先配置 make xx_config: 在 Makefile 中搜索 100ask24x0_config 2.make make 100ask24x0_config 时相当于执行 $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0 将其中的变量替换出来 : 是指 make 时不输出 make 信息 ( 开头, 则 该行命令的输出被抑制 ) $(MKCONFIG) 变量表示 MKCONFIG 的 mkconfig 文件 ) := $(SRCTREE)/mkconfig( 从名字上知是源码树下 确实有这个文件 这时上面就变成 : mkconfig $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0 $@ 是指表示目标, 即 :100ask24x0_config _config= 就替掉换 $@ 目标中 _config 这部分为空 (_config= 后是空 ) 则 $(@:_config=) 就表示 100ask24x0 变量中有个高级用法,$(var:a=b), 意思为把变量 var 中所有 a 字串结尾的 a 替换成 b 字串 由上推断 :$@=smdk2410_config, "_config=" 意为 _config 等于空字符, 也就相当于把 _config 结尾的字符串用空字符替代, 即删除 就是将 $@ 中的 _config 替换为空, 也就是删掉目标中 _config 这个子串 这样整体就变成 mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0 则最后 : make 100ask24x0_config 便相当于执行下面这个脚本 : mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0 打开 mkconfig shell 脚本文件 :

6 这是分析它 ( 指 mkconfig 传进来的参数 ) 传入的参数 1, 有没有 --,-a,-n 或 * 参看脚本命令和参数发现都没有, 则这 8 行可以去掉 mkconfig 100ask24x0_config arm arm920t 100ask24x0 NULL s3c24x0 参 0($0) 参 1($1) 参 2($2) 参 3($3) 参 4($4) 参 5($5) 参 6($6) ===> 相当于 BOARD_NAME=100ask24x0 如果 BOARD_NAME 已经定义了 就不执行 BOARD_NAME="$1" 若没定义则执行 BOARD_NAME="$1 或 的关系 而之前 可见 BOARD_NAME 是空的, 故这里执行 :BOARD_NAME="$1" LINUX 脚本中, 用 $0 表示第一个参数或命令 $# 表示参数的个数 这里除去命令外, 看上面参数是 6 个 ($1-6). 这里是说参数小于 4 个 则退出, 参数大于 6 个也是退出 mkconfig 100ask24x0_config arm arm920t 100ask24x0 NULL s3c24x0 这是我们的命令和参数, 显然不会退出 故这两条也可以去除 接着打印一句话 : 在终端操作时可见 :

7 "$SRCTREE"!= "$OBJTREE" 源码树与 OBJ 树是否相等 从 Makefile 中可知相等 : OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) 意思是 : 若定义了 BUILD_DIR 则 OBJTREE 就等于 BUILD_DIR, 若没定义 BUILD_DIR, 则 OBJTREE 等于 当前目录 CURDIR ( 当前目录 ) 而在 Makefile 中,BUILD_DIR 没定义 : 是在命令行中定义 这里使用了函数 origin 它只是获取此变量 ( 参数 ) 相关的信息, 告诉我们这个变量的出 处 ( 定义方式 ) 函数 origin 返回值有几种, 若返回是 command line 时, 表示 origin 的变量 VARIABLE 在命令行中定义 这里表示变量 o 是在 命令行 中定义 所以上面 OBJTREE" 等于 CURDIR ; 而 SRCTREE 也等于 CURDIR 则这里因为二者相等 "$SRCTREE"!= "$OBJTREE" 是不成立的 则执行 else 分支 进入 UBOOT 当前的 include 目录删除 asm 文件 最后做一个 链接 文件, 链接文件叫 asm $2 是 arm ln -s asm-arm asm 链接文件 asm 指向 asm-arm.

8 make 100ask24x0_config 后的 UBOOT 源码中确实如下做了链接 include 目录下有很多 asm 不同架构的目录 这样临时生成的原因是避免每次都要配置 如 #inclue <asm-arm/type.h> 是包含 arm 下的 type.h 头文件, 若是 #include <asm-i386/type.h> 是包含 i386 架构下的 type.h 头文件 这样临时建立链接文件到相应的架构下 这样直接写成 #include <asm/type.h> 即可, 到时用到哪个架构下的 type.h 则, 直接 ln -s arm-$( 参数位置 ) asm 这样指向某个架构即可 if [ -z "$6" -o "$6" = "NULL" ] ; 如果 $6 第 6 个参数 s3c24x0 为空 ( -z ), 或 ( -o ) 等于 NULL, 这里显然不为空也不为 NULL 这时执行 else 分支 ln -s ${LNPREFIX}arch-$6 asm-$2/arch LNPREFIX 没有定义, 在 mkconfig 和 Makefile 中都没有 即为空 这句话即 : ln -s arch-s3c24x0 asm-arm/arch 首先是在 asm-arm 目录下建立 arch 链接文件, 它指向 arch-s3c24x0, 验证如下 : 若 $2 等于 arm, 这里刚好成立, 则执行下面的两条命令 建立一个链接文件 : ln -s proc-armv asm-arm/proc, 链接文件名是 asm-arm 目录下的 proc 下面生成 config.mk 配置文件 :

9 从注释知道这是创建一个配置文件, 是 config.mk 文件 > 尖括号表示新建一个文件 表示追加内容到文件 mkconfig 100ask24x0_config arm arm920t 100ask24x0 NULL s3c24x0 参 0($0) 参 1($1) 参 2($2) 参 3($3) 参 4($4) 参 5($5) 参 6($6) echo "ARCH = $2" > config.mk echo "CPU = $3" >> config.mk echo "BOARD = $4" >> config.mk 这 3 条语句最后创建了文件 config.mk, 其内容是 : ARCH = arm CPU = arm920t BOARD = 100ask24x0 [ "$5" ] && [ "$5"!= "NULL" ] && echo "VENDOR = $5" >> config.mk 意思是 :$5 第 5 个参数存在, 并且这个参数不等于 NULL 时, 则再增加一个内容到 config.mk 文件中去 这里 $5 第 5 个参数存在却等于 NULL, 则是 : VENDOR = $5 不用加到配置文件 config.mk 中去 [ "$6" ] && [ "$6"!= "NULL" ] && echo "SOC = $6" >> config.mk $6 第 6 个参数存在并且要求 $6 不等于 NULL 时, 就添加内容 SOC=$6 到配置文件中去 即加 SOC = s3c24x0 到 config.mk 中去 可见完全和配置的一样 创建单板相关的头文件 :

10 定义了变量 APPEND=no 故条件不成立, 执行 else 部分 意思是新建一个文件 config.h,> 尖括号 就是创建新文件, 这个文件的内容是下面 echo 追加到里面去的内容 显然 100ask24x0.h 是我们的源码要用到的文件, 这个头文件是配置支持哪些东西, 如支持 哪些命令 总结 make 100ask24x0_config 所做的事情 : 1. 先创建了链接文件 : 2. 创建 config.mk 这个文件 :

11 3. 创建开发板相关的头文件 : 这 4 个结果可以知道, 要在 Board 目录下新建一个开发板 <board_name> 的目录, 则在 include/config 目录下也要建立一个文件 <board_name>.h, 里在存放的就是开发板 <board_name> 的配置信息

12 Uboot 编译过程 编译 : 直接 make 还是分析 Makefile 文件 ( 从头看起 ) 包含 include 目录下的 config.mk 文件 这个文件是就 makd 100ask24x0_config 与 mkconfig 文件一起生成的 include/config.mk 中定义的东西在 Makefile 中用的到 这就是配置过程和编译过程整合一起的 这里是包含了 include/config.mk 配置文件后,export 导出 ARCH CPU BOARD VENDOR SOC 这 5 个平台相关的变量 在 Makefile 中,export 是导出给下级的 Makefile 用 接着就根据上面包含的 config.mk 中的 ARCH=arm 信息匹配这行, 没有定义交叉编译器, 则要定义它 如果等于 ifeq: 如果 ARCH 变量的值等于 arm 时, 则交叉编译器是 arm-linux-. OBJS 很重要 这里从上分析知 $(CPU) 是 arm920t. 由于 start.s 是我们启动代码, 所以首先编译.OBJ=cpu/arm920t/start.o 这个 addprefix 是将 OBJS 赋值给 obj 如下 : $(addprefix src/,foo bar) 结果 :src/foo src/bar 有了两个文件 这是添加静态库 替换其中的变量可知 :

13 举例说明 : 意思是将 cpu/arm920t 目录下的所有涉及到的文件编译好后, 打包成一个库文件 libarm920t.a LIBS 的意思便是打包成库 make 编译时, 若不指定目标, 则 make 就找第一个目标去生成这个目标 all 是这里的第一个目标 这终的目的是要生成 u-boot.bin 这个二进制文件, 则找到这个目标, 找它的依赖, 一 级一级找下去 u-boot 这个 ELF 格式的文件又依赖于下面这些文件 : cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $( OBJS) \ 进入 $(LNDIR) 目录,$(LD) 进行链接,$(LDFLAGS) 这是链接的参数 $$UNDEF_SYM $( OBJS) 这是所有的.o 文件 --start-group $( LIBS) 所有的库 --end-group $(PLATFORM_LIBS)-Map u- boot.map -o u-boot 分析 Makefile, 将它们一一展开 另一种方法可以清楚的知道它们做了什么 在 UBOOT 顶层目录执行 make 后, 可以见到执行过程, 最下面有这个详细的展开文件

14 cd /work/arm920t/sourcecode/u_boot/u-boot && 这是进入 $(LNDIR) arm-linux-ld -Bstatic -T /work/arm920t/sourcecode/u_boot/u-boot-1.1.6/board/100ask24x0/u-boot.lds - Ttext 0x33F80000 这是链接,-T, 链接了链接脚本 u-boot.lds, 还链接了个代码段的基地址 -Ttext 0x33F80000 这个链接文件依赖于: 1. 上面这个链接脚本 : -T /work/arm920t/sourcecode/u_boot/u-boot /board/100ask24x0/u-boot.lds -Ttext 0x33F 另一个就是依赖下面的源材料 :.o 和.a 的文件 这些源材料如何组织成一个 UBOOT 哪个放在最前面 这要看链接脚本:u-boot.lds 下面这些是原材料 start.s 是我们启动代码, 所以首先编译. OBJ=cpu/arm920t/start.o $UNDEF_SYM cpu/arm920t/start.o 下面是所有的 lib 库 --start-group lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a

15 disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a --end-group -L /work/arm920t/sourcecode/crosstool/gcc glibc-2.3.6/bin/../lib/gcc/arm-linux/ lgcc -Map u-boot.map -o u-boot 这些源材料如何组织成一个 UBOOT 哪个放在最前面 这要看链接脚本:u-boot.lds SECTIONS {. = 0x ; // 当前地址等于 0, 这个 0 地址会加上 0x33F80000, 意即下面的文件会排放在从 Ox33f80000 开始的地方 // 最先排放 cpu/arm920t/start.o 这个文件的代码段. = ALIGN(4);.text : { cpu/arm920t/start.o (.text) //(.text) 指这个 cpu/arm920t/start.o 的代码段 board/100ask24x0/boot_init.o (.text) // 接着再排放这个 boot_init.o 文件的代码段 这两个是放在 UBOOT 最前的两个文件 *(.text) // 还有其他所有文件的代码段 }. = ALIGN(4);.rodata : { *(.rodata) } 段 // 接着是.rodata 是只读数据段 ; *(.rodata) 是指所有文件的只读数据. = ALIGN(4);.data : { *(.data) } // 所有文件的数据段. = ALIGN(4);.got : { *(.got) }

16 . =.; u_boot_cmd_start =.;.u_boot_cmd : { *(.u_boot_cmd) } UBOOT 定义了这个段 u_boot_cmd_end =.; // 所有文件的.u_boot_cmd 段 这个段一般文件里不存在 这里是. = ALIGN(4); bss_start =.;.bss : { *(.bss) } _end =.; } 可知 UBOOT 中放在最前面的两个文件是 :( 这两个文件的代码段 ) cpu/arm920t/start.o (.text) board/100ask24x0/boot_init.o (.text) 链接地址是 0x33f80000, 意思是这个 UBOOT 运行时应该位于 0x33f8000 这里 一开始运行的文件是 cpu/arm920t/start.o 分析 UBOOT 时, 便是从 start.s 这个汇编文件 总结 : 分析 Makefile 得到 : 1.uboot 从 0x33f80000 处开始运行第一个文件 cpu/arm920t/start.s( 从这个文件分析 UBOOT 的功能 ) 从这个 start.s 看下来可以看通整个 UBOOT 2. 链接地址是如何定义的 board/100ask24x0/u-boot.lds 这样一个链接脚本 这个链接脚本的第一个代码段文件从 0x33f80000 处开始运行 ( 当前地址 0 加上 0x33f80000, 即放 UBOOT 放在 64M SDRAM 的最上边 512K 空间处 ) 这个 0x33f80000 从何定义? 可以在源代码目录搜索到 [root@ian u-boot-1.1.6]# grep "33F80000" -nr./*./board/smdk2410/config.mk:25:text_base = 0x33F80000./board/sbc2410x/config.mk:23:TEXT_BASE = 0x33F80000./board/mpl/vcma9/config.mk:24:TEXT_BASE = 0x33F80000./board/100ask24x0/config.mk:25:TEXT_BASE = 0x33F80000./u-boot.srec:2:S31533F EA14F09FE514F09FE514F09FE526./u-boot.srec:12195:S31533FAF9F0E4F9FA33F F6F /u-boot.srec:12400:S70533F80000CF $(LD) $(LDFLAGS) 中的 LDFLAGS 上可知, 在 UBOOT 源码树的根目录下有个 config.mk 文件, 在 189 行定义如下 :LDFLAGS 等于后面的部分

17 $(LD) 等于 arm-linux-ld ; $(LDFLAGS) 等于 -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS) 最后替换相关变量后, 结果如下 : arm-linux-ld -Bstatic -T /work/arm920t/sourcecode/u_boot/u-boot-1.1.6/board/100ask24x0/u-boot.lds - Ttext 0x33F80000 这两行是很相似的 -Ttest 后的 $(TEXT_BASE) 在 u-boot-1.1.6/board/100ask24x0 目录下的 config.mk 下 若想你的 UBOOT 放在另一个地址, 则可以修改这个值 如这里单板有 64MSDRAM, 将 UBOOT 放在这 64M SDRAM 的最上边 若是生成的 UBOOT 超过 512K, 则把这个 TEXT_BASE 放到下面点, 保证上面放 UBOOT 的 空间即可 若内存没有 64M, 则这个值也要修改 从 0 地址开始的话只有 4k 的 SRAM 可用, 从 0x 开始的话就有 64M 的 SDRAM 可 用 RAM 的地址范围是从 0x 到 0x 共 64MByte

18 uboot 命令实现 md.w 0 是打印内存 0 地址的内容 1. 从串口上输入 字符串 --- 即 命令名字 ( 根据命令名字可以找到类似的函数 ) 2. 有了些动作 : 即程序中的某些函数 故 UBOOT 中不会只有一个命令, 会有一个命令结构体, 成员为 命令 和 函数 这些 结构体会放在一块 以 run_command 为例 : 根据这个名字与结构体中的 命令 名字一一比较 若找到匹配则 调用相应的函数 在 common 目录的 Main.c 中有很多 run_command 函数. 分析这个 函数 下面代码是 run_command 函数的部分内容 :

19 这是解析串口输入的命令 将命令一个一个提取出来 如有两个命令的话, 会有 ; 隔开 这里同时输入两个命令, 有分号隔开了 处理 宏 如从网口或 USB 口下载文件到内存时, 会临时生成一些环境变量或者宏 parse_line 解析这些文字 如解析 md.w 0 这个命令和参数要被解析一下 argv[0] = "md.w" argv[1] = "0" 这里便将 argv[0] 存起来了 argv[0] 放的是命令 argv[0] 是命令的名字,find_cmd 是查找这 个命令的函数.cmdtp 是一个命令的结构体

20 其中的 cmdtp 是一个结构体标识 结构体原型是 : 至少有 名字 和 函数 这里有 *name 名字 ; maxargs 最大的参数个数 ; repeatable 是否重复 ( 意思是上一次执行过, 下次再想执行进, 直接 确定 键即可 ) int (*cmd)(struct cmd_tbl_s *, int, int, char *[]) ; 这是一个 函数指针 命令执行时要调用什么函数 *usage 是简短的帮助信息, 如直接输入 help, 命令后面跟着的就是 短的帮助信息 *help 是长的帮助信息 这里根据 argv[0] 的命令名字找到 cmdtp 这个结构体, 用 find_cmd(0) 来找

21 其中 搜遍源代码都找不着, 只能看链接脚本 在 C 语言里, 链接脚本也可以 传入这些值 ( 查看链接脚本 u-boot.lds) 分析 UBOOT 时, 得到它第一个启动的文件 第二它的链接脚本.u_boot_cmd : { *(.u_boot_cmd) } 这里是放 u_boot_cmd 代码段 先比较命令的名字, 若比较成功, 则返回这个结构体 若上面没有比较成功, 则往一下个去 ( 上面的 for 中有 cmdtp++) 看看.u_boot_cmd 段是什么 : #define Struct_Section attribute ((unused,section (".u_boot_cmd"))) bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0 输入 bootm 后, 会调用函数, 可以在源代码里搜索到

22 刚好是在串口输入 help 后可以见到的信息 这里有一个宏 U_BOOT_CMD. 在 Command.h 中有这个宏的定义 : 下面定义了 U_BOOT_CMD 这个宏 : #define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \ cmd_tbl_t u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help} 将下面的 U_BOOT_COMD 宏, 用上面定义时真正的部分 cmd_tbl_t u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help} 替换回来 下面是要替换的内容 : U_BOOT_CMD( bootm, CFG_MAXARGS, 1, do_bootm, "bootm - boot application image from memory\n", "[addr [arg...]]\n - boot application image stored in memory\n" "\tpassing arguments 'arg...'; when booting a Linux kernel,\n" "\t'arg' can be the address of an initrd image\n" #ifdef CONFIG_OF_FLAT_TREE "\twhen booting a Linux kernel which requires a flat device-tree\n" "\ta third argument is required which is the address of the of the\n" "\tdevice-tree blob. To boot that kernel without an initrd image,\n" "\tuse a '-' for the second argument. If you do not pass a third\n" "\ta bd_info struct will be passed instead\n" #endif ); 将 U_BOOT_CMD 宏展开后, 看上面这部分的具体内容 1. 首先定义 U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) 宏时 : 参 1--name :bootm 参 2--maxargs:CFG_MAXARGS 参 3--rep :1 参 4--cmd :do_bootm 参 5--usage :"bootm - boot application image from memory\n"

23 参 6--help :"[addr [arg...]]\n - boot application image stored in memory\n" "\tpassing arguments 'arg...'; when booting a Linux kernel,\n" "\t'arg' can be the address of an initrd image\n" #ifdef CONFIG_OF_FLAT_TREE "\twhen booting a Linux kernel which requires a flat device-tree\n" "\ta third argument is required which is the address of the of the\n" "\tdevice-tree blob. To boot that kernel without an initrd image,\n" "\tuse a '-' for the second argument. If you do not pass a third\n" "\ta bd_info struct will be passed instead\n" 参数间的内容是用, 逗号 隔开的 cmd_tbl_t u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help} 变成如下 : cmd_tbl_t u_boot_cmd_bootm attribute ((unused,section (".u_boot_cmd")))= {#name, maxargs, rep, cmd, usage, help} #define Struct_Section attribute ((unused,section (".u_boot_cmd"))) ## 是连词符 u_boot_cmd_##name 则变成 : u_boot_cmd_bootm( 这是一个结构体, 结构体类型 : cmd_tbl_t: 命令 table,t 表示结构体 ) 这个结构体 ( u_boot_cmd_bootm) 有个属性 ( attribute ), 强制把它 section 段属性设 置成 :.u_boot_cmd 这个段属性在 u-boot.lsd 链接脚本里 = {#name, maxargs, rep, cmd, usage, help} 这是里面的内容 将 U_BOOT_CMD 这个宏内容替换进来 如 #name 为 bootm 最后的代码是 : cmd_tbl_t u_boot_cmd_bootm attribute ((unused,section (".u_boot_cmd")))= { bootm, CFG_MAXARGS, 1, do_bootm, "bootm - boot application image from memory\n", "[addr [arg...]]\n - boot application image stored in memory\n" "\tpassing arguments 'arg...'; when booting a Linux kernel,\n" "\t'arg' can be the address of an initrd image\n" #ifdef CONFIG_OF_FLAT_TREE "\twhen booting a Linux kernel which requires a flat device-tree\n" "\ta third argument is required which is the address of the of the\n" "\tdevice-tree blob. To boot that kernel without an initrd image,\n" "\tuse a '-' for the second argument. If you do not pass a third\n" "\ta bd_info struct will be passed instead\n"

24 } 故在代码中, 所有用 U_BOOT_CMD 宏定义的东西, 最终都会定义上面 cmd_tbl_t u_boot_cmd_##name attribute () 这样的结构体, 这个结构体的特别在于有一个属性 就是将它的段强制指定为.u_boot_cmd 所以说所有的命令, 最终都会被集中在 中去 它的开始是 u_boot_cmd_start =. 结束地址是 u_boot_cmd_end =. 按上面的分析, 增加一个 hello 命令, 使其打印 hello world: 1. 按 Cmd_bootm.c 中的结构来写 新建一个 hello_cmd.c, 包含 Cmd_bootm.c 中头文件 与 Cmd_bootm.c 一样放在 UBOOT 源码的 common 目录下 2. 在 Cmd_bootm.c 中有 : int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { printf ("## Booting image at %08lx...\n", addr); 后面也有返回值 } 我们仿制成 : 加了参数打印 int do_hello (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { int i; printf("hello World!,%d\n",argc); for (i = 0;i < argc;i++) { printf("argv[%d]:%s\n",i,argv[i]); } return 0; } 3. 仿照着定义一个 U_BOOT_CMD 宏 (Cmd_bootm.c 有类似的 ) Cmd_bootm.c 中的 :

25 U_BOOT_CMD( bootm, CFG_MAXARGS, 1, do_bootm, "bootm - boot application image from memory\n", "[addr [arg...]]\n - boot application image stored in memory\n" "\tpassing arguments 'arg...'; when booting a Linux kernel,\n" "\t'arg' can be the address of an initrd image\n" #ifdef CONFIG_OF_FLAT_TREE "\twhen booting a Linux kernel which requires a flat device-tree\n" "\ta third argument is required which is the address of the of the\n" "\tdevice-tree blob. To boot that kernel without an initrd image,\n" "\tuse a '-' for the second argument. If you do not pass a third\n" "\ta bd_info struct will be passed instead\n" #endif ); 改成如下 : U_BOOT_CMD( hello, CFG_MAXARGS, 1, do_hello, "hello - just for test\n", "hello, long help...\n" ); 完整代码如下 :

26 4. 代码写好了 接着放进 UBOOT 源码去编译 a. 先将代码拷贝进去 : 在 Project 菜单 --- Add and Remove ProjectFile 后, 再源码 hello_cmd.c 上右键 :Cope List 后如上选择 Copy selected item(s) 5. 将 hello_com.c 放到 linux 下的 UBOOT 源码的 common 目录 修改这个 common 目录 下的 Makefile. 直接在 OBJ 后面加上 cmd_hello.o 即可 重新 make 生成 bin 文件

27 总结 : UBOOT 接收串口输入时, 会根据串口输入的字符去查找相应的处理函数 最简单的方法就 是做一个结构体, 这个结构体里面有名字, 还有相应的处理函数 结构体的名字 :cmd_tbl_t(),tbl 是 table,t 表 示结构体

28 uboot 第一阶段系统初始化 硬件相关初始化 : 1. 初始化 : 关看门狗 初始化时钟初始化 SDRAM 2. 若程序很大, 还要将程序从 NAND 拷贝到 SDRAM 中去 3. 要设置栈 (sp), 因为要调用 C 函数时, 必须用到栈 ---> 设置栈就是让 SP 寄存器指向某块内存 设置好栈后就会调用 C 函数 -----> 函数再读出内核, 启动内核 这是硬件程序 UBOOT 是比较复杂的单片机程序 4.UBOOT 运行的第一个文件是 :cpu/arm920t/start.s( 从程序的链接脚本中知道 ) 1. 第一条指令跳转到 reset. 2.reset 做的事 : a. 管理模式 :set the cpu to SVC32 mode 将 CPU 设置为 SVC32 管理模式 b. 关闭看门狗 :

29 c. 关中断 : 屏蔽所有的中断 d.cpu 的一些初始化 : adr 是读地址指令, 当前 _start 这段代码位于哪里 一开始如上电运行的话, 这段代码是从 NADN 中自动拷贝到片内 4K 内存去的 那么这个地址就是 0x 这个 r0 就是 0x 若程序是通过仿真器, 调试器之类直接下载到 SDRAM 中去的放, 那这时 r0 就等于它的链接地址, 即 0x33F r1 等于 _TEXT_BASE cmp r0,r1 是判断这两个值是否相等 若不等, 则 SDRAM 还没有谁去初始化它 cpu_init_crit 做的事情 : 先关 flush 清 caches 再关 MMU:

30 还有去 lowlevel_init 这个函数 : 这时跳转到 lowlevel_init 去看看执行的是什么 这个文件要找 board\100ask24x0 下的 lowlevel_init.s.globl lowlevel_init lowlevel_init: /* memory control configuration */ /* make r0 relative the current location so that it */ /* reads SMRDATA out of FLASH rather than memory! */ ldr 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))

31 .word ((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 0xb1.word 0x30.word 0x30 这段代码是初始化存储控制器 经过这要的初始化后, 内存才可以使用 e. 设置栈

32 /* Set up the stack*/ 设置栈 stack_setup: ldr r0, _TEXT_BASE 使 r0=_text_base(0x33f80000, 这是以前定义的,u-boot /board/100ask24x0 目录下的 config.mk) sub r0, r0, #CFG_MALLOC_LEN 使 r0= 上面的 r0(0x33f80000)-cfg_malloc_len, 则 r0 指向了减过 CFG_MALLOC_LEN 长 度的新内存地址处 则这时内存中有一段是 CFG_MALLOC_LEN sub r0, r0, #CFG_GBL_DATA_SIZE 此时的 r0 新指的地址, 又是上次的 r0 减去一个 #ifdef CONFIG_USE_IRQ sub 如果有定义 CONFIG_USE_IRQ r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) 则 r0 又指另一个减去 CONFIG_USE_IRQ 和 FIQ 大小之后的新地址 #endif sub sp, r0, #12 这时 r0 指向一个再减去一个 12 之后的地址 这个地址就是栈指针 SP 所指处, 如下就 bl C 函数了 #ifndef CONFIG_SKIP_LOWLEVEL_INIT

33 bl clock_init SP 指向了 r0-12 这个地址, 栈设置好了, 可以调用 C 函数

34 uboot 会放在 0x33F80000 处, 以下的诸如 IRQ,FIQ 这个栈各有用途 从内存往下排, 最后 排上 SP 栈指针, 这时便可以调用 C 函数了 下面是 Clock_init 函数 ( 初始化时钟 ): void clock_init(void) { S3C24X0_CLOCK_POWER *clk_power = (S3C24X0_CLOCK_POWER *)0x4C000000; /* support both of S3C2410 and S3C2440, by */ if (iss3c2410) { /* FCLK:HCLK:PCLK = 1:2:4 */ clk_power->clkdivn = S3C2410_CLKDIV;

35 /* change to asynchronous bus mod */ asm ( "mrc p15, 0, r1, c1, c0, 0\n" /* read ctrl register */ "orr r1, r1, #0xc \n" /* Asynchronous */ "mcr p15, 0, r1, c1, c0, 0\n" /* write ctrl register */ :::"r1" ); /* to reduce PLL lock time, adjust the LOCKTIME register */ clk_power->locktime = 0xFFFFFFFF; /* configure UPLL */ clk_power->upllcon = S3C2410_UPLL_48MHZ; 这是 USB 的时钟 /* some delay between MPLL and UPLL */ delay (4000); /* configure MPLL */ clk_power->mpllcon = S3C2410_MPLL_200MHZ; 整个系统的时钟 /* some delay between MPLL and UPLL */ delay (8000); } else { /* FCLK:HCLK:PCLK = 1:4:8 */ clk_power->clkdivn = S3C2440_CLKDIV; /* change to asynchronous bus mod */ asm ( "mrc p15, 0, r1, c1, c0, 0\n" /* read ctrl register */ "orr r1, r1, #0xc \n" /* Asynchronous */ "mcr p15, 0, r1, c1, c0, 0\n" /* write ctrl register */ :::"r1" ); /* to reduce PLL lock time, adjust the LOCKTIME register */ clk_power->locktime = 0xFFFFFFFF; /* configure UPLL */ clk_power->upllcon = S3C2440_UPLL_48MHZ; /* some delay between MPLL and UPLL */ delay (4000);

36 /* configure MPLL */ clk_power->mpllcon = S3C2440_MPLL_400MHZ; /* some delay between MPLL and UPLL */ delay (8000); } } f. 说完 clock_init(void) 后, 继续看 cpu/arm920t/start.s 之后的代码 : 这是将代码从 flash 中读到 SDRAM 中去, 是读到 SDRAM 的链接地址中去 链接地址表示 程序运行的时候应该处于链接地址 g. 拷贝完程序后, 清 bss 段 以上过程如下 : 1. 进入 SVC 管理模式 2. 关看门狗 3. 屏蔽中断 4. 做些初始化 ( 主要是 SDRAM 的初始化 ) 5. 设置调用 C 函数的 SP 栈 6. 时钟 7. 重定位 ( 从 FLASH 拷代码到 SDRAM), 函数 :CopyCode2Ram 8. 清 bss 段 bss 段是初始值为 0 的静态的或全局的变量, 或是没有初始化的静态或全局变 量 它们就放在 bss 段里面 它们全部的初始值都被弄成 0 显然这些变量就没必要保存在程序里面了, 清 bss 段后就是清了它们, 这样节省空间 要运行的时候, 再去把这些变量相关的位置清 0 就可以再用它们了 看下链接文件 u-boot.lds 但可以知道

37 bss 段从 bss_start =. 到 _end =. 这里开始 首先 : bss_start =. 是等于当前地址 这个当前地址会随着放的东西变多一起增加这些当前 地址 然后 :.bss : { *(.bss)} 放所有文件的 bss 段 9. 最后调用 C 函数 start_armboot: 其他更复杂的功能就在这里面去实现 以上便是 2440 硬件的相关初始化, 若是换成其他 CPU, 初始化的具体内容不一样, 但有 相似处 我们把这些东西叫作 UBOOT 的第一阶段 uboot 第二阶段 UBOOT 第二阶段就是从 start_armboot 函数开始 功能 : 串口 烧写读取 flash, 网卡 USB, 启动内核等

38 从 flash 拷贝代码到 SDRAM 中的函数 : NOR 是和内存接口一样的芯片, 它可以像读内存一样去读, 函数中可见, 如果是从 NOR flash 中拷贝代码的话就很简单 直接从源拷贝到目标去 pdwdest[i] = pdwsrc[i]; 从 NAND 拷贝的话就要做的事比较多, 参看硬件教程部分

39 判断从 NOR 还是 NAND 启动 : 这个函数就是判断是否 NOR 启动, 若是 NOR 启动, 则 0 地址就对应于 NOR flash NORflash 不能像内存一样去写 若从 NAND 启动, 则 0 地址就对应于片内的内存, 这时 0 地址是可以写的 volatile unsigned int *pdw = (volatile unsigned int *)0; unsigned int dwval; } dwval = *pdw; 首先读出 0 地址中的内容 *pdw = 0x ; 然后去修改这个 0 地址 给它写一个值 if (*pdw!= 0x ) 再去读这个值, 看是否可正确读出来 { return 1; 如果将现在的 *pdw 0 地址读出来不等于写进去的值, } 便表明这个 0 地址是不可写的 不可写表明从 NOR 启动的 else { *pdw = dwval; 这个 0 地址可写的话, 说明是从 NAND 启动的 return 0; } int CopyCode2Ram(unsigned long start_addr, unsigned char *buf, int size) { unsigned int *pdwdest; unsigned int *pdwsrc; int i; if (bbootfrmnorflash()) {

40 pdwdest = (unsigned int *)buf; pdwsrc = (unsigned int *)start_addr; /* 从 NOR Flash 启动 */ for (i = 0; i < size / 4; i++) { pdwdest[i] = pdwsrc[i]; } return 0; } else { /* 初始化 NAND Flash */ nand_init_ll(); /* 从 NAND Flash 启动 */ nand_read_ll_lp(buf, start_addr, (size + NAND_BLOCK_MASK_LP)&~(NAND_BLOCK_MASK_LP)); return 0; } } static inline void delay (unsigned long loops) { asm volatile ("1:\n" "subs %0, %1, #1\n" "bne 1b":"=r" (loops):"0" (loops)); }

41 第二阶段启动内核过程 UBOOT 最终目标 : 启动内核 从 FLASH 读出内核 ---> 启动 cpu/arm920t/start.s 第二阶段开始 在 Board.c 中读代码 gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); 是分配一个类型为 gd_t* 这样的结构体指针的内存空间给 gd,gd 是指向下面 128 字节这块内存 即 : 这个 128 处

42 0x SDRAM NOR Flash _end bss_start u_boot_cmd_end u_boot_cmd_start 0x33F x33F x33F4FF80 0x33F4FF7C 0x33F4EF7C 0x33F4DF7C 0x33F4DF74 0x x x000F0000 u_boot_cmd_end u_boot_cmd_start 0x BSS 段 代码段 192K K 4K 8 环境参数 代码段 512K CFG_MALLOC_LEN CFG_GBL_DATA_SIZE CONFIG_STACKSIZE_IRQ CONFIG_STACKSIZE_FIQ SP CFG_ENV_ADDR 函数指针组成的数组 init_sequence 其中有如下相关指向相关初始化函数的指针 CPU 初始化, 不能管 目标是从 FLASH 读出内核启动内核

43 单板初始化 : 以上是 2440 相关管脚的初始化 其中有 机器 ID 的设置 其中有两个如下的设置 : /* arch number of SMDK2410-Board */ gd->bd->bi_arch_number = MACH_TYPE_S3C2440; /* 值为 193 */ gd 指向 128K 的内存处 图 U-BOOT 内存使用情况 机器 ID, 这个机器 ID 在讲解内核时用的着 /*address of boot parameters*/ gd->bd->bi_boot_params = 0x ; 这是启动参数, 就是启动内核的时候会传些参数 这些参数存在 0x 这个地址 讲解内核时便知道以上两个参数的设置意义 要从 FLASH 读出内核 : 初始化 FLASH

44 则要 : 1. 支持 FLASH 的读 NOR 的读和内存的读一样 不需要做什么 2. 这开发方便增加 : 写 NOR 要写首先识别它是哪种 FLASH NAND 的也要先初始化识别它是哪种 FLASH Board.c 中有如下初始化 : NOR_FLASH 的初始化 这是对 NOR_FLASH 的初始化 flash_init() 会识别是哪种 NOR_FLASH UBOOT 是单片机的程序, 从内存上分配些空间等函数都得自已实现 : mem_malloc_init 是从内存上分配空间 它对应内存上的如下块 :192K 空间 这个函数在这块内存上实现了堆的分配和释放 NAND 的初始化 :

45 有了以上几个函数,UBOOT 已有能力读写 flash 了 环境变量 :env_relocate () 单板启动后, 可以按 4 进入 UBOOT 命令中,printenv 命令会显示 环境变量 一个变量的等于号后面是变量的值 环境变量从哪里来 : 1. 代码里默认写死的 2. 在 FLASH 上的, 可以修改, 则要保存 UBOOT 是启动后先看 FLASH 上看是否有可用的环境变量, 若没有则用 默认 的环境变量 这是环境变量的初始化 在 UBOOT 中输入 print 会显示当前的环境变量信息

46 =========================================================== ============================ PreLoadedONRAM 意思是指事先装载进内存中去的 若用调试器下载的话, PreLoadedONRAM 这个值就会被值成 1 =========================================================== ============================ 这里有个死循环 以上经过如下 : start_armboot----flash_init----nand_init----main_loop( 主循环 ) 在 UBOOT 上输入命令等等, 都是在这个主循环之中 我们输入什么,UBOOT 就解析什么 如 :UBOOT 中的环境变量中有个 bootdelay 这是在 main_loop 主循环中, 进入主循环后等待我们输入, 上面这个是 bootdelay. getenv() 获得环境变量, 这里将 bootdelay 取出来, 这里取的是 10, 是字符串 转换成数字 s = geten( bootcmd ) 想知道是怎么启动, 有一个 s = geten( bootcmd )boot 是启动,cmd 是命令 即 启动 命令

47 这是倒数计时 如果在这个倒数计时没到达到 0 之前, 没有输入空格键, 就会打印下面的信 息 : run_command(s,0) 这个命令哪里来的, 就是上面 s = getenv( bootcmd ) 这样子来的 从 这里可见, 如何从 FLASH 读出内核, 如何启动内核, 取决于 s = getenv("bootcmd") 这条命令 bootcmd 是环境变量 在 UBOOT 启动后, 这个环境变量 bootcmd 是如下内容 : bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0 分析 :uboot 启动内核 : 1. 从 flash 上读出内核 从 bootcmd 可知 : 用命令 nand read.jffs2 将内核读到内存 0x30007FC0 处 从哪里读? 从 kernel 读, 这是个分区 2. 启动 第二条命令 :bootn 0x30007FC0 可知内核的启动依赖 bootcmd 这个环境变量 这个环境变量里定义了两个命令, 一个是从 FLASH 上读出内核, 一个是启动内核 如果倒数计时到 0 之有, 按下了空格, 则是执行接着的如下 : 这些 ifdef,endif 是黑色表示是没有定义的, 代码可以直接往下走 应该是 SI 中宏颜色为黑 色, 则表示没有定义吧

48 这个 menu 就是有个菜单的原因 没有修改的 UBOOT 没有这个菜单 接着又是一个死循环 这个循环表现在如下位置 黑色处就是这个循环 它是等待读取串口的输入 会解析我们的输入 读取串口输入 然后运行 我们启动内核时, 也是一个 run_command(s,0) 所以 UBOOT 的核心就是这些命令 即 : 1. 启动内核 : s = getenv("bootcmd") 获取环境变量

49 run_command(s,) 2. 在 u-boot 控制界面 readline 读入串口的数据 run_command() UBOOT 的核心就是这些 " 命令 " run_commnd(). 故只有分析了这些命令的实现之后, 才能明白内核的加载与启动

50 uboot 基本命令 一, 下载文件 : 1, 通过 TFTP 下载文件 : 先配置好网络连通 : 在 TFTP 服务器上有这个 uimage 文件 内存是从 地址处开始的, 这里可以把内核下载到 处, 或 处, 这是自已定义的 2,loadb : 通过串口下载二进制文件 Loadb 后,UBOOT 就处理阻塞状态 接着从菜单下 发送文件, 选择一个文件下载 如这里下载 uimage. 用串口下载可能 要 25 分钟, 所以最好使用 TFTP 网络下载, 很快 (5 秒左右 )

51 二, 内存操作 : 1, 显示内存内容 : md 显示内存区的内容 md 采用十六进制和 ASCII 码两种形式来显示存储单元的内容 这条命令还可以采用长度标识符.I,.W 和.b: md[,b,.w,.i]address md.w : f6f e 312e : d d 上面是以 4 字节一组的方式显示内存中的内容 2, 修改内存中内容 : mm 修改内存, 地址自动递增 mm [.b,.w,.i]address mm 提供了一种互动修改存储器内容的方法 它会显示地址和当前值, 让后提示用户输入 如果你输入了一个合法的十六进制数, 这个新的值将会被写入该地址 让后提示下一个地址 如果你没有输入任何值, 只是按了一下回车, 那么该地址的内容保持不变 如果想结束输入, 则输入空格让后回车 => mm : ? : ? AABBCCDD 若接下去不再修改时, 就在? 处 空格 + 回车 即退出了 "mm".

52 三,Flash 操作 : 1,flinfo 查看 FLASH 盲区信息 : Flash 的大小是 2MB 型号是 :SST SST39VF1601. 磁盘的扇区一般都是固定大小为 512 字节, 而 flash 的扇区大小可以不相同 ( 有的是固定 大小 ) 这是硬件决定的而非软件可更改 上面 uniform sector size 表示这块 flash 的扇区 是固定大小的 32 Sectors :32 个区域 可以数下面的区域为 32 个 下面是每个 sectors 的起始地 址 用相邻区域起始地址相减就是一个扇区的大小, 可以发现 32 个扇区的大小是一样的 2, protect Flash 写保护 : protect Flash 写保护 打开或关闭扇区写保护用法 : protect off all protect on all protect off start end 个扇区的结束地址 ) protect on start end 关闭所有扇区的写保护 打开所有的扇区写保护 关闭从 start 到 end 扇区的写保护 (start 为要关闭的第 1 个扇区的起始地址,end 为要关闭的最后一 打开从 start 到 end 扇区的写保护 如 U 盘可以写保护 这里是在 UBOOT 中对 FLASH 进行 写保护 对某个或某几个连续的扇区写保护 : start 是起始地址,end 是扇区的结束地址 ( 后一个扇区始地址减 1)

53 3,erase 擦除 flash 扇区 : erase 擦除 flash 扇区用法 : erase start end 擦除从 start 到 end 扇区,start 为要擦除的第一个扇区的起始地址,end 为要擦除的最后一个扇区的结束地址 ( 在使用 cp 命令向 Nor 型 Flash 写入数据之前必须先使用 erase 命令擦除 Flash, 因为 nor flash 按字节写入时, 无法写入 1, 所以必须通过擦除来写人 1). 例 :erase effff NOR flash 有一个硬件特性, 就是无法以位或字节方式往里面写入 1 在操作内存时, 对某一个字节或某一个位进行 1 的赋值是可以的, 但 NOR Flash 不行 擦除是把一个扇区全部写成 1 之后就可以去写 0 所以对 NOR Flash 进行操作赋值时, 就要先擦除再赋值 4,cp 数据拷贝 : cp 数据拷贝 cp [.b,.w,.i] saddress daddress len cp 提供了一种内存与内存, 内存与 Flash 之间数据拷贝的方法 Cp 可以在 flash 和 flash 之间,"flash 和 内存 等之间进行数据拷贝 默认是以.l 32 位来拷贝的, 即 cp.l. saddress 是数据原来的地址 daddress 是要把数据拷贝到的地址 len 是要拷贝的数据的长度 例 : cp.b d0000 将内存地址 0x 处的数据 ( 长度为 0xd0000) 拷贝到地址 0x50000 处 (Flash 中 ) 计算知道是位于 flash 上的 所以这里是把内存中的数据往 flash 上去拷贝 这里对 NOR 的操作还要先擦除一下 所以要擦除从 处开始往后 d0000 大小的空间, 看这跨越了几个扇区, 要把它们先擦除下 cp.b c0000 将内存地址 0x 处的数据 ( 长度为 0xc0000) 拷贝到地址 0x 处 (Flash 中 ) 5, 程序的执行 : go 执行内存中的二进制代码, 一个简单的跳转到指定地址 go addr [arg ]

54 start application at address addr,padding arg as arguments go+ 程序所在的地址 bootm 执行内存中二进制代码 bootm [addr[arg ]] -boot application image stored in memory passing arguments arg ;when booting a Linux kernel, arg can be the address of an initrd image 这里 addr 有 [] 表示可以不需要 这是说 UBOOT 中有一个 bootm 启动的默认地址 若 是加上 addr 似乎和 go 命令一样, 但 bootm 要求二进制代码有固定格式的文件头 四, 开发板信息 : 1,bdinfo : 显示开发板信息 bdinfo 命令 ( 简写为 bdi) 将在终端显示诸如内存地址和大小, 时钟频率,MAC 地址等信息 这些信息在传递给 Linux 内核一些参数时可能会用到 这些信息很多在 环境变量 中也看的到 没多大实际意义 五, 自动启动 : 1, 设置自动启动 : bootcmd 后面是接想要开机运行的命令, 如上 :

55 Setenv bootcmd tftp uimage \; bootm 上面是设置了两条命令, 一条是 :tftp uimage 是指把 uimage 下载到 处 二条是 :bootm 是指从 处启动 两条命令间用 空格 +\+;+ 空格 连接, 多条命令也是如此 设置好 uboot 中的 ip 地址后, 因为 uboot 不会回 ping 包, 所以只能从 uboot 里 ping 服务端电脑的 IP 要注意烧写的二进制文件要看它是否支持 NOR 的运行, 有些 uboot 只能烧到 NAND FLASH 中 毕竟 flash 的操作在 UBOOT 中, 要它支持才行 如要烧写一个测试程序, 可以如下 : 1, 在 PC 端创建 tftp 服务 2, 在 UBOOT 中设置好 IP 参数后 : 下载程序 Tftp lcd.bin 这样即可将 lcd.bin 烧写到 地址处 3. 烧写程序 : 先擦除 上面是对 nand 的分区 可能擦除 bootload 分区 Nand erase bootloader 这样就擦除了这个分区 其实就是后面的大小, 从 0 地址到 0x40000 这个地址 再烧写 Nand write 是烧写 是将这个地址处的内容烧写到后面的 bootloader 分区 4, 烧写内核 : tftp: tftp uimage 将内核下载到这个 地址

56 nand erase kernel 先擦除这个会存放内核的空间 nand write.jffs kernel 再 处的内核烧写到内核空间地址处 write.jffs2 后面有 jffs2 是指 nand 的特性可能会有位反转的错误, 这是烧写时的校验的功能 5, 文件系统 : dnw: 在菜单里输入 y, 然后使用 dnw.exe 发送 yaffs2 文件 或 dnw: 在菜单里输入 j, 然后使用 dnw.exe 发送 jffs2 文件, 再参考使用手册 P44 设置 bootargs tftp: tftp fs_qtopia.yaffs2 nand erase root nand write.yaffs x $(filesize) or: tftp fs_qtopia.jffs2 nand erase root nand write.jffs x $(filesize) // 这里没有使用 root( 表示这么大的空间 ), 是因为 可能 tftp fs_qtopia.jffs2 下载的文件很小 ( 当然这个 fs_qtopia.jffs2 很大 ), 当 nand write. jffs2 时, 烧写那么大时,root 文件系统就被破坏了 所以这里可以直接用一个 变量 来表 示要烧写的大小 后面 $(filesize) 即是代表着刚才下载过的 fs_qtopia.jffs2 的大小 当不想使用 root 命令来操作时, 可以如下 : Sudo chown ian:ian /work/ram 这样可以将这个目录修改权限 用 nfs 下载文件系统到 NAND 上 : 开发板上 uboot 中的配置 : set bootargs noinitrd root=/dev/nfs nfsroot= :/work/nfs_root/tmp/fs_mini_mdev ip= : : : ::eth0:off init=/linuxrc console=ttysac0 PC 端 nfs 服务配置 : nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf> 1, 下载 : Nfs :/work/nfs_root/tmp/fs.yaffs2 从虚拟机上下载文件系统

57 2, 擦除 : Nand erase root 擦除 root 分区 3, 烧写 : Nand write.yaffs $(filesize) 将 处的内容烧写到 0x 地址处, 大小为 $(filesize).

58 U-Boot 的常用命令详解 : U-Boot 还提供了更加详细的命令帮助, 通过 help 命令还可以查看每个命令的参数说明 由于开发过程的需要, 有必要先把 U-Boot 命令的用法弄清楚 接下来, 根据每一条命令的帮助信息, 解释一下这些命令的功能和参数 1 bootm bootm [addr [arg...]] - boot application image stored in memory passing arguments 'arg...'; when booting a Linux kernel, 'arg' can be the address of an initrd image bootm 命令可以引导启动存储在内存中的程序映像 这些内存包括 RAM 和可以永久保存的 Flash 第 1 个参数 addr 是程序映像的地址, 这个程序映像必须转换成 U-Boot 的格式 第 2 个参数对于引导 Linux 内核有用, 通常作为 U-Boot 格式的 RAMDISK 映像存储地址 ; 也可以是传递给 Linux 内核的参数 ( 缺省情况下传递 bootargs 环境变量给内核 ) 2 bootp bootp [loadaddress] [bootfilename] bootp 命令通过 bootp 请求, 要求 DHCP 服务器分配 IP 地址, 然后通过 TFTP 协议下载指定的文件到内存 第 1 个参数是下载文件存放的内存地址 第 2 个参数是要下载的文件名称, 这个文件应该在开发主机上准备好 3 cmp cmp [.b,.w,.l] addr1 addr2 count - compare memory cmp 命令可以比较 2 块内存中的内容.b 以字节为单位 ;.w 以字为单位 ;.l 以长字为单位 注意 :cmp.b 中间不能保留空格, 需要连续敲入命令 第 1 个参数 addr1 是第一块内存的起始地址 第 2 个参数 addr2 是第二块内存的起始地址 第 3 个参数 count 是要比较的数目, 单位按照字节 字或者长字 4 cp cp [.b,.w,.l] source target count - copy memory cp 命令可以在内存中复制数据块, 包括对 Flash 的读写操作 第 1 个参数 source 是要复制的数据块起始地址

59 第 2 个参数 target 是数据块要复制到的地址 这个地址如果在 Flash 中, 那么会直接调用写 Flash 的函数操作 所以 U-Boot 写 Flash 就使用这个命令, 当然需要先把对应 Flash 区域擦干净 第 3 个参数 count 是要复制的数目, 根据 cp.b cp.w cp.l 分别以字节 字 长字为单位 5 crc32 crc32 address count [addr] - compute CRC32 checksum [save at addr] crc32 命令可以计算存储数据的校验和 第 1 个参数 address 是需要校验的数据起始地址 第 2 个参数 count 是要校验的数据字节数 第 3 个参数 addr 用来指定保存结果的地址 6 echo echo [args..] - echo args to console; c suppresses newline echo 命令回显参数 7 erase erase start end - erase FLASH from addr 'start' to addr 'end' erase N:SF[-SL] - erase sectors SF-SL in FLASH bank # N erase bank N - erase FLASH bank # N erase all - erase all FLASH banks erase 命令可以擦 Flash 参数必须指定 Flash 擦除的范围 按照起始地址和结束地址,start 必须是擦除块的起始地址 ;end 必须是擦除末尾块的结束地址 这种方式最常用 举例说明 : 擦除 0x x3ffff 区域命令为 erase ffff 按照组和扇区,N 表示 Flash 的组号,SF 表示擦除起始扇区号,SL 表示擦除结束扇区号 另外, 还可以擦除整个组, 擦除组号为 N 的整个 Flash 组 擦除全部 Flash 只要给出一个 all 的参数即可 8 flinfo flinfo - print information for all FLASH memory banks flinfo N

60 - print information for FLASH memory bank # N flinfo 命令打印全部 Flash 组的信息, 也可以只打印其中某个组 一般嵌入式系统的 Flash 只 有一个组 9 go go addr [arg...] - start application at address 'addr' passing 'arg' as arguments go 命令可以执行应用程序 第 1 个参数是要执行程序的入口地址 第 2 个可选参数是传递给程序的参数, 可以不用 10 minfo iminfo addr [addr...] - print header information for application image starting at address 'addr' in memory; this includes verification of the image contents (magic number, header and payload checksums) iminfo 可以打印程序映像的开头信息, 包含了映像内容的校验 ( 序列号 头和校验和 ) 第 1 个参数指定映像的起始地址 可选的参数是指定更多的映像地址 11 loadb loadb [ off ] [ baud ] - load binary file over serial line with offset 'off' and baudrate 'baud' loadb 命令可以通过串口线下载二进制格式文件 12 loads loads [ off ] - load S-Record file over serial line with offset 'off' loads 命令可以通过串口线下载 S-Record 格式文件 13 mw mw [.b,.w,.l] address value [count] - write memory

61 mw 命令可以按照字节 字 长字写内存,.b.w.l 的用法与 cp 命令相同 第 1 个参数 address 是要写的内存地址 第 2 个参数 value 是要写的值 第 3 个可选参数 count 是要写单位值的数目 14 nfs nfs [loadaddress] [host ip addr:bootfilename] nfs 命令可以使用 NFS 网络协议通过网络启动映像 15 nm nm [.b,.w,.l] address - memory modify, read and keep address nm 命令可以修改内存, 可以按照字节 字 长字操作 参数 address 是要读出并且修改的内存地址 16 printenv printenv - print values of all environment variables printenv name... - print value of environment variable 'name' printenv 命令打印环境变量 可以打印全部环境变量, 也可以只打印参数中列出的环境变量 17 protect protect on start end - protect Flash from addr 'start' to addr 'end' protect on N:SF[-SL] - protect sectors SF-SL in Flash bank # N protect on bank N - protect Flash bank # N protect on all - protect all Flash banks protect off start end - make Flash from addr 'start' to addr 'end' writable protect off N:SF[-SL] - make sectors SF-SL writable in Flash bank # N protect off bank N - make Flash bank # N writable protect off all

62 - make all Flash banks writable protect 命令是对 Flash 写保护的操作, 可以使能和解除写保护 第 1 个参数 on 代表使能写保护 ;off 代表解除写保护 第 2 3 参数是指定 Flash 写保护操作范围, 跟擦除的方式相同 18 rarpboot rarpboot [loadaddress] [bootfilename] rarboot 命令可以使用 TFTP 协议通过网络启动映像 也就是把指定的文件下载到指定地址, 然后执行 第 1 个参数是映像文件下载到的内存地址 第 2 个参数是要下载执行的映像文件 19 run run var [...] - run the commands in the environment variable(s) 'var' run 命令可以执行环境变量中的命令, 后面参数可以跟几个环境变量名 20 setenv setenv name value... - set environment variable 'name' to 'value...' setenv name - delete environment variable 'name' setenv 命令可以设置环境变量 第 1 个参数是环境变量的名称 第 2 个参数是要设置的值, 如果没有第 2 个参数, 表示删除这个环境变量 21 sleep sleep N - delay execution for N seconds (N is _decimal_!!!) sleep 命令可以延迟 N 秒钟执行,N 为十进制数 22 tftpboot tftpboot [loadaddress] [bootfilename] tftpboot 命令可以使用 TFTP 协议通过网络下载文件 按照二进制文件格式下载 另外使用这个命令, 必须配置好相关的环境变量 例如 serverip 和 ipaddr 第 1 个参数 loadaddress 是下载到的内存地址 第 2 个参数是要下载的文件名称, 必须放在 TFTP 服务器相应的目录下

63 这些 U-Boot 命令为嵌入式系统提供了丰富的开发和调试功能 在 Linux 内核启动和调试过程中, 都可以用到 U-Boot 的命令 但是一般情况下, 不需要使用全部命令 比如已经支持以太网接口, 可以通过 tftpboot 命令来下载文件, 那么还有必要使用串口下载的 loadb 吗? 反过来, 如果开发板需要特殊的调试功能, 也可以添加新的命令

64 Nfs: 下载内核与挂载文件系统 一 系统网卡设置 : 1, 还回口 : 平时不开开发板时, 作为 APUE_UNP 程序的编写桥接网卡 这样就不用到 有线的以太网卡 也隔离了 WIFI 的互联网 没有网线连接的环境里也能通过 还回口 来作 宿主机 与 LINUX 虚拟机 间的连接 2, 以太网接口 : 用于 宿主机 与 LINUX 开发环境 开发板 三者间的 NFS 文件系统的挂载

65 二,LINUX 中 NFS 支持设置 : 0,IP 地址的设置 : 1, 安装 NFS : Sudo apt-get install nfs-kernel-server 2, 配置 NFS 挂载环境 :Vim /etc/exports 以上配置了 5 个目录, 方便下载 内核 和挂接 文件系统 前面是要 共享的目录 * : 允许所有的网段访问 要与后面的 () 间无空格 rw: 读写权限

66 No_root_squash:nfs 客户端共享目录使用者权限 3, 重启 NFS 服务 : 开启 NFS 服务并关闭系统防火墙 Sudo /etc/init.d/portmap restart Sudo /etc/init.d/nfs-kernel-server restart $sudo ufw status 如果为 active 则可以通过 $sudo ufw disable 关闭 Ubuntu Fire Wall 防火墙 4, 测试挂载共享目录的状态 : Showmount -e 5,UBOOT 下载内核 : UBOOT 支持 uimage : u-boot 在引导 kernel img 时需要读取 img 的前 64 字节的相关信息, 所以想用 u-boot 引导内核还必须制作 uimage(uboot Image) 1, 用 make menuconfig 获得 zimage; 2, 用 u-boot tools 中的 mkimage 处理 zimage: mkimage -A arm -O linux -T kernel -C none -a 0x e 0x n kernel d zimage uimage mkimage -n 'linux ' -A arm -O linux -T kernel -C none -a 0x e 0x d zimage.bin UImage.bin mkimage -A arm -O linux -T kernel -C none -a 0x e 0x n kernel d zimage uimage 3, 参数说明 : -A arm Architecture 架构是 arm -O linux OS 操作系统是 linux -T kernel Type 映像类型是 kernel -C none Compressed 压缩类型为无压缩 -a image 的载入地址 (hex) -e entry 内核的入口地址 (hex) -n kernel name image 的名字 -d zimage ---- 原始的 image 文件名 uimage ---- u-boot 使用的 image 文件

67 以上是转换格式 遇到错误时, 注意下面两点 : a. 内核的类型不对,mach-type 不一致 ; b. uimage 中的入口地址不对, 因为 mkimage 处理后会加入 64 字节 (0x40) 的额外信息, 所以将上方的 -e 选项后, 改为 0x , 通过 "UBOOT" 下载 uimage linux 内核 : 开启 2440 开发板 电源上电, 按 空格键 :

68 进入 UBOOT 设置菜单, 命令 :nfs :/home/niehao/work/ARM/nfs_uImages_arm/uImage_xc.bin 7, 开发板 UBOOT 挂接 NFS 文件系统 : set bootargs noinitrd root=/dev/nfs nfsroot= :/home/niehao/work/arm/nfs_romfs_2440 ip= : : : ::eth0:off init=/linuxrc console=ttysac0 nfs 服务配置 : nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf> 上面分别是 单板 IP, 服务器 IP, 网关, 子网掩码, hostname 不关心不用写 device, 如 eth0 等 ( 这是单板上的设备名 ) 最后的 off 是指 atuoconf 不需要 init=/linuxrc :init 脚本是 NFS 系统上的 linuxrc. console=ttysac0: 串口终端是 ttysac0.

69 下面是内核挂载 NFS 文件系统时的状态 : 三, 可能遇到的问题 : 1, NETDEV WATCHDOG: eth0: transmit timed out 错误 ( 网卡已工作了 ): 这并不是 NETDEV WATCHDOG 的问题, 把它关闭时, 关后网卡就不能工作了 找到了自已原来开发板的内核移植手册, 发现里面移植 DM9000 时中断号和当前 DM9000 的平台设备定义中的不一样, 所以修改了提供的内核中的代码, 更改如下 重新编译固件后就可以了 linux/arch/arm/plat-s3c24xx/common-smdk.c 在其中 DM9000 平台设备结构中修改了中断引脚 1, 调整中断号 : 参照原开发板的驱动

70 上面的宏 S3C2410_CS4 的值, 有的是其他值, 而我这里是 0x , 这是 DM9000 基地址设置 一般都是设置成片选 CS4 的基地址 0x 若这个基地址设置不正确, 则网卡无法工作 2, 在单板上通过 NFS 复制 PC 机上较大文件到目标板上的时候遇到的问题 : nfs: server *** not responding, still trying NFS 是用 UDP 传输的, 不可靠, 若是改成 TCP 传输可以避免此问题 但下面可以通过修改 读写 BUF 的大小 修改方法 : nfs mount 时候出现的 NFS 崩溃, 按照以下的方式 mount mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 这样, 在 PC 端写的 ARM 架构程序可以拿到单板上运行了, 但这不是从 NFS 文件系统启动 的, 所以需要配置 UBOOT 启动参数, 来改变文件系统的挂载 一, 由于我用的并不 100ask 的标准 2440 开发板, 所以曾经遇到过的错误 : NETDEV WATCHDOG: eth0: transmit timed out 错误 ( 网卡已工作了 ), 这并平是 NETDEV WATCHDOG 的问题, 把它关闭时, 关后网卡不能工作 找到了自已原来开发板的内核移植手册, 发现里面移植 DM9000 时中断号和老大的 DM9000 的平台设备定义中的不一样, 所以修改了老 大提供的内核中的代码, 更改如下 重新编译固件后就可以了 linux/arch/arm/plat-s3c24xx/common-smdk.c 在其中 DM9000 平台设备结构中修改了中断 引脚

71 1, 调整中断号 : 参照原开发板的驱动 : 上面的宏 S3C2410_CS4 的值, 有的是 0x , 而我这里是 0x , 这是 DM9000 基地址设置 一般都是设置成片选 CS4 的基地址 0x 若这个基 地址设置不正确, 则网卡无法工作 2, 在单板上通过 NFS 复制 PC 机上较大文件到目标板上的时候遇到的问题 : nfs: server *** not responding, still trying 修改方法 : nfs mount 时候出现的 NFS 崩溃, 按照以下的方式 mount mount -t nfs -o intr,nolock,rsize=1024,wsize= :/work/somedir /client 二, 设置 NFS 挂载 : 1, 配置 NFS 服务端 :vim /etc/exports * 号和后面的 () 间不能有空格 如只是指定一个 IP 地址来挂接, 则若 : Work/s3c2440/nfs_romfs (rw,sync,no_root_squash) Ip 与后面的参数没有空格 上面只定义了一个可以被挂接的 NFS 目录 这里可以写多个目录

72 下面是 PC 端的 NFS 文件系统目录 : 2, 单板上的挂接 : 这样, 在 PC 端写的 ARM 架构程序可以拿到单板上运行了, 但这不是从 NFS 文件系统启动 的, 所以需要配置 UBOOT 启动参数, 来改变文件系统的挂载 三, 配置 UBOOT 内核启动方式 : 1, 原来的文件系统启动参数 : 2, 修改成如下值 : noinitrd root=/dev/nfs nfsroot= :/work/nfs_root/romfs 服务器 IP 和要被挂载的 NFS 目录 ip= : : : ::eth0:off 上面分别是 单板 IP, 服务器 IP, 网关, 子网掩码, hostname 不关心不用写 device, 如 eth0 等 ( 这是单板上的设备名 ) 最后的 off 是指 atuoconf 不需要

73 init=/linuxrc init 脚本是 NFS 系统上的 linuxrc. console=ttysac0 串口终端是 ttysac0. 3, 内核成功挂载 NFS 文件系统 :

Microsoft Word - DM6467系统平台构建.doc

Microsoft Word - DM6467系统平台构建.doc 达芬奇 DM6467 评估板 系统软件平台 构建方法 Revision Table Date Rev. Author Content of revision Approval 1.0 2009-09-01 Andy,LIU Original 1 系统介绍...4 2 开发环境的建立...4 3 网络文件系统的建立...5 4 tftp 服务的建立...5 5 UBOOT 的使用...6 6 启动方式说明...8

More information

华恒家庭网关方案

华恒家庭网关方案 LINUX V1.5 1 2 1 2 LINUX WINDOWS PC VC LINUX WINDOWS LINUX 90% GUI LINUX C 3 REDHAT 9 LINUX PC TFTP/NFS http://www.hhcn.com/chinese/embedlinux-res.html minicom NFS mount C HHARM9-EDU 1 LINUX HHARM9-EDU

More information

Abstract arm linux tool-chain root NET-Start! 2

Abstract arm linux tool-chain root NET-Start! 2 Lab III - Embedding Linux 1 Abstract arm linux tool-chain root NET-Start! 2 Part 1.4 Step1. tool-chain 4 Step2. PATH 4 Part 2 kernel 5 Step1. 5 Step2... 6 Step3...8 Part 3 root. 8 Step1. 8 Step2. 8 Part

More information

(Microsoft Word - Uboot\305\344\326\303\272\315\261\340\322\353.doc)

(Microsoft Word - Uboot\305\344\326\303\272\315\261\340\322\353.doc) 刘通平 U-Boot 配置和编译 刘通平 Homepage: http://www.cs.umass.edu/~tonyliu/ 因为 U-Boot 涉及 160 多种目标板和多种 CPU, 如何生成针对具体 CPU 的目标代码? 配置就是实现这个目的, 通过配置你可以指定具体的 CPU 和目标板, 让编译程序在编译时能编译指定的文件 为了描述配置过程, 这里我们取一个现存的目标板做分析, 比如 OMAP1610

More information

DVK530/531扩展板

DVK530/531扩展板 DVK720 扩展板 驱动移植手册 2014.04.03 V1.0 版权声明 本手册所有权由深圳市微雪电子有限公司独家持有 未经本公司的书 面许可, 不得以任何方式或形式进行修改 分发或复制本文档的任何 部分, 否则一切后果由违者自负 版本更新记录 版本日期说明 V1.0 2014.04.03 初始发布 深圳市微雪电子有限公司 www.waveshare.net I 目录 版权声明... I 版本更新记录...

More information

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc 在 VMWare-5.5+RedHat-9 下建立 本机 QTopia-2.1.1 虚拟平台 张大海 2008-5-9 一 资源下载 1. 需要以下安装包 : tmake-1.13.tar.gz qtopia-free-source-2.1.1.tar.gz qt-embedded-2.3.10-free.tar.gz qt-x11-2.3.2.tar.gz qt-x11-free-3.3.4.tar.gz

More information

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor 1 4.1.1.1 (Load) 14 1.1 1 4.1.1.2 (Save) 14 1.1.1 1 4.1.2 (Buffer) 16 1.1.2 1 4.1.3 (Device) 16 1.1.3 1 4.1.3.1 (Select Device) 16 2 4.1.3.2 (Device Info) 16 2.1 2 4.1.3.3 (Adapter) 17 2.1.1 CD-ROM 2 4.1.4

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABD6C696E7578BBF9B4A1CAB5D1E92E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABD6C696E7578BBF9B4A1CAB5D1E92E646F63> 嵌 入 式 linux 基 础 实 验 1 内 核 配 置 及 编 译 1. 进 入 内 核 所 在 目 录 /opt/ruiva/xscale/linux-2.6.26 #cd /opt/ruiva/xscale/linux-2.6.26 2. 键 入 make menuconfig, 根 据 需 要 适 当 配 置 内 核 #make menuconfig 这 里 先 使 用 默 认 的 配 置,

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

Bus Hound 5

Bus Hound 5 Bus Hound 5.0 ( 1.0) 21IC 2007 7 BusHound perisoft PC hound Bus Hound 6.0 5.0 5.0 Bus Hound, IDE SCSI USB 1394 DVD Windows9X,WindowsMe,NT4.0,2000,2003,XP XP IRP Html ZIP SCSI sense USB Bus Hound 1 Bus

More information

Microsoft Word - uboot说明.doc

Microsoft Word - uboot说明.doc Amlogic U-boot 使用说明 2009.05.19 V0.02.r256 1. U-boot 概述 U-Boot, 全称 Universal Boot Loader, 是遵循 GPL 条款的开放源码项目 其源码目录 编译形式与 Linux 内核很相似 使用优点 : a) 开放源码 ; b) 支持多种嵌入式操作系统内核 ; c) 支持多个处理器系列 ; d) 较高的可靠性和稳定性 ; e)

More information

ch08.PDF

ch08.PDF 8-1 CCNA 8.1 CLI 8.1.1 8-2 8-3 8.1.21600 2500 1600 2500 / IOS 8-4 8.2 8.2.1 A 5 IP CLI 1600 2500 8-5 8.1.2-15 Windows 9598NT 2000 HyperTerminal Hilgraeve Microsoft Cisco HyperTerminal Private Edition (PE)

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

Simulator By SunLingxi 2003

Simulator By SunLingxi 2003 Simulator By SunLingxi sunlingxi@sina.com 2003 windows 2000 Tornado ping ping 1. Tornado Full Simulator...3 2....3 3. ping...6 4. Tornado Simulator BSP...6 5. VxWorks simpc...7 6. simulator...7 7. simulator

More information

Windows 2000 Server for T100

Windows 2000 Server for T100 2 1 Windows 95/98 Windows 2000 3.5 Windows NT Server 4.0 2 Windows DOS 3.5 T200 2002 RAID RAID RAID 5.1 Windows 2000 Server T200 2002 Windows 2000 Server Windows 2000 Server Windows 2000 Server 3.5 for

More information

Microsoft Word - 正文.doc

Microsoft Word - 正文.doc 1 2 1 2 3 4 5 6 7 8 9 10 3 1 150 2 150 1 1 1.1 1.1.1 1.2 1.2.1 1.2.2 1.2.3 1.3 1.3.1 1.3.2 1.4 1.4.1 CPU 1.4.2 I/O 1.4.3 I/O 1.5 1.5.1 CISC RISC 1.5.2 1.5.3 1.6 1.6.1 1.6.2 N 1.6.3 2 2.1 2.1.1 2.1.2 2.1.3

More information

. Outline 编译 Linux 在 QEMU 模拟器上运行制作带 grub 启动的磁盘映像...1 编译 Linux 在 QEMU 模拟器上运行...2 制作带 grub 启动的磁盘映像

. Outline 编译 Linux 在 QEMU 模拟器上运行制作带 grub 启动的磁盘映像...1 编译 Linux 在 QEMU 模拟器上运行...2 制作带 grub 启动的磁盘映像 .... 计算机应用教研室 @ 计算机学院嵌入式系统实验室 @ 苏州研究院中国科学技术大学 Fall 2010 . Outline 编译 Linux 在 QEMU 模拟器上运行制作带 grub 启动的磁盘映像...1 编译 Linux 在 QEMU 模拟器上运行...2 制作带 grub 启动的磁盘映像 . 编译 Linux 在 QEMU 模拟器上运行 qemu+linux-2.6.26.1. 准备模拟器.2.

More information

(Microsoft Word - Uboot\263\243\274\373\303\374\301\356.doc)

(Microsoft Word - Uboot\263\243\274\373\303\374\301\356.doc) 刘通平 U-Boot 命令 刘通平 Homepage: http://www.cs.umass.edu/~tonyliu/ U-Boot 运行稳定后, 可以用它的内部命令来查看目标系统的信息, 设置环境变量等 U-Boot 在硬件初始化完成后将进入 main_loop() 函数,main_loop() 函数将进入一个无限循环, 当用户输入命令后, 首先将调用 run_command() 函数进行处理

More information

ARM JTAG实时仿真器安装使用指南

ARM JTAG实时仿真器安装使用指南 ARM JTAG Version 1.31 2003. 11. 12 ARM JTAG ARM JTAG.3 ARM 2.1.4 2.2.4 ARM JTAG 3.1 18 3.2 18 3.2.1 Multi-ICE Server.18 3.2.2 ADS..21 ARM JTAG 4.1 Multi-ICE Server 33 4.1.1 Multi-ICE Server..... 33 4.1.2

More information

目 录

目 录 1 Quick51...1 1.1 SmartSOPC Quick51...1 1.2 Quick51...1 1.3 Quick51...2 2 Keil C51 Quick51...4 2.1 Keil C51...4 2.2 Keil C51...4 2.3 1 Keil C51...4 2.4 Flash Magic...9 2.5 ISP...9 2.6...10 2.7 Keil C51...12

More information

ICD ICD ICD ICD ICD

ICD ICD ICD ICD ICD MPLAB ICD2 MPLAB ICD2 PIC MPLAB-IDE V6.0 ICD2 usb PC RS232 MPLAB IDE PC PC 2.0 5.5V LED EEDATA MPLAB ICD2 Microchip MPLAB-IDE v6.0 Windows 95/98 Windows NT Windows 2000 www.elc-mcu.com 1 ICD2...4 1.1 ICD2...4

More information

Microsoft Word - S3c6410移植过程.doc

Microsoft Word - S3c6410移植过程.doc S3C6400/6410 移植 Android 内核 主要过程 : 安装 lunux 环境 安装编译工具 下载 Linux kernel 安装 Android SDK 获得 root file system 修改 Linux kernel 源码 配置 Linux kernel 修改 root file system 编译 Linux kernel 下载 kernel Image 1. 安装 linux

More information

untitled

untitled 2006 6 Geoframe Geoframe 4.0.3 Geoframe 1.2 1 Project Manager Project Management Create a new project Create a new project ( ) OK storage setting OK (Create charisma project extension) NO OK 2 Edit project

More information

1

1 SDT Uclinux SDT.alf.c 44blib.alf 44blib.c jtag ADS.alf.c make menuconfig make dep make clean make lib_only make user_only make romfs make image make uclinux ext2 cash lcd frambuffer 1 armsys-c uclinux

More information

IP505SM_manual_cn.doc

IP505SM_manual_cn.doc IP505SM 1 Introduction 1...4...4...4...5 LAN...5...5...6...6...7 LED...7...7 2...9...9...9 3...11...11...12...12...12...14...18 LAN...19 DHCP...20...21 4 PC...22...22 Windows...22 TCP/IP -...22 TCP/IP

More information

Microsoft Word - PS2_linux_guide_cn.doc

Microsoft Word - PS2_linux_guide_cn.doc Linux For $ONY PlayStatioin2 Unofficall General Guide Language: Simplified Chinese First Write By Beter Hans v0.1 Mail: hansb@citiz.net Version: 0.1 本 人 是 菜 鸟 + 小 白 欢 迎 指 正 错 误 之 处, 如 果 您 有 其 他 使 用 心 得

More information

C语言的应用.PDF

C语言的应用.PDF AVR C 9 1 AVR C IAR C, *.HEX, C,,! C, > 9.1 AVR C MCU,, AVR?! IAR AVR / IAR 32 ALU 1KBytes - 8MBytes (SPM ) 16 MBytes C C *var1, *var2; *var1++ = *--var2; AVR C 9 2 LD R16,-X ST Z+,R16 Auto (local

More information

ebook140-9

ebook140-9 9 VPN VPN Novell BorderManager Windows NT PPTP V P N L A V P N V N P I n t e r n e t V P N 9.1 V P N Windows 98 Windows PPTP VPN Novell BorderManager T M I P s e c Wi n d o w s I n t e r n e t I S P I

More information

NEXT SDT2.51 C:\ARM251 SDT2.51 ARM SDT 2.51 ARM PROJECT MANAGER SDT 2

NEXT SDT2.51 C:\ARM251 SDT2.51 ARM SDT 2.51 ARM PROJECT MANAGER SDT 2 S3C44B0 SDT DRAGNBOY MICROSTAR ARM 51 ARM S3C44B0 ARM SDT2.51 IAR ADS SDT2.51 S3C44B0 LEDTEST SDT ARM 1 2 SDT embed.8800.org SDT2.51 SDT2.51 ARM ARM CPU ARM SDT ADS ADS MULTI-ICE SDT JTAG JTAG SDT SDT2.51

More information

P4V88+_BIOS_CN.p65

P4V88+_BIOS_CN.p65 1 Main H/W Monitor Boot Security Exit System Overview System Time System Date [ 17:00:09] [Wed 12/22/2004] BIOS Version : P4V88+ BIOS P1.00 Processor Type : Intel (R) Pentium (R) 4 CPU 2.40 GHz Processor

More information

自由軟體教學平台

自由軟體教學平台 NCHC Opensource task force DRBL steven@nchc.gov.tw, c00hkl00@nchc.gov.tw National Center for High-Performance Computing http://www.nchc.gov.tw Jan, 2003 1 2003/1/28 ( ) 09:00-10:30 10:40-12:00 Linux 13:00-14:30

More information

epub83-1

epub83-1 C++Builder 1 C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r 1.1 1.1.1 1-1 1. 1-1 1 2. 1-1 2 A c c e s s P a r a d o x Visual FoxPro 3. / C / S 2 C + + B u i l d e r / C

More information

Chapter #

Chapter # 第三章 TCP/IP 协议栈 本章目标 通过本章的学习, 您应该掌握以下内容 : 掌握 TCP/IP 分层模型 掌握 IP 协议原理 理解 OSI 和 TCP/IP 模型的区别和联系 TCP/IP 介绍 主机 主机 Internet TCP/IP 早期的协议族 全球范围 TCP/IP 协议栈 7 6 5 4 3 应用层表示层会话层传输层网络层 应用层 主机到主机层 Internet 层 2 1 数据链路层

More information

ARM+Linux嵌入式系统开发路线

ARM+Linux嵌入式系统开发路线 嵌入式培训专家 ARM+Linux 嵌入式系统技术路线 WWW.farsight.com.cn 今天的内容 v v v ARM+Linux 嵌入式开发背景 嵌入式 Linux 系统开发技术路线 交叉编译环境 Bootloader Linux 系统移植 文件系统 Linux 应用程序的开发 Linux 系统开发模式 2 ARM+Linux 开发背景 v 与传统 Windows 开发的差异 Windows

More information

UBOOT 的编译命令直接一次性编译 make O=am335x CROSS_COMPILE=arm-arago-linux-gnueabi ARCH=arm am335x_evm 配置 make ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi- am3

UBOOT 的编译命令直接一次性编译 make O=am335x CROSS_COMPILE=arm-arago-linux-gnueabi ARCH=arm am335x_evm 配置 make ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi- am3 UBOOT 的编译命令直接一次性编译 make O=am335x CROSS_COMPILE=arm-arago-linux-gnueabi ARCH=arm am335x_evm 配置 make ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi- am335x_evm_config 编译 make ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi-

More information

P4VM800_BIOS_CN.p65

P4VM800_BIOS_CN.p65 1 Main H/W Monitor Boot Security Exit System Overview System Time System Date [ 17:00:09] [Fri 02/25/2005] BIOS Version : P4VM800 BIOS P1.00 Processor Type : Intel (R) Pentium (R) 4 CPU 2.40 GHz Processor

More information

mvc

mvc Build an application Tutor : Michael Pan Application Source codes - - Frameworks Xib files - - Resources - ( ) info.plist - UIKit Framework UIApplication Event status bar, icon... delegation [UIApplication

More information

一个开放源码的嵌入式仿真环境 ― SkyEye

一个开放源码的嵌入式仿真环境 ― SkyEye SkyEye SkyEye http://hpclab.cs.tsinghua.edu.cn/~skyeye/ I hear and I forget, I see and I remember, I do and I understand. SkyEye SkyEye SkyEye SkyEye SkyEye 1. SkyEye PC pervasive computing PC I O PDA

More information

嵌入式系统原理及应用教程 ( 第 2 版 )/ 清华大学出版社 EL-ARM-860 V1.2 一 实验目的 实验二 Boot Loader 引导程序 1. 了解 Boot Loader 的作用, 掌握 Boot Loader 的编程思想 二 实验设备 1. Pentium II 以上的 PC 机,

嵌入式系统原理及应用教程 ( 第 2 版 )/ 清华大学出版社 EL-ARM-860 V1.2 一 实验目的 实验二 Boot Loader 引导程序 1. 了解 Boot Loader 的作用, 掌握 Boot Loader 的编程思想 二 实验设备 1. Pentium II 以上的 PC 机, 一 实验目的 实验二 Boot Loader 引导程序 1. 了解 Boot Loader 的作用, 掌握 Boot Loader 的编程思想 二 实验设备 1. Pentium II 以上的 PC 机, LINUX 操作系统 三 实验内容 1. 学习 x-loader 作用和编译过程 2. 学习 uboot 作用和编译过程 3. 学习 Boot Loader 的操作 四 Bootloader 程序说明

More information

05_資源分享-NFS及NIS.doc

05_資源分享-NFS及NIS.doc 5 NFS NFS Server NFS Client NIS NIS 5-0 (Network File System, NFS) Unix NFS mount NFS... Network Information Service NIS Linux NIS NIS NIS / / /etc/passwd /etc/group NFS NIS 5-1 NFS 5-1-1 NFS NFS Network

More information

K7VT2_QIG_v3

K7VT2_QIG_v3 ............ 1 2 3 4 5 [R] : Enter Raid setup utility 6 Press[A]keytocreateRAID RAID Type: JBOD RAID 0 RAID 1: 2 7 RAID 0 Auto Create Manual Create: 2 RAID 0 Block Size: 16K 32K

More information

untitled

untitled 8086/8088 CIP /. 2004.8 ISBN 7-03-014239-X.... TP313 CIP 2004 086019 16 100717 http://www.sciencep.com * 2004 8 2004 8 1 5 500 787 1092 1/16 16 1/2 391 000 1 2 ii 1 2 CAI CAI 3 To the teacher To the student

More information

untitled

untitled 年度 路 IVI 劉 隆 年 597 598 IVI 錄... 601 行... 601... 601 1.... 601 2. 路... 602 3.... 603... 604 1.IPv4 to IPv6... 604 2.IPv6 to IPv4... 605 -... 606 ( )IVI Server... 606 ( )IVI Server... 610 ( )IVI DNS Server...

More information

WWW PHP

WWW PHP WWW PHP 2003 1 2 function function_name (parameter 1, parameter 2, parameter n ) statement list function_name sin, Sin, SIN parameter 1, parameter 2, parameter n 0 1 1 PHP HTML 3 function strcat ($left,

More information

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes 包管理理 工具 Helm 蔺礼强 Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes

More information

嵌入式系统bootloader开发移植.ppt

嵌入式系统bootloader开发移植.ppt 嵌入式培训专家 嵌入式系统引导程序开发 www.farsight.com.cn Linux Market 今天的内容 v 体系结构开发与引导程序初始化 v 引导程序功能与内核加载 v 引导程序移植与体系结构 以上内容均以 arm 体系结构 u-boot 为例 嵌入式系统定义 v 嵌入式系统是以应用为中心, 以计算机技术为基础, 并且软硬件可裁剪, 适用于应用系统对功能 可靠性 成本 体积 功耗有严格要求的专用计算机系统

More information

ebook140-8

ebook140-8 8 Microsoft VPN Windows NT 4 V P N Windows 98 Client 7 Vintage Air V P N 7 Wi n d o w s NT V P N 7 VPN ( ) 7 Novell NetWare VPN 8.1 PPTP NT4 VPN Q 154091 M i c r o s o f t Windows NT RAS [ ] Windows NT4

More information

bingdian001.com

bingdian001.com TSM12M TSM12 STM8L152C6, STM8L152R8 MSP430F5325 whym1987@126.com! /******************************************************************************* * : TSM12.c * : * : 2013/10/21 * : TSM12, STM8L f(sysclk)

More information

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1 21 , 7, Windows,,,, : 010-62782989 13501256678 13801310933,,,, ;,, ( CIP) /,,. : ;, 2005. 11 ( 21 ) ISBN 7-81082 - 634-4... - : -. TP316-44 CIP ( 2005) 123583 : : : : 100084 : 010-62776969 : 100044 : 010-51686414

More information

EK-STM32F

EK-STM32F STMEVKIT-STM32F10xx8 软 件 开 发 入 门 指 南 目 录 1 EWARM 安 装... 1 1.1 第 一 步 : 在 线 注 册... 1 1.2 第 二 步 : 下 载 软 件... 2 1.3 第 三 步 : 安 装 EWARM... 3 2 基 于 STMEVKIT-STM32F10xx8 的 示 例 代 码 运 行... 6 2.1 GPIO Demo... 6 2.2

More information

untitled

untitled V3041A-J/V3042A-J IP-SAN/NAS Infinova Infinova Infinova Infinova www.infinova.com.cn Infinova Infinova Infinova 1 2 1 2 V3041A-16R-J V3041A-24R-J V3042A-16R-J V3042A-24R-J V3049-EXD-R16 V3049-EXD-R24 ...

More information

68369 (ppp quickstart guide)

68369 (ppp quickstart guide) Printed in USA 04/02 P/N 68369 rev. B PresencePLUS Pro PC PresencePLUS Pro PresencePLUS Pro CD Pass/Fails page 2 1 1. C-PPCAM 2. PPC.. PPCAMPPCTL 3. DB9D.. STPX.. STP.. 01 Trigger Ready Power 02 03 TRIGGER

More information

(Guangzhou) AIT Co, Ltd V 110V [ ]! 2

(Guangzhou) AIT Co, Ltd V 110V [ ]! 2 (Guangzhou) AIT Co, Ltd 020-84106666 020-84106688 http://wwwlenxcn Xi III Zebra XI III 1 (Guangzhou) AIT Co, Ltd 020-84106666 020-84106688 http://wwwlenxcn 230V 110V [ ]! 2 (Guangzhou) AIT Co, Ltd 020-84106666

More information

untitled

untitled V3049A-EXD IP-SAN/NAS Infinova Infinova Infinova Infinova www.infinova.com.cn Infinova Infinova Infinova 1 2 1 2 V3049A-EXD-R16 V3049A-EXD-R24 ... 1 1.1... 1 1.2... 1 1.3... 1... 2 2.1... 2 2.2... 3...

More information

Microsoft Word - YL-9G45_LINUX_烧写测试使用手册.doc

Microsoft Word - YL-9G45_LINUX_烧写测试使用手册.doc YL-9G45 开 发 板 烧 写 测 试 手 册 Version :0.10 2010 3 23 1 修 改 序 号 修 改 后 版 本 修 改 日 期 修 改 说 明 修 改 人 1 V0.10 2010-3-23 Cs 2 3 4 5 6 7 8 9 (754970706@qq.com) 2 目 录 1 综 述...4 1.1 主 要 内 容...4 1.2 参 考 资 料...4 2 SAM-BA

More information

untitled

untitled http://www.embedded-soc.com/ J-LINK J-Link Rev2.1 http://www.embedded-soc.com/ 2007-11-11 http://www.embedded-soc.com/ J-LINK J-Link ARM JTAG J-LINK J-LINKJLINK J-FLASH ARM F.A.Q jlink GDBserver J-Flash

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha CYPOK CYPOK 1 UltraEdit Project-->Install Language Tool: Language Suite----->hi-tech picc Tool Name ---->PICC Compiler Executable ---->c:hi-picinpicc.exe ( Command-line Project-->New Project-->File Name--->myc

More information

第 1 页共 9 页 文档履历 版本号日期制 / 修订人内容描述 V 正式版本

第 1 页共 9 页 文档履历 版本号日期制 / 修订人内容描述 V 正式版本 V3s 项目 CamDroid 编译第三方程序 / V1.0 第 1 页共 9 页 文档履历 版本号日期制 / 修订人内容描述 V1.0 2014-04-23 正式版本 第 2 页共 9 页 目录 1. 交叉编译环境... 3 2. 第三方库的 Makefile 示例... 4 3. 第三方应用 Makefile 示例... 5 4. 第三方应用 CamLinux.mk 示例... 6 5. 常见错误...

More information

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2

More information

Microsoft PowerPoint - BECKHOFF技术_ADS通讯 [Compatibility Mode]

Microsoft PowerPoint - BECKHOFF技术_ADS通讯 [Compatibility Mode] 的架构 ADS 的通讯机制 ADS-Client Request -> Confirmation Indication

More information

嵌入式系统实验报告之一

嵌入式系统实验报告之一 南京航空航天大学 嵌入式系统综合实验报告 Qtopia 在 S3C2440 开发板上的移植 040630520 彭立勋 2009.05 一 实验目的 1. 熟悉 ARM 体系结构 ; 2. 熟悉 Qtopia 图形环境 二 实验内容 将 Qtopia 图形环境移植到 FriendlyARM QQ2440 开发板 三 预备知识 Qtopia 的体系结构 四 实验设备及工具 硬件 :QQ2440 开发板

More information

ARM学习报告003——Bios源码分析.doc

ARM学习报告003——Bios源码分析.doc ARM 003 Hayden Luo BIOS duyunhai@hotmail.com www.seajia.com - 1 - www.seajia.com Hayden Luo Bios BootLoader BIOS ARM 003 2004-5-25 003 Bootloader uclinux ARM 51 51 ARM ARM ARM 001 002 003 ARM 001 http://bbs.edw.com.cn/dispbbs.asp?boardid=20&id=28310&page=1

More information

Symantec™ Sygate Enterprise Protection 防护代理安装使用指南

Symantec™ Sygate Enterprise Protection 防护代理安装使用指南 Symantec Sygate Enterprise Protection 防 护 代 理 安 装 使 用 指 南 5.1 版 版 权 信 息 Copyright 2005 Symantec Corporation. 2005 年 Symantec Corporation 版 权 所 有 All rights reserved. 保 留 所 有 权 利 Symantec Symantec 徽 标 Sygate

More information

untitled

untitled MODBUS 1 MODBUS...1 1...4 1.1...4 1.2...4 1.3...4 1.4... 2...5 2.1...5 2.2...5 3...6 3.1 OPENSERIAL...6 3.2 CLOSESERIAL...8 3.3 RDMULTIBIT...8 3.4 RDMULTIWORD...9 3.5 WRTONEBIT...11 3.6 WRTONEWORD...12

More information

AL-M200 Series

AL-M200 Series NPD4754-00 TC ( ) Windows 7 1. [Start ( )] [Control Panel ()] [Network and Internet ( )] 2. [Network and Sharing Center ( )] 3. [Change adapter settings ( )] 4. 3 Windows XP 1. [Start ( )] [Control Panel

More information

Converting image (bmp/jpg) file into binary format

Converting image (bmp/jpg) file into binary format RAiO Image Tool 操作说明 Version 1.0 July 26, 2016 RAiO Technology Inc. Copyright RAiO Technology Inc. 2013 RAiO TECHNOLOGY INC. www.raio.com.tw Revise History Version Date Description 0.1 September 01, 2014

More information

Microsoft Word - linux命令及建议.doc

Microsoft Word - linux命令及建议.doc Linux 操 作 系 统 命 令 集 1 基 本 命 令 查 看 系 统 信 息 : uname -a 修 改 密 码 : passwd 退 出 : logout(exit) 获 取 帮 助 : man commands 2 文 件 和 目 录 命 令 显 示 当 前 工 作 目 录 : pwd 改 变 所 在 目 录 : cd cd - 切 换 到 上 一 次 使 用 的 目 录 cd 切 换

More information

DVK530/531扩展板

DVK530/531扩展板 DVK710 扩展板 驱动移植手册 2014.06.03 V1.0 版权声明 本手册所有权由深圳市微雪电子有限公司独家持有 未经本公司的书 面许可, 不得以任何方式或形式进行修改 分发或复制本文档的任何 部分, 否则一切后果由违者自负 版本更新记录 版本日期说明 V1.0 2014.06.03 初始发布 深圳市微雪电子有限公司 www.waveshare.netii I 目录版权声明... I 版本更新记录...

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1.

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE Project Properties IDE makefile 1. Oracle Solaris Studio 12.2 IDE 2010 9 2 8 9 10 11 13 20 26 28 30 32 33 Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1. "File" > "New

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

User ID 150 Password - User ID 150 Password Mon- Cam-- Invalid Terminal Mode No User Terminal Mode No User Mon- Cam-- 2

User ID 150 Password - User ID 150 Password Mon- Cam-- Invalid Terminal Mode No User Terminal Mode No User Mon- Cam-- 2 Terminal Mode No User User ID 150 Password - User ID 150 Password Mon- Cam-- Invalid Terminal Mode No User Terminal Mode No User Mon- Cam-- 2 Mon1 Cam-- Mon- Cam-- Prohibited M04 Mon1 Cam03 Mon1 Cam03

More information

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; Memory & Pointer trio@seu.edu.cn 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,

More information

els0xu_zh_nf_v8.book Page Wednesday, June, 009 9:5 AM ELS-0/0C.8

els0xu_zh_nf_v8.book Page Wednesday, June, 009 9:5 AM ELS-0/0C.8 els0xu_zh_nf_v8.book Page Wednesday, June, 009 9:5 AM ELS-0/0C.8 Yamaha ELS-0/0C..8 LCD ELS-0/0C v. typeu LCD ELS-0/0C typeu / -6 / [SEARCH] / - ZH ELS-0/0C.8 els0xu_zh_nf_v8.book Page Wednesday, June,

More information

static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, ; #defineled1_on() (GPBDAT &= ~0x1) #def

static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, ; #defineled1_on() (GPBDAT &= ~0x1) #def Kaise s 2410 Board setting [1]. Device Driver Device Driver Linux s Kernel ARM s kernel s3c2410_kernel2.4.18_r1.1_change.tar.bz2 /usr/src (1) #cd /usr/src (2) #tar xfj s3c2410_kernel2.4.18_r1.1_change.tar.bz2

More information

epub

epub 3 Cisco 3.1 S e t u p C i s c o C i s c o Cisco IOS C i s c o 3.2 Te l n e t T F T P 3-1 3-1 configure terminal configure memory Configure network t e l n e t < C t r l - Z > conf t N V R A M T F T P I

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

Linux服务器构建与运维管理

Linux服务器构建与运维管理 1 Linux 服务器构建与运维管理 第 2 章 :Linux 基本命令 阮晓龙 13938213680 / rxl@hactcm.edu.cn http://linux.xg.hactcm.edu.cn http://www.51xueweb.cn 河南中医药大学管理科学与工程学科 2018.3 2 提纲 目录与文件的操作 mkdir touch mv cp rm rmdir file tree

More information

USB - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - DES Module FSM CONTROLLER 8 6 8 Key ROM 8 8 Data_in RAM Data_out RAM 8 USB Board - 8 - - 9 - - 10 - - 11 - - 12 - USB device INF Windows INF Device Function

More information

Microsoft Word - template.doc

Microsoft Word - template.doc HGC efax Service User Guide I. Getting Started Page 1 II. Fax Forward Page 2 4 III. Web Viewing Page 5 7 IV. General Management Page 8 12 V. Help Desk Page 13 VI. Logout Page 13 Page 0 I. Getting Started

More information

Microsoft Word - AmlogicLinux_StartGuide_1.doc

Microsoft Word - AmlogicLinux_StartGuide_1.doc Amlogic Linux User Guide (1) Boot Up AMLOGIC, Inc. 3930 Freedom Circle Santa Clara, CA 95054 U.S.A. www.amlogic.com AMLOGIC reserves the right to change any information described herein at any time without

More information

untitled

untitled 1....2...2...6 2....10 3. UDP...15 4. TCP...16...16...16 1 1. PC COM1 COM2 COM1 COM2 DTU 2 3 4 COM1 COM1 COM2 COM ID 13900000000 DTU COM1 5 COM2 DTU DTU DTU DTU DTU DTU DTU ID ID 3031 3032 2 ID 13900000001

More information

1.ai

1.ai HDMI camera ARTRAY CO,. LTD Introduction Thank you for purchasing the ARTCAM HDMI camera series. This manual shows the direction how to use the viewer software. Please refer other instructions or contact

More information

Outline 制作带 grub 启动的磁盘映像 利用 qemu+gdb 来调试 linux

Outline 制作带 grub 启动的磁盘映像 利用 qemu+gdb 来调试 linux Linux 操作系统分析 陈香兰 (xlanchen@ustc.edu.cn) 计算机应用教研室 @ 计算机学院嵌入式系统实验室 @ 苏州研究院中国科学技术大学 Spring 2011 Outline 制作带 grub 启动的磁盘映像 利用 qemu+gdb 来调试 linux qemu+linux-2.6.26 1. 准备模拟器 2. 编译 Linux 内核 3. 准备根文件系统 1 准备模拟器

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP

TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP TCP/IP : TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP 1. ASCII EBCDIC Extended Binary-Coded Decimal Interchange Code 2. / (1) (2) Single System Image SSI) (3) I/O (4) 3.OSI OSI Open System Interconnection

More information

RAID RAID 0 RAID 1 RAID 5 RAID * ( -1)* ( /2)* No Yes Yes Yes A. B. BIOS SATA C. RAID BIOS RAID ( ) D. SATA RAID/AHCI ( ) SATA M.2 SSD ( )

RAID RAID 0 RAID 1 RAID 5 RAID * ( -1)* ( /2)* No Yes Yes Yes A. B. BIOS SATA C. RAID BIOS RAID ( ) D. SATA RAID/AHCI ( ) SATA M.2 SSD ( ) RAID RAID 0 RAID 1 RAID 5 RAID 10 2 2 3 4 * (-1)* (/2)* No Yes Yes Yes A. B. BIOS SATA C. RAID BIOS RAID ( ) D. SATA RAID/AHCI ( ) SATA M.2 SSD ( ) ( ) ( ) Windows USB 1 SATA A. SATASATAIntel SATA (SATA3

More information

Serial ATA ( nvidia nforce4 Ultra/SLI)...2 (1) SATA... 2 (2) B I O S S A T A... 3 (3) RAID BIOS RAID... 6 (4) S A T A... 9 (5) S A T A (6) Micro

Serial ATA ( nvidia nforce4 Ultra/SLI)...2 (1) SATA... 2 (2) B I O S S A T A... 3 (3) RAID BIOS RAID... 6 (4) S A T A... 9 (5) S A T A (6) Micro Serial ATA ( nvidia nforce4 Ultra/SLI)...2 (1) SATA... 2 (2) B I O S S A T A... 3 (3) RAID BIOS RAID... 6 (4) S A T A... 9 (5) S A T A... 11 (6) Microsoft Windows 2000... 14 Ác Åé å Serial ATA ( nvidia

More information

D. 192.168.5.32 E. 192.168.5.14 答 案 :C 3. 工 作 站 A 配 置 的 IP 地 址 为 192.0.2.24/28. 工 作 站 B 配 置 的 IP 地 址 为 192.0.2.100/28. 两 个 工 作 站 之 间 有 直 通 线 连 接, 两 台

D. 192.168.5.32 E. 192.168.5.14 答 案 :C 3. 工 作 站 A 配 置 的 IP 地 址 为 192.0.2.24/28. 工 作 站 B 配 置 的 IP 地 址 为 192.0.2.100/28. 两 个 工 作 站 之 间 有 直 通 线 连 接, 两 台 CCNP 学 前 测 试 题 都 选 自 官 方 的 全 真 考 试 题, 共 100 道 题 实 际 测 试 选 60 道 题, 同 官 方 正 式 考 题 数 目 基 本 一 致, 因 此 等 于 是 模 拟 考 试, 采 用 网 上 形 式 进 行 测 评 学 前 测 评 目 的 是 为 了 检 验 大 家 对 CCNA 阶 段 知 识 掌 握 的 程 度, 同 时 对 CCNA 最 核 心

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

Serial ATA ( Nvidia nforce430)...2 (1) SATA... 2 (2) B I O S S A T A... 3 (3) RAID BIOS RAID... 6 (4) S A T A... 9 (5) S A T A (6) Microsoft Win

Serial ATA ( Nvidia nforce430)...2 (1) SATA... 2 (2) B I O S S A T A... 3 (3) RAID BIOS RAID... 6 (4) S A T A... 9 (5) S A T A (6) Microsoft Win Serial ATA ( Nvidia nforce430)...2 (1) SATA... 2 (2) B I O S S A T A... 3 (3) RAID BIOS RAID... 6 (4) S A T A... 9 (5) S A T A... 11 (6) Microsoft Windows 2000... 14 Ác Åé å Serial ATA ( Nvidia nforce430)

More information

2009 保 留 一 切 权 利 非 经 本 公 司 书 面 许 可, 任 何 单 位 和 个 人 不 得 擅 自 摘 抄 复 制 本 文 档 内 容 的 部 分 或 全 部, 并 不 得 以 任 何 形 式 传 播 商 标 声 明 海 思 和 其 他 海 思 商 标 均 为 深 圳 市 海 思 半

2009 保 留 一 切 权 利 非 经 本 公 司 书 面 许 可, 任 何 单 位 和 个 人 不 得 擅 自 摘 抄 复 制 本 文 档 内 容 的 部 分 或 全 部, 并 不 得 以 任 何 形 式 传 播 商 标 声 明 海 思 和 其 他 海 思 商 标 均 为 深 圳 市 海 思 半 文 档 版 本 00B01 发 布 日 期 2009-08-31 2009 保 留 一 切 权 利 非 经 本 公 司 书 面 许 可, 任 何 单 位 和 个 人 不 得 擅 自 摘 抄 复 制 本 文 档 内 容 的 部 分 或 全 部, 并 不 得 以 任 何 形 式 传 播 商 标 声 明 海 思 和 其 他 海 思 商 标 均 为 深 圳 市 海 思 半 导 体 有 限 公 司 的 商 标

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63> 因 为 路 过 你 的 路, 因 为 苦 过 你 的 苦, 所 以 快 乐 着 你 的 快 乐, 追 逐 着 你 的 追 逐 内 容 简 介 本 书 根 据 2005 年 下 半 年 实 施 的 全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 嵌 入 式 系 统 设 计 师 级 考 试 大 纲 精 神, 在 深 入 研 究 历 年 计 算 机 技 术 与 软

More information

Guide to Install SATA Hard Disks

Guide to Install SATA Hard Disks SATA RAID 1. SATA. 2 1.1 SATA. 2 1.2 SATA 2 2. RAID (RAID 0 / RAID 1 / JBOD).. 4 2.1 RAID. 4 2.2 RAID 5 2.3 RAID 0 6 2.4 RAID 1.. 10 2.5 JBOD.. 16 3. Windows 2000 / Windows XP 20 1. SATA 1.1 SATA Serial

More information

IT (1) IDE... 2 (2) BIOS IDE RAID... 3 (3) RAID BIOS RAID... 5 (4) R A I D (5) ID E RA ID... 15

IT (1) IDE... 2 (2) BIOS IDE RAID... 3 (3) RAID BIOS RAID... 5 (4) R A I D (5) ID E RA ID... 15 IT8212...2 (1) IDE... 2 (2) BIOS IDE RAID... 3 (3) RAID BIOS RAID... 5 (4) R A I D... 13 (5) ID E RA ID... 15 Ác Åé å IT8212 (1) IDE (2) BIOS IDE RAID (3) RAID BIOS RAID (4) RAID (5) RAID (a) ( )IDE (

More information

声 明 Copyright 2010 杭 州 华 三 通 信 技 术 有 限 公 司 及 其 许 可 者 版 权 所 有, 保 留 一 切 权 利 未 经 本 公 司 书 面 许 可, 任 何 单 位 和 个 人 不 得 擅 自 摘 抄 复 制 本 书 内 容 的 部 分 或 全 部, 并 不 得

声 明 Copyright 2010 杭 州 华 三 通 信 技 术 有 限 公 司 及 其 许 可 者 版 权 所 有, 保 留 一 切 权 利 未 经 本 公 司 书 面 许 可, 任 何 单 位 和 个 人 不 得 擅 自 摘 抄 复 制 本 书 内 容 的 部 分 或 全 部, 并 不 得 H3C E528&E552 以 太 网 交 换 机 安 装 手 册 杭 州 华 三 通 信 技 术 有 限 公 司 http://www.h3c.com.cn 资 料 版 本 :20100427-5W100 声 明 Copyright 2010 杭 州 华 三 通 信 技 术 有 限 公 司 及 其 许 可 者 版 权 所 有, 保 留 一 切 权 利 未 经 本 公 司 书 面 许 可, 任 何

More information