2009年2月20日星期五

EP93xx GPIO interface

名词

AMBA是EP93xx采用的内部总线结构,他包含一个高速总线(AHB)和一个低速总线(APB)。

AHB (Advanced High-Performance Bus),包含一个高速内部总线时钟,用来同步协处理 器、MMU、cache、DMA控制器和其他内存模块。

APB (Advanced Peripheral Bus),此总线就来连接一些低速并行设备,比如UART和GPIO。 AHB 和 APB 使用 AMBA 架构中的 AHB/APB 总线连接,

GPIO (General Purpose I/O),GPIO在EP93xx中是APB的一个子模块,他提供简单的LED控制, 可实现非常基础的调试功能(相当于printk?)。

GPIO

GPIO 包含两种类型和8个接口。

  • 标准GPIO (port C, D, E, G, H)。每个端口包含两组寄存器
    1. data reg x1
    2. data direction reg x1
  • 增强型的GPIO(EGPIO, port A, B, F),包含三种寄存器
    1. data reg x1
    2. data direction reg x1
    3. intr reg and status regs x?

标准GPIO的每个端口都包含一个8位数据寄存器(data regs)和另外的8位数据方向寄存器 (datadirection regs)。而EGPIO还会多包含一组8位中断控制寄存器。

ABF端口还包括了七个多余的寄存器。

  1. GPIO Interrupt Enable registers (GPIOAIntEn, GPIOBIntEn, GPIOFIntEn)
  2. GPIO Interrupt Type 1 registers (GPIOAIntType1, GPIOBIntType1, GPIOFIntType1)
  3. GPIO Interrupt Type 2 registers (GPIOAIntType2, GPIOBIntType2, GPIOFIntType2)
  4. GPIO End-Of-Interrupt registers (GPIOAEOI, GPIOBEOI, GPIOFEOI)
  5. GPIO Debounce registers (GPIOADB, GPIOBDB, GPIOFDB)
  6. Interrupt Status registers (IntStsA, IntStsB, IntStsF)
  7. Raw Interrupt Status registers (RawIntStsA, RawIntStsB, RawIntStsF)

GPIO 初始化

系统复位的时候,GPIO 会执行初始化。

  • 所有端口的 data reg 和 data direction reg 都将清零,设置为 input 方式
  • Port E[1:0] 用来表示 RDLED 和 GRLED,他们将会被置高,也就是 0x11
  • Port G[3:2] 用来表示 SLA[1:0] 输出,他们被置低。
  • Port G[1:0] 用来表示 EEDAT 和 EECLK,设置为 input 方式
  • 所有的中断控制寄存器和祛抖动寄存器都被清零

GPIO端口和针脚映射

EP93xx的阵脚情况不一样,后继版本的板子总是多了点,下面只是列出EP9301/EP9302的针 脚映射:

主板针脚名称 位于GPIO模块上的端口
EGPIO[7:0] Port A
EGPIO[15:8] Port B
GRLED1 Port E0
RDLED2 Port E1
EECLK3 Port G0
EEDAT4 Port G1

GPIO 寄存器映射

鉴于GPIO寄存器很多,我也就不列出来了。

只是说几个要点。

  1. PADR ― PHDR,数据寄存器
    • 读取这些寄存器将会返回GPIO模块输入端口的值(由PXDDR控制),默认情况是缺省端 口映射下的端口状态信息。
  2. PEDR,他的bit[1:0]提供了LED 驱动方法,默认是0x11
  3. RAWSTATUSx,共三个寄存器。显示了无关针脚的读取状态

寄存器索引

引用

  1. EP9302 User's Guide

2009年2月17日星期二

新章: 试用LXDE Desktop Environment

闲聊

好了,很长时间没写字,我都不知道如何动笔了。

