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

1 条评论:

  1. 补充一点:
    不能通过简单的控制port H and port C来控制DD[7:0]和ROW[7:0]的状态,原因在于9302中对port H C的设置采用了保护机制。以使用portH为例子,在使用之前要做以下操作,才能够保证对PORTH的设置生效。

    unsigned long lock;
    outb(0xAA,SYSCON_SWLOCK);
    lock=inl(SYSCON_DEVCFG);
    lock|=0x08000D00;
    outl(lock,SYSCON_DEVCFG);

    可以看看这里:http://arm.cirrus.com/forum/viewtopic.php?t=74

    回复删除