You are on page 1of 12

쟥 풶 쫐 병 뗄 쏀뗧 ퟓ 뿆 벼 폐 쿞 릫 쮾

GADMEI ELECTRONICS TECHNOLOGY CO., LTD.

Seekfor eDOS v1.0 移 植 指 南


Seekfor eDOS v1.0 移 植 非 常 方 便 ,有 的 时 候 甚 至 只 需 要 更 改 几 个 头 文 件 中 的 宏 定 义
即 可 .在 kernel 代 码 中 ,所 有 和 硬 件 相 关 的 功 能 都 做 成 了 全 局 变 量 和 函 数 指 针 的 形 式 ,而 且 所
有 的 初 始 化 都 是 在 main.c 中 .因 此 ,要 成 功 移 植 eDOS 到 不 同 的 硬 件 系 统 ,只 需 要 更 改
main.c 中 部 分 功 能 定 义 即 可 !

第 一 章 Seekfor eDOS v1.0 的 硬 件 需 求


<1> Seekfor eDOS v1.0 支 持 哪 些 系 列 的 CPU?
eDOS 需 要 运 行 在 冯 .诺 依 曼 体 系 的 CPU 上 ,这 种 CPU 数 据 和 指 令 地 址 共 用 ,因
此 可 以 把 ROM 中 的 代 码 拷 贝 到 RAM(SRAM 或 者 SDRAM)中 运 行 .这 种 CPU 典 型 的 如 ARM
和 X86.
<2> Seekfor eDOS v1.0 需 要 什 么 样 的 硬 件 设 备 条 件 ?
要 成 功 移 植 eDOS 到 新 的 硬 件 环 境 中 ,新 环 境 至 少 需 要 提 供 4M 以 上 的 RAM,能
提 供 一 个 正 常 工 作 的 stdin 设 备 (如 CPU 的 UART,键 盘 等 )和 一 个 正 常 工 作 的 stdout 设 备
(如 CPU 的 UART,CRT,LCD 等 ).stdin 是 eDOS 的 输 入 设 备 ,stdout 是 eDOS 的 输 出 设 备 ,
因 此 ,这 两 个 设 备 工 作 不 正 常 都 会 导 致 eDOS 无 法 运 行 shell.另 外 ,硬 件 环 境 还 应 该 提 供 如
NAND flash,SD 卡 之 类 的 存 储 器 设 备 ,实 现 数 据 的 掉 电 保 存 (如 果 没 有 这 些 设 备 ,eDOS 可 以
利 用 RAM 来 虚 拟 一 个 存 储 器 ,这 会 消 耗 部 分 RAM).
<3>Seekfor eDOS v1.0 的 RAM 内 存 映 射
用 eDOS for S3C2410 为 例 :RAM 开 始 地 址 是 0x30000000,动 态 内 存 大 小 设 置
为 8M,则 RAM 空 间 的 占 用 情 况 如 下 :
0x30000000~0x301fffff(2M 空 间 ) 保 留 为 eDOS 内 存 空 间 , 移 植 代 码 包 括
RO,RW,ZI 必 须 在 2M 范 围 内 (如 果 移 植 确 实 还 需 要 比 较 大 的 RAM 空 间 的 话 ,建 议 用
malloc()获 取 指 针 而 不 是 用 静 态 数 组 的 方 法 )
0x30200000~0x309fffff(8M 空 间 ),这 是 动 态 内 存 区 ,这 个 区 域 大 小 可 以 在 移 植
eDOS 的 时 候 在 main.c 或 者 dos_cfg.h 中 指 定 大 小 .
0x30a00000~RAM 最 顶 端 ,地 址 低 端 可 能 是 用 户 的 内 存 驻 留 程 序 (TSR 程 序 ),紧
接 着 就 是 exe 文 件 和 com 文 件 的 加 载 地 址 ,每 次 加 载 一 个 exe 文 件 ,都 是 先 把 所 有 的 代 码
copy 到 这 个 地 址 ,然 后 初 始 化 RW 段 和 ZI 段 .

第 二 章 Seekfor eDOS v1.0 的 软 件 架 构


