跳至主要内容

【转】vivi开发笔记(二):软件架构分析

文章说明:calmarrow(lqm)原创

文章引自:http://piaoxiang.cublog.cn

 
   虽然想写《vivi软件架构分析》,但是对软件架构并没有清晰的认识。只是以学习的态度,去尽可能的理解吸收vivi的设计思想,以后可以应用到自己的设计中。
 
    vivi的软件架构分为三个层次:vivi配置bootloader stage1bootloader stage2。另外,Vivi还提供了测试程序和工具,并且有简明的文档。具体如图1所示。

    下面进行详细分析。
 
    1 获取源代码
    mizi公司提供vivi的源代码,如果你不知道下载的地址,那么到百度或者google搜索一下,很容易找到。在这里多说两句,搜索引擎之争很激烈。不过你没有必要关注那么多,你所需要的是尽可能快的找到你所需要的有价值的资料。一般而言,百度是土生土长的,搜索时用中文关键词比较合适,而google搜索最好用英文关键词。vivi是国外公司的产品,推荐用google搜索。在google中输入vivi download,很容易发现: http://www.mizi.com/developer/s3c2410x/download/vivi.html。不过很不幸,现在下载地址已经失效了。这时你也许放弃了,我也曾经放弃过。但是你如果使用ftp尝试一下就会发现,就会得到你想要的结果:
 
