Professional Documents
Culture Documents
Seekfor EDOS v1 - 0移植指南
Seekfor EDOS v1 - 0移植指南
第 1 页 共 1 页
简 单 的 来 说 ,移 植 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 页
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 页
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 页
定 义 系 统 使 用 的 动 态 空 间 大 小 ,默 认 是 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
第 5 页 共 5 页
第 6 页 共 6 页
第 7 页 共 7 页
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 页
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 页
由 此 可 见 , 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 页
/*加 入 具 体 的 代 码 实 现 读 点 操 作 */
}
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 dwStart;/*开 始 扇 区 号 ,一 般 是 0 即 可 */
DWORD dwLength;/*总 的 扇 区 数 目 */
SECTOR_ERASE lpfnErase;/*硬 件 相 关 擦 除 函 数 */
SECTOR_READ lpfnRead;/*硬 件 相 关 读 一 个 扇 区 函 数 */
SECTOR_WRITE lpfnWrite;/*硬 件 相 关 写 一 个 扇 区 函 数 */
}FORMAT_PARAMS;
和 其 他 设 备 驱 动 一 样 ,FAT 驱 动 也 是 主 要 是 写 好 lpfnErase(),lpfnRead(),lpfnWrite()即
第 11 页 共 11 页
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);
感 谢 所 有 关 心 和 支 持 Seekfor eDOS
v1.0 的 同 道 和 朋 友 ,你 们 的 支 持 就 是 我
最 大 的 动 力 !
欢 迎 和 我 联 系 讨 论 eDOS 方 面 问 题
QQ:82054357
MSN:sfrad32@hotmail.com
Mail:Seek_For@163.com
第 12 页 共 12 页