eDOS v1.0 提 供 给 用 户 一 个 eDOS.a(库 文 件 )和 main.c(初 始 化 文 件 ),以 及 对 应 eDOS 内 核
代 码 的 *.h 文 件 .用 户 需 要 提 供 初 始 化 文 件 (如 S3C2410 的 2410init.s 等 ),用 来 完 成 C 环 境
设 置 ,中 断 设 置 和 堆 栈 设 置 (在 ARM 下 ,一 般 用 标 准 的 2410init.s,44b0init.s 等 即 可 完 成 ),
设 置 完 成 后 直 接 调 用 或 跳 转 到 main.c()中 的 main()函 数 即 可 .
请 看 eDOS for S3C2410 的 工 程 设 置 图 :

第 1 页 共 1 页

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


쟥 풶 쫐 병 뗄 쏀뗧 ퟓ 뿆 벼 폐 쿞 릫 쮾
GADMEI ELECTRONICS TECHNOLOGY CO., LTD.

kernel 下 只 有 eDOS.a 和 main.c 两 个 文 件 ,S3C2410 下 有 2410init.s 等 众 多 文 件 .事 实 上 这 些 文 件 基 本 上 是 设 备


驱 动 文 件 ,和 移 植 有 关 的 文 件 只 有 2410init.s 和 chips.c.2410init.s 实 现 硬 件 环 境 初 始 化 并 跳 转 到 main.c 中 的
main(), chips.c 通 过 调 用 eDOS 的 API 添 加 所 有 的 设 备 到 系 统 中 .其 中 的 2410init.s 直 接 采 用 标 准 2410 开 发 板 中
的 代 码 ,只 不 过 把 ” BL Main” 代 码 更 改 为 ” BL main” 即 可 .