其实不是不想写,也非过年过皮实了,而是这些天都在忙活。从过年来,天天加班到九点, 回到家里还要折腾自己的小窝,面对邪恶的加菲,我在家里几乎无所事事。但是我也没闲着, 天天折腾到两三点,至于我干什么?我在折腾这两年累计的东西呢。

就说今天干了什么吧。

新手接触 LXDE

我今天测试了一下新的桌面环境LXDE,这是来自彼岸的台湾同胞洪任谕开发的(他同时也是 PC Man文件管理器的作者)。LXDE是非常小巧的羽量级桌面环境,他的桌面组建加载的很少, 这样本身的代码量就比较小(加起来总共只有9M左右),这样运行起来就很快很快。

LXDE采用了openbox作为窗口管理器,这个东西也是非常的迅速。使用的文件浏览器是看家 的 pcmanfm,一些官方维护的组件如下:

  • PCManFM,文件管理器,类似于Nautilus
  • LXLauncher,一个快速启动面板
  • LXPanel,简洁的桌面面板,类似于 gnome-panel
  • LXSession,会话管理器
  • LXAppearance,主题管理器
  • LXSessionEdit,进化的任务管理器
  • Leafpad,默认的记事本
  • Xarchiver,内嵌的归档管理器
  • GPicView
  • LXTerminal
  • LXTask
  • LXNM
  • Openbox
  • LXRandr,屏幕管理器,可以管理多个屏幕的分辨率,刷新频率等等,大赞!
  • LXShortCut,用来快捷方式
  • LXMusic
  • LXDE Common
  • GtkNetCat

希望

目前的LXDE还是太少,跟树大根深的GNOME自然无法比,但是LXDE有着很多的先天优势。对 于我来说,LXDE还需要改进的是:一个快捷键管理工具,虽然你可以手动编辑 ~/.config/openbox/lxde-rc.xml;一个很好的桌面字体渲染引擎;采用更多的轻量级应用 软件,比如Office,画图等等;增强PCMan文件管理器功能,当然这要建立在不牺牲速度和 性能的基础之上,毕竟这是LXDE的设计哲学。

安装 LXDE 请看:

追踪 LXDE 社区线索:

截图


2009年1月18日星期日

游历深圳博物馆 (Shenzhen Museum)

深圳博物馆位于福田区市民中心的东部,新馆于12月25日开馆,由此免费向公众开放。

博物馆主题重要的有三个,古代深圳、近代深圳和深圳民俗文化,以此分别设置三个主题展
厅。这三个展厅相当相当的长,里面的玩意儿非常之多,很对得起2.4亿的造价啊。。。

我和大黄俊丽三人浩浩荡荡的来到深圳博物馆,开始长游,因为展品繁多,地形复杂。我只
说说几个非常重要的 ————


中国国家典藏精品展览
先是一楼,中国国家典藏精品展览。你可以看到很多在历史书里翻看到的东西,包括四羊方
尊、战神之鸟、铜面具、青瓷莲花尊等等等等。未能想到在这里就见到我朝思暮想的宝贝啊~

四羊方尊,在历史书籍里的出境率非常之高。


战神之鸟,基本看不出来是只鸟。


编钟,1952年中国首次使用编钟演奏了《东方红》。


兵马俑,让我想起了The Mummy!


金缕玉衣,大黄坏坏的给了这样一个特写。


重点的重点啊!青瓷莲花尊的做工非常精美呐,介绍词给的非常庄严——涅磐之舟!