[armlinux@lqm vivi]$ ftp ftp.mizi.com
Connected to ftp.mizi.com (203.236.241.50).
220 ProFTPD 1.3.0 Server (MIZI Research, Inc. FTP Server) [::ffff:203.236.241.50]
Name (ftp.mizi.com:armlinux): anonymous
331 Anonymous login ok, send your complete email address as your password.
Password:
230-
230-
230- ftp.mizi.com俊 坷脚巴阑 券康钦聪促.
230- ftp.mizi.com篮 固瘤 府辑摹(林)俊辑 款康窍绰 FTP 辑滚 涝聪促.
230-
230- 固瘤 府椽胶 硅器魄篮 力傍阑 吝窜钦聪促.
230- 捞寇 绢敲府纳捞记 棺 包访 磊丰绰 力傍登绊 乐嚼聪促.
230-
230- Warez啊 酒聪骨肺 惑侩绢敲府纳捞记阑 诀肺靛 窍绰巴篮 阂啊钦聪促.
230-
230- 立加磊 : anonymous
230- 肺弊牢 矫埃 : Wed Jul 25 01:38:38 2007
230- 立加 IP : ::ffff:122.4.41.168
230- 立加磊 荐 : 泅犁 (3) / 弥措 (25)
230-
230-
230-
230-
230 Anonymous access granted, restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (203,236,241,50,234,217).
150 Opening ASCII mode data connection for file list
drwxrwxr-x 3 root users 72 Jan 18 2007 incoming
drwxr-xr-x 14 root root 336 Dec 23 2006 pub
d-wx-wx--x 2 (?) staff 48 Nov 18 2004 uploads
-rw-r--r-- 1 root root 399 Jun 29 08:10 welcome.msg
226 Transfer complete.
ftp> cd pub
250 CWD command successful
ftp> ls
227 Entering Passive Mode (203,236,241,50,163,137).
150 Opening ASCII mode data connection for file list
drwxr-xr-x 6 root root 456 Sep 6 2002 baekmuk
drwxr-xr-x 7 root root 232 Oct 27 2004 file
drwxr-xr-x 2 root root 344 Feb 27 2004 hanIM
drwxr-xr-x 2 root root 672 Dec 18 2000 htm
drwxr-xr-x 2 root root 376 Jun 7 2000 hwpview
drwxr-xr-x 2 root root 152 May 8 2006 i519
drwxr-xr-x 7 root root 200 Sep 1 2006 kernel
drwxr-xr-x 3 root root 72 Jun 27 2006 linuette
drwxr-xr-x 8 root root 208 Nov 7 2005 misc
drwxr-xr-x 2 root root 344 Dec 20 2001 pen
drwxr-xr-x 6 yjseo cvs 192 Dec 23 2006 prizm
drwxr-xr-x 2 root root 136 Jun 8 2000 xmath
226 Transfer complete.
ftp> cd linuette
250 CWD command successful
ftp> ls
227 Entering Passive Mode (203,236,241,50,215,24).
150 Opening ASCII mode data connection for file list
drwxr-xr-x 3 root root 72 Jun 27 2006 SDK
226 Transfer complete.
ftp> cd SDK
250 CWD command successful
ftp> ls
227 Entering Passive Mode (203,236,241,50,184,89).
150 Opening ASCII mode data connection for file list
drwxr-xr-x 2 root root 96 Jun 27 2006 iso
226 Transfer complete.
ftp> cd iso
250 CWD command successful
ftp> ls
227 Entering Passive Mode (203,236,241,50,132,159).
150 Opening ASCII mode data connection for file list
-rw-r--r-- 1 yjseo cvs 640122880 Jun 27 2006 sdk15-S3C2410-tk-20030630.iso
226 Transfer complete.
ftp>
 
    可见,网站改版后,mizi公司把所有的工具都做成iso文件了,600多M。你把该文件下载下,使用搜索功能,可以找到target/box/boot/vivi-20030629.tar.bz2。如果这样的方法还不能找到,那就需要到论坛求助了。
 
    2 解压分析
    解压就不必多说,完成后可以利用tree工具查看一下代码树。(注:tree是Linux下查看目录树的小工具,你可以从ftp://mama.indstate.edu/linux/tree/下载,现在的最新版本是1.5.1)。
 
[armlinux@lqm vivi]$ tree -L 3
… …
45 directories, 233 files
 
    可见vivi的源代码一共有45个文件夹,233个文件。
 
[armlinux@lqm vivi]$ tree -L 1
.
|-- COPYING
|-- CVS
|-- Documentation
|-- Makefile
|-- Makefile.newSDK
|-- Rules.make
|-- arch
|-- drivers
|-- include
|-- init
|-- lib
|-- scripts
|-- test
`-- util

10 directories, 4 files
 
    可以看出,vivi的代码的组织是模仿Linux的内核,如果看过kernel的架构,那么应该会很熟悉。不过现在,我们要分析vivi的核心代码架构,先对上述文件做一下简要的说明。
 

COPYING:GPL协议声明,Gnu General Public License,这里是version 2。如果要具体了解一下GPL协议,那么可以仔细读一下该文件。

CVS: Control version system,一种版本控制的工具。使用cvs,可以很方便的进行版本的控制,节约大量的时间。不过该部分并不属于vivi核心软件架构。

Documentation:帮助文档。关于vivi的简单介绍,如何进行编译,如何booting ARM都有简要的描述。拿到源代码,首先应该看该文件夹,了解一下,它是什么,可以如何进行操作。不过,里面有些帮助文档是韩语,看不懂。

Makefile Makefile.newSDK Rules.make:工程管理。Linux下用make来进行工程管理,对Makefile应该不会陌生。读源代码,首先了解Makefile的内容,会很有帮助。

arch: 处理器架构相关的核心代码。这是vivi bootloader stage1的实现部分。如果要支持其他架构,也需要放到这个文件夹下面。

drivers: 通用的驱动程序。

include: 包含的头文件

init: 初始化的核心代码。这是vivi bootloader stage2的实现部分。

lib: 库文件

scripts: Shell脚本。vivi提供了一种交互式配置机制,实现部分是利用shell脚本来完成的。这也是一个重要的研究内容。

test: 测试文件

util: 小工具。现在包含两个文件,ecc.c, imagewrite.c。

   
    现在首先要去掉不必要的部分。首先,COPYING可以去掉,CVS也可以去掉,Documentation在读完后就可以去掉了,没什么太复杂的东西。
 

[armlinux@lqm bootloader]$ cp vivi architecture –rf //备份先

[armlinux@lqm bootloader]$ cd architecture/
//观察architecture

[armlinux@lqm architecture]$ find . \( -name COPYING -o -name Documentation -o -name CVS -o -name

test -o -name util \) | xargs rm -rf
[armlinux@lqm architecture]$ ls
Makefile Makefile.newSDK Rules.make arch drivers include init lib scripts
//下面分析一下Makefile Makefile.newSDK有什么区别

[armlinux@lqm architecture]$ diff -uN Makefile Makefile.newSDK
--- Makefile 2007-07-25 10:32:55.000000000 +0800
+++ Makefile.newSDK 2007-07-25 10:32:55.000000000 +0800
@@ -14,7 +14,7 @@
 #
 # change this to point to the Linux include directory
 #
-LINUX_INCLUDE_DIR = /opt/host/armv4l/include/
+LINUX_INCLUDE_DIR = /opt/kernel/armv4l/include/
 
 
 VIVIPATH = $(TOPDIR)/include
@@ -22,8 +22,7 @@
 HOSTCC = gcc
 HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
 
-CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-unknown-linux-
-#CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-redhat-linux-
+CROSS_COMPILE = /opt/kernel/armv4l/bin/armv4l-mizi-linux-
 
 #
 # Include the make variables (CC, etc...)
@@ -85,8 +84,7 @@
 #
 # Location of the gcc arm libs.
 #
-ARM_GCC_LIBS = /opt/host/armv4l/lib/gcc-lib/armv4l-unknown-linux/2.95.2
-#ARM_GCC_LIBS = /opt/host/armv4l/lib/gcc-lib/armv4l-redhat-linux/2.95.3
+ARM_GCC_LIBS = /opt/kernel/armv4l/lib/gcc-lib/armv4l-mizi-linux/2.95.2
 
 OBJCOPYFLAGS = -R .comment -R .stab -R .stabstr
//可见只是更改了三个宏定义,而这也是移植需要更改的,所以,把Makefile.newSDK删掉

[armlinux@lqm architecture]$ rm Makefile.newSDK
[armlinux@lqm architecture]$ ls
Makefile Rules.make arch drivers include init lib scripts
//然后清理一下内部的测试文档

[armlinux@lqm architecture]$ find . -name *test* -print | xargs rm –rf
[armlinux@lqm architecture]$ tree -L 1
.
|-- Makefile
|-- Rules.make
|-- arch
|-- drivers
|-- include
|-- init
|-- lib
`-- scripts

   
    就vivi工程的管理来说,按照功能划分非常清晰,模块化的划分,设计上很容易增加新的硬件设备。模块与模块之间的接口也很清晰。读完Makefile之后,就会有更为深入的体会。它的配置机制也是如此。这在以后的文档里会详细说明。
 
    当你看清楚了作者组织的思路时,读取源代码就容易得多了。而这个软件架构是否合理,是否清晰,是需要不断借鉴,修改并完善的。这也正是我学习的所在。

评论

此博客中的热门博文

【转】AMBA、AHB、APB总线简介

AMBA 简介 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用。在基于IP复用的SoC设计中,片上总线设计是最关键的问题。为此,业界出现了很多片上总线标准。其中,由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。   AMBA 片上总线        AMBA 2.0 规范包括四个部分:AHB、ASB、APB和Test Methodology。AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。下面将简要介绍比较重要的AHB和APB总线。 基于 AMBA 的片上系统        一个典型的基于AMBA总线的系统框图如图3所示。        大多数挂在总线上的模块(包括处理器)只是单一属性的功能模块:主模块或者从模块。主模块是向从模块发出读写操作的模块,如CPU,DSP等;从模块是接受命令并做出反应的模块,如片上的RAM,AHB/APB 桥等。另外,还有一些模块同时具有两种属性,例如直接存储器存取(DMA)在被编程时是从模块,但在系统读传输数据时必须是主模块。如果总线上存在多个主模块,就需要仲裁器来决定如何控制各种主模块对总线的访问。虽然仲裁规范是AMBA总线规范中的一部分,但具体使用的算法由RTL设计工程师决定,其中两个最常用的算法是固定优先级算法和循环制算法。AHB总线上最多可以有16个主模块和任意多个从模块,如果主模块数目大于16,则需再加一层结构(具体参阅ARM公司推出的Multi-layer AHB规范)。APB 桥既是APB总线上唯一的主模块,也是AHB系统总线上的从模块。其主要功能是锁存来自AHB系统总...

【转】GPIO编程模拟I2C入门

ARM编程:ARM普通GPIO口线模拟I2C  请教个问题: 因为需要很多EEPROM进行点对点控制,所以我现在要用ARM的GPIO模拟I2C,管脚方向我设 置的是向外的。我用网上的RW24C08的万能程序修改了一下,先进行两根线的模拟,SDA6, SCL6,但是读出来的数不对。我做了一个简单的实验,模拟SDA6,SCL6输出方波,在示波 器上看到正确方波,也就是说,我的输出控制是没问题的。 哪位大哥能指点一下,是否在接收时管脚方向要设为向内?(不过IOPIN不管什么方向都可 以读出当前状态值的阿) 附修改的RW24C08()程序: #define  SomeNOP() delay(300); /**/ /* *********************************  RW24C08   **************************************** */ /**/ /* ----------------------------------------------------------------------------- ---  调用方式:void I2CInit(void)   函数说明:私有函数,I2C专用 ------------------------------------------------------------------------------- -- */ void  I2CInit( void ) ... {  IO0CLR  =  SCL6;      // 初始状态关闭总线  SomeNOP();  // 延时   I2CStop();  // 确保初始化,此时数据线是高电平 }   /**/ /* ---------------------------------------------------------------------------- ----  调用方式:void I2CSta...

【转】cs8900网卡的移植至基于linux2.6内核的s3c2410平台

cs8900网卡的移植至基于linux2.6内核的s3c2410平台(转) 2008-03-11 20:58 硬件环境:SBC-2410X开发板(CPU:S3C2410X) 内核版本:2.6.11.1 运行环境:Debian2.6.8 交叉编译环境:gcc-3.3.4-glibc-2.3.3 第一部分 网卡CS8900A驱动程序的移植 一、从网上将Linux内核源代码下载到本机上,并将其解压: #tar jxf linux-2.6.11.1.tar.bz2 二、打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。 (1)指定目标平台。 移植前:         ARCH?= $(SUBARCH) 移植后: ARCH            :=arm (2)指定交叉编译器。 移植前: CROSS_COMPILE ?= 移植后: CROSS_COMPILE   :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu- 注:这里假设编译器就放在本机的那个目录下。 三、添加驱动程序源代码,这涉及到以下几个方面。(1)、从网上下载了cs8900.c和cs8900.h两个针对2.6.7的内核的驱动程序源代码,将其放在drivers/net/arm/目录下面。 #cp cs8900.c ./drivers/net/arm/ #cp cs8900.h ./drivers/net/arm/ 并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句: __raw_writel(0x2211d110,S3C2410_BWSCON); __raw_writel(0x1f7c,S3C2410_BANKCON3); 注:其原因在"第二部分"解释。 (2)、修改drivers/net/arm/目录下的Kconfig文件,在最后添加如...