简 单 的 来 说 ,移 植 eDOS 需 要 以 下 几 步 :
(1) 编 写 初 始 化 文 件 (如 上 例 的 2410init.s),实 现 硬 件 环 境 初 始 化 ,并 跳 转 到
main()执 行
(2) 编 写 和 硬 件 相 关 的 设 备 驱 动 程 序 ,关 键 是 编 写 好 stdin 和 stdout 驱 动 程 序
(3) 在 DOS_cfg.h 中 重 新 定 义 必 要 的 功 能 需 求 (如 硬 件 中 无 NAND flash 等 存 储
器 设 备 ,则 必 须 定 义 SUPPORT_RAM=1 来 加 入 一 个 RAM 虚 拟 盘 )
先 看 一 下 main.c 中 的 代 码 :
int main()
{
/*必 须 先 设 置 好 系 统 参 数 */
SYSPARAMS_init();
/*在 这 里 调 用 和 CPU 相 关 的 硬 件 初 始 化 等 */
#ifdef CHIPS_init
CHIPS_init();
#endif
/*如 果 用 户 希 望 支 持 RAM 磁 盘 ,则 初 始 化 一 个 RAM 盘 到 系 统 中 */
#if(SUPPORT_RAM==1)

第 2 页 共 2 页

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


쟥 풶 쫐 병 뗄 쏀뗧 ퟓ 뿆 벼 폐 쿞 릫 쮾
GADMEI ELECTRONICS TECHNOLOGY CO., LTD.

RAM_init();
#endif
/*如 果 用 户 系 统 包 含 LCD 等 点 阵 显 示 类 驱 动 器 ,则 挂 接 一 个 LCD:设 备 到 系 统 中 (在
CHIPS_init()中 必 须 先 初 始 化 )*/
#if(SUPPORT_GRAPHICS==1)
Device_install("LCD:",WRITEABLE,(DEVICE_OPEN)Device_CommonOpe
n,(DEVICE_CLOSE)Device_CommonClose,(DEVICE_READ)0,(DEVICE_WRITE)
LCD_Write,(DEVICE_ESCAPE)LCD_Escape);
#endif
/*自 定 义 STDIO 使 用 的 设 备 */
STDIO_init();
#if(SUPPORT_SHELL==1)
shell();
#else
printf("Warnning:no SHELL!Please adds your code here!\r\nSystem
Halted!\r\n");
while(1);
#endif
return 0;
}
以 上 代 码 分 别 执 行 如 下 过 程 :
(1) SYSPARAMS_init() 初 始 化 系 统 参 数 , 有 些 参 数 必 须 设 置 正 确 如
ram_start_addr(RAM 开 始 地 址 )等
(2) CHIPS_init()是 用 户 自 定 义 的 初 始 化 函 数 ,CHIPS_init 实 际 上 是 DOS_cfg.h 中
的 一 个 宏
(3) RAM_init()实 现 把 一 个 固 定 大 小 的 RAM 区 域 虚 拟 为 一 个 磁 盘 驱 动 器 ,如 果 用 户
在 CHIPS_init()中 加 入 了 别 的 磁 盘 驱 动 器 ,可 以 关 闭 SUPPORT_RAM 实 现 小 的
RAM 需 求
(4) Device_install(… ..)实 现 安 装 一 个 一 个 LCD 驱 动 器 到 系 统 中 ,这 个 LCD 驱 动 已
经 在 eDOS 内 部 集 成 ,用 户 只 需 要 在 CHIPS_init()中 通 过 调 用 initgraph()设 置
好 写 点 和 读 点 的 函 数 指 针 即 可 实 现 LCD 输 出 .
(5) STDIO_init()实 现 加 载 stdin,stdout,stderr 驱 动 .因 此 在 这 之 前 ,所 有 的 设 备 驱
动 都 应 该 安 装 完 毕 (一 般 在 CHIPS_init()中 完 成 即 可 )
(6) 最 后 ,如 果 使 用 eDOS 的 shell 功 能 ,则 跳 到 shell()中 执 行 ,否 则 需 要 自 己 在 这 里
添 加 代 码 实 现 其 他 功 能 .

第 3 页 共 3 页

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


쟥 풶 쫐 병 뗄 쏀뗧 ퟓ 뿆 벼 폐 쿞 릫 쮾
GADMEI ELECTRONICS TECHNOLOGY CO., LTD.

Main.c 中 的 代 码 除 非 用 户 需 要 添 加 功 能 ,否 则 一 般 不 需 要 更 改 .要 实 现 自 定 义 功 能 ,只 需 要
在 DOS_cfg.h 中 定 义 必 要 的 宏 即 可 .下 面 详 细 分 析 一 下 dos_cfg.h 中 的 宏 .
用 户 可 以 自 定 义 的 部 分 有 :
(1) #define SUPPORT_RAM 1
#if(SUPPORT_RAM==1)
#define RAM_BYTES_PER_SECTOR 512
#define RAM_SECOTR_TOTAL 4096
/*RAM 参 数 :FAT16,512 字 节 每 扇 区 ,首 扇 区 从 0 扇 区 开 始 ,共 4096 个 扇 区 (2M
空 间 )*/
#define RAM_PARAMS
{0,RAM_BYTES_PER_SECTOR,0,RAM_SECOTR_TOTAL,0,RAM_read,RAM_write
,0}
#endif
以 上 几 行 代 码 实 现 是 否 在 eDOS 中 加 入 RAM 盘 ,以 及 RAM 盘 的 规 格 ,这 里 的 含 义 是
支 持 RAM 盘 ,RAM 盘 是 512 字 节 /扇 区 ,共 4096 个 扇 区 ,消 耗 的 RAM 是 512*4096=2M
字 节 .(注 ,一 般 在 硬 件 系 统 不 含 NAND flash,SD,HDD 等 存 储 设 备 的 时 候 才 打 开 这 个 开 关 而
且 这 时 候 必 须 打 开 这 个 开 关 ),这 些 宏 在 main.c 中 的 RAM_init()中 使 用 .
(2) /*stdin,stdout,stderr 使 用 的 设 备 */
#define STDOUT_USING "LCD:"
#define STDIN_USING "COM1:"
#define STDERR_USING "COM1:”
这 几 个 定 义 是 确 定 标 准 输 入 输 出 使 用 哪 一 个 设 备 .必 须 使 用 在 Device_install()中
成 功 安 装 的 设 备 驱 动 名 (这 个 工 作 一 般 在 CHIPS_init()中 完 成 )!这 几 个 宏 在 main.c 中 的
STDIO_init()中 使 用 !
(3) /*控 制 台 程 序 */
#define CONSOLE_USING CONSOLE_OTHER
当 stdout 是 UART 并 且 在 PC 上 显 示 时 ,定 义 这 个 宏 用 来 表 示 上 位 机 程 序 用
dnw.exe 还 是 Windows 的 超 级 终 端 程 序 ,如 果 stdout 不 是 UART(如 上 例 是 LCD)则 不 定
义 都 行 .值 在 stdio.h 中 有 定 义 ,该 宏 在 main.c 中 的 SYSPARAMS_init()中 使 用 !
(4) /*RAM 空 间 开 始 地 址 */
#define RAM_START_ADDR 0x30000000
定 义 硬 件 设 备 的 内 存 开 始 地 址 ,这 个 值 必 须 和 硬 件 环 境 相 同 ,否 则 默 认 是
0x00000000,这 会 导 致 错 误 . 该 宏 在 main.c 中 的 SYSPARAMS_init()中 使 用 !
(5) /*动 态 分 配 RAM 大 小 ,8M Bytes*/
#define MALLOC_SIZE (1024*1024*8)

第 4 页 共 4 页

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


쟥 풶 쫐 병 뗄 쏀뗧 ퟓ 뿆 벼 폐 쿞 릫 쮾
GADMEI ELECTRONICS TECHNOLOGY CO., LTD.

定 义 系 统 使 用 的 动 态 空 间 大 小 ,默 认 是 64K 空 间 ,一 般 最 少 定 义 在 1M,看 系 统 需 求 而
定 . 该 宏 在 main.c 中 的 SYSPARAMS_init()中 使 用 !
(6) /*执 行 代 码 是 否 可 以 load 到 任 意 空 间 运 行 */
#define REALLOCATABLE 0
定 义 CPU 是 否 支 持 把 exe 文 件 load 到 任 意 地 址 运 行 ,0=不 支 持 ,1=支 持 ,ARM 一
般 是 0,X86 可 以 是 1*/
(7) /*CPU 初 始 化 ,如 果 不 需 要 ,屏 蔽 此 宏 定 义 即 可 */
#define CHIPS_init S3C2410_init
定 义 硬 件 相 关 的 初 始 化 函 数 名 称 ,移 植 时 一 般 都 在 这 个 函 数 里 面 加 载 所 有 的 设 备 驱
动 程 序 .
(8) /*定 义 和 上 位 机 通 讯 的 fread(),fwrite()函 数 */
#define CONNECT_fwrite COM1_Write
#define CONNECT_fread COM1_Read
定 义 和 PC 通 讯 的 两 个 函 数 ,如 果 不 定 义 则 remotedisks.exe 无 法 联 机 !
(9) #define EXECUTE_CALLBACK CACHE_CLEAR
这 是 定 义 在 exec()函 数 执 行 一 个 exe 或 com 文 件 前 调 用 的 一 个 函 数 指 针 .在 ARM
下 因 为 使 用 了 指 令 cache,所 以 在 运 行 exe,com 文 件 前 必 须 清 空 指 令 cache,否 则 程 序 运 行
不 正 常 ,当 然 也 可 以 设 置 一 个 函 数 来 做 其 他 的 工 作 !
(10)
/*和 CPU 有 关 的 API 重 定 义 ,如 果 CPU 不 能 实 现 对 应 的 功 能 ,则 把 宏 定 义 屏 蔽 即 可
*/
#define getdate RTC_getdate
#define gettime RTC_gettime
#define setdate RTC_setdate
#define settime RTC_settime

#define enable _enable


#define disable _disable
#define getvect _getvect
#define setvect _setvect
这 些 是 CPU 特 殊 功 能 API,不 定 义 也 可 以 ,但 会 导 致 对 应 的 API 执 行 无 功 能 !
从 以 上 代 码 可 以 看 出 ,要 移 植 eDOS 到 不 同 的 硬 件 环 境 ,所 做 的 工 作 非 常 少 ,只 需 要 更 改 部
分 宏 定 义 ,加 入 部 分 设 备 驱 动 即 可 !下 面 详 细 叙 述 一 下 eDOS 的 设 备 驱 动 格 式 和 安 装 方 法 .

第 5 页 共 5 页

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


쟥 풶 쫐 병 뗄 쏀뗧 ퟓ 뿆 벼 폐 쿞 릫 쮾
GADMEI ELECTRONICS TECHNOLOGY CO., LTD.

第 三 章 Seekfor eDOS v1.0 的 设 备 驱 动 格 式


eDOS 一 个 重 要 的 功 能 就 是 硬 件 设 备 的 文 件 化 ,标 准 化 .eDOS 内 部 区 分 两 种 文 件 , 一 种 是 磁
盘 文 件 , 另 外 一 种 是 设 备 文 件 . 设 备 文 件 是 虚 拟 的 文 件 , 可 以 通 过 fopen()打 开 驱 动 , 用
fread()读 驱 动 信 息 或 数 据 , 用 fwrite()写 数 据 给 驱 动 , 用 fclose()关 闭 驱 动 等 . 一 般 情 况
下 , 设 备 文 件 需 要 一 个 特 殊 的 文 件 名 ( 名 称 虽 然 可 以 任 意 , 但 为 了 表 示 和 磁 盘 文 件 的 区 别 ,
一 般 名 称 设 置 为 ” XXXX:” 的 形 式 , 如 LCD 驱 动 名 称 是 ” LCD:” ,键 盘 驱 动 是 ” KBD:” 等 ) .
<1>设 备 文 件 有 哪 些 属 性 ?
参 考 device.h 中 的 DEVICE_LIST 结 构 :
typedef struct
{
char name[32];/*这 是 设 备 名 称 */
int mode;/*bit0,可 读 ,bit1,可 写 ,bit6,可 共 享 读 ,bit7,可 共 享 写 ,其 他 位 用 户 可
自 定 义 */
int nest;
DEVICE_OPEN lpfnOpen;/*fopen()调 用 */
DEVICE_CLOSE lpfnClose;/*fclose()调 用 */
DEVICE_READ lpfnRead;/*fread()调 用 */
DEVICE_WRITE lpfnWrite;/*fwrite()调 用 */
DEVICE_ESCAPE lpfnEscape;/*Device_Escape()调 用 */
void*user_data;
void*prev;
void*next;
}DEVICE_LIST;
以 上 结 构 中 有 注 释 的 就 是 设 备 属 性 , 事 实 上 , 安 装 一 个 设 备 就 是 把 这 些 属 性 写 入 一 个
DEVICE_LIST 结 构 并 且 连 接 到 系 统 设 备 列 表 的 过 程 . 用 户 调 用 fopen()打 开 一 个 设 备 的 时 候 ,
会 通 过 文 件 名 在 设 备 列 表 中 查 找 设 备 , 如 果 找 到 则 调 用 该 设 备 的 lpfnOpen()实 现 对 该 设 备
的 初 始 化 功 能 , fread(),fwrite()和 fclose()依 此 类 推 . 因 此 , 要 安 装 一 个 设 备 , 最 重 要
的 就 是 写 好 这 几 个 函 数 , 然 后 直 接 用 系 统 API Device_install()安 装 即 可 !
先 看 一 下 这 几 个 函 数 指 针 的 原 型 :
typedef void*(*DEVICE_OPEN)(char*name,char*mode);/*name: 驱 动 设 备 名 称 ,
mode:文 件 打 开 模 式 , 可 能 是 读 /写 , 或 者 读 写 模 式 */
typedef int (*DEVICE_CLOSE)(void*p);/*p:设 备 文 件 指 针 */
typedef int (*DEVICE_READ)(void*buffer,int size);/*buffer:接 收 缓 冲 区 , size:
要 读 的 数 据 长 度 */

第 6 页 共 6 页

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


쟥 풶 쫐 병 뗄 쏀뗧 ퟓ 뿆 벼 폐 쿞 릫 쮾
GADMEI ELECTRONICS TECHNOLOGY CO., LTD.

typedef int(*DEVICE_WRITE)(void*buffer,int size);/*buffer:写 入 的 缓 冲 区 地


址 , size:写 入 的 长 度 */
typedef int(*DEVICE_ESCAPE)(int code,void*user_data);/*设 备 直 接 通 讯 功 能 ,
code 和 user_data 定 义 和 设 备 驱 动 解 释 相 关 */
现 在 我 们 假 设 成 功 安 装 了 一 个 名 字 叫 ” TFT:” 的 设 备 , 则 使 用 该 设 备 的 方 法 是 :
FILE*p=fopen(“ TFT:” ,” w” );/*写 方 式 打 开 该 设 备 , 此 时 会 自 动 调 用 TFT 的
lpfnOpen()函 数 */
fwrite(“ This is a demo program!\r\n” ,25,1,p);/*写 数 据 给 TFT 设 备 , 这 时 是
调 用 TFT 的 lpfnWrite()函 数 , 只 要 lpfnWrite()能 正 确 把 数 据 显 示 到 屏 幕 上 , 这 行 代 码 就
是 显 示 ” This is a demo program!” 字 符 串 到 屏 幕 上 */
fclose(p);/*关 闭 TFT 设 备 , 此 时 调 用 TFT 的 lpfnClose(),调 用 后 p 不 再 有 效 */
从 上 例 可 以 看 出 , 要 写 一 个 设 备 驱 动 程 序 , 只 要 正 确 写 好 该 设 备 对 应 的
lpfnOpen(),lpfnRead(),lpfnWrite()和 lpfnClose()即 可 . 实 际 上 , 很 多 设 备 都 可 以 直 接
用 系 统 共 用 的 Device_CommonOpen()和 Device_CommonClose()参 数 来 设 置 lpfnOpen 和
lpfnClose,因 此 , 设 计 设 备 驱 动 程 序 , 就 是 如 何 写 好 lpfnRead()和 lpfnWrite()了 !
下 面 举 两 个 设 备 驱 动 的 例 子 , 一 个 是 输 入 设 备 , 一 个 是 输 出 设 备 :
(1)2410 的 按 键 驱 动 ,这 是 一 个 输 入 设 备 , 所 以 只 需 要 写 lpfnOpen(),lpfnClose 和
lpfnRead()即 可 .假 定 该 按 键 接 在 GPG.5.
首 先 , 编 写 lpfnOpen().
void*KBD_Open(char*name,char*mode)/*参 数 是 fopen()自 动 传 递 的 */
{
FILE*p=(FILE*)Device_CommonOpen(name,mode);/* 必 须 先 调 用
Device_CommonOpen()获 取 一 个 FILE*指 针 */
if(!p) return (void*)0;/*返 回 NULL 表 示 内 存 不 足 */
rGPGCON&=~((1<<12)|(1<<13));/*GPG.5 设 置 为 输 入 状 态 */
return (void*)p;/*返 回 p 指 针 即 可 */
}
注 意 , 因 为 这 里 需 要 设 置 I O 口 状 态 , 因 此 定 义 自 己 的 KBD_Open(), 如 果 不 需
要 做 任 何 初 始 化 , 完 全 可 以 在 Device_install()的 时 候 用 Device_CommonOpen 参 数 . 但
如 果 使 用 了 自 己 的 XXX_Open(),则 必 须 保 证 调 用 一 次 Device_CommonOpen()并 且 直 接 返
回 该 返 回 值 ( 如 上 例 )
接 着 ,编 写 lpfnRead()
int KBD_Read(void*buff,int size)/*参 数 是 fread()自 动 传 递 */
{

第 7 页 共 7 页

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


쟥 풶 쫐 병 뗄 쏀뗧 ퟓ 뿆 벼 폐 쿞 릫 쮾
GADMEI ELECTRONICS TECHNOLOGY CO., LTD.

char*ptr=(char*)buff;
while(size--) ptr++=rGPGDAT&0x20;/*读 取 size 次 IO 口 状 态 到 buff*/
return 0;/*返 回 0 表 示 读 取 没 有 出 错 */
}
然 后 编 写 lpfnClose():
事 实 上 如 果 不 需 要 更 改 IO 口 状 态 的 话 , 可 以 用 Device_CommonClose()代 替 这 个 函
数 , 但 如 果 定 义 了 , 必 须 调 用 Device_CommonClose()一 次 !
int KBD_Close(FILE*p)/*fclose()自 动 传 递 */
{
rGPGCON|=3<<12;/*恢 复 输 出 状 态 */
return Device_CommonClose(p);
}
最 后 , 调 用 Device_install()安 装 该 驱 动 :
Device_install(“ KBD:” /* 驱 动 名 */,READABLE|SHAREREAD/* 可 读 可 共 享 读
*/,(DEVICE_OPEN)KBD_Open,(DEVICE_CLOSE)KBD_Close,(DEVICE_READ)KBD_Read,(DEVICE_
WRITE)0,(DEVICE_ESCAPE)0);/*因 为 ” KBD:” 不 支 持 Write 和 Escape 功 能 , 则 lpfnWrite
和 lpfnEscape 都 是 0*/
这 样 , 一 个 名 为 ” KBD:” 的 驱 动 设 备 就 安 装 到 了 eDOS 系 统 中 . 如 何 使 用 该 设 备 读 按
键 呢 ? 过 程 如 下 :
unsigned char key;
FILE*p=fopen(“ KBD:” ,” r” );/*读 打 开 设 备 */
fread(&key,1,1,p);/*从 p 中 读 一 个 字 节 */
fclose(p);/*关 闭 */
if(!key) printf(“ KEY pressed!\r\n” );
else printf(“ KEY released!\r\n” );

(2)2410 的 L E D 输 出 驱 动 ,L E D 接 在 GPB.0
void*LED_Open(char*name,char*mode)
{
FILE*p=(FILE*)Device_CommonOpen(name,mode);
if(!p) return (void*)0;
rGPBCON&=~0x0f;
rGPBCON|=0x05;/*IO 口 初 始 化 为 输 出 */
第 8 页 共 8 页

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


쟥 풶 쫐 병 뗄 쏀뗧 ퟓ 뿆 벼 폐 쿞 릫 쮾
GADMEI ELECTRONICS TECHNOLOGY CO., LTD.

return(void*)p;
}
int LED_Write(void*buff,int size)
{
BYTE*ptr=(BYTE*)buff;
while(size--)
{
rGPBDAT&=~0x01;
if(*ptr++) rGPBDAT|=0x01;
}
return 0;
}
调 用 系 统 API 安 装 (注 意 , 没 有 自 定 义 lpfnClose,则 这 里 用 Device_CommonClose 代
替 ):
Device_install(“ LED:” ,WRITEABLE,(DEVICE_OPEN)LED_Open,(DEVICE_CLOSE)De
vice_CommonClose,(DEVICE_READ)0,(DEVICE_WRITE)LED_Write,(DEVOCE_ESCAPE)0
);
使 用 驱 动 程 序 ” LED:” 来 实 现 500ms 闪 烁 功 能 的 代 码 如 下 :
void main()
{
unsigned char i;
FILE*p=fopen(“ LED:” ,” w” );
while(1)
{
i=0;
fwrite(&i,1,1,p);
delay(500);
i=1;
fwrite(&i,1,1,p);
delay(500);
}
}

第 9 页 共 9 页

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


쟥 풶 쫐 병 뗄 쏀뗧 ퟓ 뿆 벼 폐 쿞 릫 쮾
GADMEI ELECTRONICS TECHNOLOGY CO., LTD.

由 此 可 见 , eDOS 仅 仅 提 供 了 一 个 通 用 的 驱 动 程 序 通 信 的 机 制 , 具 体 实 现 什 么 功 能 是 在
XXX_read(),XXX_write()中 实 现 了 .但 是 , stdout 因 为 是 console 的 输 出 驱 动 , 所 有 stdout
的 驱 动 必 须 支 持 printf()中 的 转 意 字 符 如 ’ \r’ ,’ \n’ ,’ \t’ ! 因 此 , 在 stdout 的 驱 动
中 , 必 须 逐 个 字 符 分 析 fwrite()传 来 的 buffer 信 息 , 具 体 请 参 考 下 列 伪 代 码 :
int LCD_Write(char*buffer,int size)
{
while(size--)
{
if(*buffer==’ \r’ )
{
}
else if(*buffer==’ \n’ )
{
}
else if(*buffer==’ \t’ )
{
}
else if(*buffer==’ \b’ )
{
}
else
ShowText(*buffer);
Buffer++;
}
return 0;
}
Seekfor eDOS v1.0 内 部 已 经 包 含 了 一 个 名 为 ” LCD:” 的 驱 动 , 该 驱 动 可 以 直 接 操 作 点 阵
输 出 的 显 示 设 备 . 只 需 要 提 供 画 点 和 读 点 函 数 给 initgraph()即 可 !一 般 在 CHIPS_init()通
过 如 下 方 式 调 用 :
#define LCD_WIDTH 640
#define LCD_HEIGHT 480
int GetPixel(int x,int y)
{
第 10 页 共 10 页

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


쟥 풶 쫐 병 뗄 쏀뗧 ퟓ 뿆 벼 폐 쿞 릫 쮾
GADMEI ELECTRONICS TECHNOLOGY CO., LTD.

/*加 入 具 体 的 代 码 实 现 读 点 操 作 */
}
void SetPixel(int x,int y,int color)
{
/*加 入 实 际 的 代 码 实 现 画 点 操 作 */
}
void LCD_init()
{
/*进 行 必 要 的 硬 件 初 始 化 , 如 设 置 寄 存 器 等 工 作 */
initgraph(GetPixel,SetPixel,(LCD_WIDTH)|(LCD_HEIGHT<<16));
}
这 样 , eDOS 的 图 形 库 功 能 即 可 使 用 , 同 时 如 果 把 DOS_cfg.h 中 的 STDOUT_USING 定 义
为 ” LCD:” ,则 eDOS 的 输 出 定 义 在 了 LCD 上 , 所 有 的 信 息 都 在 LCD 上 显 示 了 !

第 四 章 如 何 安 装 FAT 驱 动 器
FAT 驱 动 器 的 安 装 需 要 使 用 FAT_install()和 FAT_format()两 个 函 数 ,这 两 个 API 都 用 到 了
一 个 结 构 FORMAT_PARAMS:

typedef struct

BOOL bFAT32;/*0=FAT16,1=FAT32*/

DWORD dwBytesPerSector;/*每 扇 区 字 节 数 ,一 般 是 512,和 硬 件 可 Erase 的 单 位 有 关


如 K9F1208 是 按 block 擦 除 的 ,所 以 这 个 参 数 应 该 是 16384*/

DWORD dwStart;/*开 始 扇 区 号 ,一 般 是 0 即 可 */

DWORD dwLength;/*总 的 扇 区 数 目 */

SECTOR_ERASE lpfnErase;/*硬 件 相 关 擦 除 函 数 */

SECTOR_READ lpfnRead;/*硬 件 相 关 读 一 个 扇 区 函 数 */

SECTOR_WRITE lpfnWrite;/*硬 件 相 关 写 一 个 扇 区 函 数 */

void user_data;/*用 户 数 据 ,可 以 自 动 传 递 到 lpfnErase,lpfnRead,lpfnWrite 中 使


用 */

}FORMAT_PARAMS;