民俗文化厅
然后是二楼,民俗文化展厅,里面展示深圳古色古香的民俗风情。里面大多来自清朝和近代
的一些民间情景,其中各个情景中的泥偶人物非常逼真。第一次看到的时候吓我一跳:(


官员展示农耕的场景。






古代展厅
这个似乎在说深圳的悠长历史,可是我印象中这是深圳的薄弱之处。抱歉,我这里没有好的
素材。


近代展厅
此展厅讲述深圳从鸦片战争以来的发展历史。

民国时期的成绩单,看看那时候的科目:国语,算术,历史,自然,地理,图画,美术等等
……


旧式缝纫机。我真的不觉得很旧,因为老妈还有一个缝纫机,形状神似。


罗湖火车站的旧景。


抗日战争中使用的武器,我总以为解放军最先进的是驳壳枪……


现代展厅
深圳所具备的魅力,毫无疑问被定格在了现代。作为改革开放的试点城市,深圳引进外资,
对外开放,成就了神话般的成长速度。这个地方看到的东西就非常新奇了。

恨死这家伙,把我照片拍的血肉模糊……


模拟的深圳特区全景,包括了关内的四个区。


超级乐高机器人!太太太酷了,我还在szlug里贴给他们看呐,只可惜我不能碰它:P


展示深圳金融系统推出的各种卡:银穗卡,一卡通,信用卡。教条内容:2000年深圳率先建
立以银行、证券、保险为主体,其他类型金融机构并存的现代金融体系。


深圳湾码头,被大堆的集装箱所淹没。


这一切的始作俑者,邓公。


谢谢欣赏。

2009年1月9日星期五

初学sed

sed, awk等等UNIX下的工具初看显得晦涩又难用,就些命令行搞那么复杂干哈子呀。

不过一旦掌握以后就能发现给日常操作带来很大好处,那些简洁高效的命令行可都有着悠久 的历史了……

因此在学习他们之前,告诫自己:Don't get confuSed~

这里的例子全部来自ibm developerworks。
http://www.ibm.com/developerworks/linux/library/l-sed1.html

# 基本篇
sed -e 'd' /etc/services #删除所有行,因此没有输出
sed -e '1d' /etc/services | more #删除第一行
sed -e '1,10d' /etc/services | more #删除1-10行

# 正则篇
sed -e '/^#/d' /etc/services | more #删除注释
sed -n -e '/regexp/p' /path/to/my/test/file | more #打印匹配regexp的行
#-n 标示只打印regexp匹配字符,-e针对文本,-f将指定sed 脚本

#标准的正则符号有
# ^: matches all begin with...
# $: matches the end of the line...
# .: matches any single char
# *: will match zero or more occurences of the previous char
# []: matches all the characters inside the []

sed -n -e '/BEGIN/,/END/p' /my/test/file | more
#打印一个范围,首行包含BEGIN, 尾行包含END

sed -ne '/main[[:space:]]*(/,/^)/p' tmp.c
#打印main函数

# 替换篇
sed -e 's/foo/bar/' myfile.txt #找到第一个foo,替换为bar
sed -e 's/foo/bar/g' myfile.txt #全局替换
sed -e '1,10s/foo/bar/g' myfile.txt
sed -e '/^$/,/^END/s/foo/bar/g' myfile.txt
#以最前的空行为开始,END字符结束

sed -e 's:/usr/local:/usr:g' myfile.txt
#改变操作服为`:'

sed -e 's/<[^>]*>//g' myfile.html
#原文本: This is what I want
#改变后: This is what I want.

sed -e 's/.*/ralph said: &/' myfile.html
#在所有首行添加"ralph said: "

sed -e 's/\(.*\) \(.*\) \(.*\)'/Victor \1-\2 Von \3/' myfile.txt
#原文本:
# foo bar oni
# eeny meeny miny
#改变后:
# Victor foo-bar Von oni
# Victor eeny-meeny Von miny


sed一般用来 (via builder.com)—

  • Double/triple-space a file
  • 转化DOS/UNIX 的新行(newline)
  • 删除前后的空格
  • 在所有/全部行上进行取代操作
  • 删除连续的空行
  • 删除文件开头和结尾的空行

2008年12月25日星期四

ARM Linux 启动过程 (1)

此系列记录了ARM Linux从Bootloader部分到Linux初始化,然后进入C环境的一段坎坷历程 。作为第一部分,我将从RedBoot开开始。RedBoot是嵌入式中应用广泛的Bootloader,他将作为此系列的序章。

RedBoot (bootloader)

  • 概述
  • RedBoot所作的工作

概述

(本示例讲解基于ARM9的Cirrus EP9302) Bootloader 在 ARM 中依然是加电后的第一道程序,其作用简单,相当于 PC 机器上的 BIOS 固件程序。Bootloader 负责完成系统初始化,它将非易失性储存器中的 Linux 内核 拷贝到 RAM 中去,然后跳转到内核的第一道指令,将控制权交给内核。从这个意义上讲, 嵌入式 Bootloader 要做的事情比 x86 等机器多很多。

一般ARM Linux的第一条指令地址是0x0000_0000,而通常嵌入式系统会将FLASH等存储寄存 器映射到这个地址,而Bootloader就位于该存储器顶端,这保证了Bootloader的顺利执行。

以 RedBoot for EP93xx 为例,EP93xx 采用 NAND Flash 作为存储介质,在 RedBoot 中可 以罗列存储器的根目录如下:

RedBoot> fis init
Name FLASH addr Mem addr Length Entry point
RedBoot 0x60000000 0x60000000 0x00040000 0x00000000
RedBoot config 0x60FC0000 0x60FC0000 0x00001000 0x00000000
FIS directory 0x60FE0000 0x60FE0000 0x00020000 0x00000000
zImage 0x60040000 0x00080000 0x00120000 0x00080000
ramdisk 0x60140000 0x00800000 0x00800000 0x00800000

这里可以看出在 Flash 文件系统中存储了他的系统文件 RedBoot(内核)、RedBoot config(设置信息)、FIS directory(系统目录),另外就是 Linux 的内核 zImage 和内 存盘 ramdisk.gz。

RedBoot做的工作

  1. SDRAM初始化,没有内存,啥东西也玩不转 (cyg/hal/hal_platform_setup.h)
  2. 初始化串口 (hal/arch/ARCH/src/hal_diag.c)
  3. 检测处理器类型 (宏指定,cdl/hal_ARCH_MACHINE.cdl)
  4. 设置Linux启动参数 (hal/ARCH/arch/src/redboot_linux_exec.c)
  5. 将Linux内核装载到内存中,跳转执行

启动内核

启动内核函数do_exec的这段代码在 hal/ARCH/arch/src/redboot_linux_exec.c,最重要的 就是末尾处的内联汇编语句:

    asm volatile (
CYGARC_HAL_MMU_OFF(%5)
"__tramp_start__:\n"
" cmp %1,%4;\n" // Default kernel load address. Relocate
" beq 2f;\n" // kernel image there if necessary, and
" cmp %2,#0;\n" // if size is non-zero
" beq 2f;\n"
"1:\n"
" ldr r0,[%1],#4;\n"
" str r0,[%4],#4;\n"
" subs %2,%2,#4;\n"
" bne 1b;\n"
"2:\n"
" mov r0,#0;\n" // Set board type
" mov r1,%3;\n" // Machine type
" mov r2,%6;\n" // Kernel parameters
" mov pc,%0;\n" // Jump to kernel
"__tramp_end__:\n"
: :
"r"(entry),
"r"(CYGARC_PHYSICAL_ADDRESS(base_addr)),
"r"(length),
"r"(CYGHWR_REDBOOT_ARM_MACHINE_TYPE),
#ifdef CYGHWR_HAL_ARM_EDB93XX_VARIANT
"r"((CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS & 0x3ffffff) +
ConfigInfo[3]),
#else
"r"(CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS),
#endif
"r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS)),
"r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_LINUX_TAGS_ADDRESS))
: "r0", "r1"
);
首先关闭MMU,保证代码跳转位置是绝对的物理地址,然后重置内核(如果需要)到entry处, 执行跳转,跳转前保证了:r0置0,r1装载机器类型,r2装载struct tag数组地址。

这样RedBoot结束了其短暂而又伟大的一生,我们进入Linux的世界。