和 其 他 设 备 驱 动 一 样 ,FAT 驱 动 也 是 主 要 是 写 好 lpfnErase(),lpfnRead(),lpfnWrite()即

第 11 页 共 11 页

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com


쟥 풶 쫐 병 뗄 쏀뗧 ퟓ 뿆 벼 폐 쿞 릫 쮾
GADMEI ELECTRONICS TECHNOLOGY CO., LTD.

可 .具 体 情 况 参 考 main.c 中 的 RAM 盘 的 驱 动 !一 般 情 况 下 ,安 装 一 个 FAT 驱 动 的 步 骤 不 下 :

FORMAT_PARAMS
nand_fmt={0,16384,0,4096,NAND_erase,NAND_read,NAND_write,0};/*设 置 NAND 参 数 */

if(!FAT_install(nand_fmt.dwStart,nand_fmt.lpfnErase,nand_fmt.lpfnRead,nand_
fmt.lpfnWrite,nand_fmt.user_data))

FAT_format((DRIVER_INFO*)0,&nand_fmt);

FAT_install(nand_fmt.dwStart,nand_fmt.lpfnErase,nand_fmt.lpfnRead,nand_f
mt.lpfnWrite,nand_fmt.user_data);

代 码 先 尝 试 直 接 安 装 一 个 NAND 驱 动 (如 果 上 次 格 式 化 过 则 FAT_install()返 回 1 而 不 是 0),


如 果 安 装 不 成 功 可 能 是 没 有 格 式 化 则 调 用 FAT_format()格 式 化 一 次 ,格 式 化 完 成 后 再 次 调 用
FAT_install()安 装 驱 动 ,如 果 FAT 成 功 安 装 ,则 eDOS 下 的 磁 盘 驱 动 将 有 效 !(盘 符 和 调 用
FAT_install()的 顺 序 有 关 ,第 一 个 是 ’ C’ ,第 二 个 是 ’ D’ ,其 他 依 此 类 推 )

感 谢 所 有 关 心 和 支 持 Seekfor eDOS
v1.0 的 同 道 和 朋 友 ,你 们 的 支 持 就 是 我
最 大 的 动 力 !
欢 迎 和 我 联 系 讨 论 eDOS 方 面 问 题
QQ:82054357
MSN:sfrad32@hotmail.com
Mail:Seek_For@163.com

第 12 页 共 12 页

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

You might also like