一、LS7A地址空间
二、处理器的访问
2.1 PCI 设备和功能
2.2 PCI 配置访问地址
程序里设置
#DEFINE UNCACHED_MEMORY_ADDR = 0x8000000000000000
#define PHYS_TO_UNCACHED(x) ((UINT64)UNCACHED_MEMORY_ADDR | (x))
#define HT1_CONF_BASE_ADDR PHYS_TO_UNCACHED(0x0efdfe000000)
/* PCI device header */
#define HEADER_ADDR(X,Y) (HT1_CONF_BASE_ADDR | (X << 11) | (Y << 8))
#define MISC_HEADER_ADDR HEADER_ADDR(2, 0) //0x80000efdfe001000
#define GMAC0_HEADER_ADDR HEADER_ADDR(3, 0)
#define GMAC1_HEADER_ADDR HEADER_ADDR(3, 1)
#define USB0_OHCI_HEADER_ADDR HEADER_ADDR(4, 0)
#define USB0_EHCI_HEADER_ADDR HEADER_ADDR(4, 1)
#define USB1_OHCI_HEADER_ADDR HEADER_ADDR(4, 0)
#define USB1_EHCI_HEADER_ADDR HEADER_ADDR(4, 1)
#define GPU_HEADER_ADDR HEADER_ADDR(6, 0)
#define DC_HEADER_ADDR HEADER_ADDR(6, 1)
#define HDA_HEADER_ADDR HEADER_ADDR(7, 0)
#define AC97_HEADER_ADDR HEADER_ADDR(7, 1)
#define SATA0_HEADER_ADDR HEADER_ADDR(8, 0)
#define SATA1_HEADER_ADDR HEADER_ADDR(8, 1)
#define SATA2_HEADER_ADDR HEADER_ADDR(8, 2)
#define CONFBUS_HEADER_ADDR HEADER_ADDR(21, 0)
#define SPI_HEADER_ADDR HEADER_ADDR(22, 0)
#define LPC_HEADER_ADDR HEADER_ADDR(23, 0
2.2.1 可用下面函数获取地址
vim ls7apci.c
#include <stdio.h>
#include <stdlib.h>
#define UNCACHED_MEMORY_ADDR 0x8000000000000000
#define PHYS_TO_UNCACHED(x) ((unsigned long long)UNCACHED_MEMORY_ADDR | (x))
#define HT1_CONF_BASE_ADDR PHYS_TO_UNCACHED(0x0efdfe000000)
/* PCI device header */
#define HEADER_ADDR(X,Y) (HT1_CONF_BASE_ADDR | (X << 11) | (Y << 8))
int main(int argc, char *argv[])
{
int i;
int dev,fun;
unsigned long long addr;
if(argc == 3) {
dev = atoi(argv[1]);
fun = atoi(argv[2]);
addr = HEADER_ADDR(dev,fun);
printf("dev[%d] fun[%d] addr=0x%llx",dev,fun,addr);
} else {
printf("./ls7apci dev fun");
}
printf("\n");
return 0;
}
2.2.2 操作过程
- 编译:
gcc -o ls7apci -static ls7apci.c
- 使用:获取MISC配置空间地址
./ls7apci 2 0
- 结果:
dev[2] fun[0] addr=0x80000efdfe001000
- 龙芯板卡系统下查询 MISC 基地址:
busybox devmem 0xefdfe001010
- 龙芯板卡系统下查询结果:MISC 基地址是
0x10080004
2.3 桥片固定地址设备地址空间
HT1_MEM_BASE_ADDR 地址 PHYS_TO_UNCACHED(0x0e0000000000) == 0x80000e0000000000
# 例子:
#DEFINE UNCACHED_MEMORY_ADDR = 0x8000000000000000
#define PHYS_TO_UNCACHED(x) ((UINT64)UNCACHED_MEMORY_ADDR | (x))
#define HT1_MEM_BASE_ADDR PHYS_TO_UNCACHED(0x0e0000000000)
#define CONFBUS_BASE_ADDR 0x10010000
#define LS7A_CONFBUS_BASE_ADDR (HT1_MEM_BASE_ADDR | CONFBUS_BASE_ADDR)
2.4 桥片配置寄存器
- 基地址:0x80000e0010010000
2.5 桥片温度传感器
- 基地址:0x80000e0010000400
2.6 MISC 低速设备
- 基地址:0x8000000010080000
2.6.1 UART 控制器
UART 控制器的内部时钟频率为 50MHz,UART 总线支持的最高波特率为 460800
桥片集成了 4 个 UART 控制器。其中, UART1、UART2 、UART3只能工作在两线 UART 模式, UART0 可以工作在全功能 UART 模式,也可以工作在两线 UART 模式
- UART0 基地址:0x8000000010080000
- UART1 基地址:0x8000000010080100
- UART2 基地址:0x8000000010080200
- UART3 基地址:0x8000000010080300
复用控制:引脚复用配置寄存器0 地址:0x80000e0010010440 bit28~bit31
2.6.2 CAN 控制器
集成了四路 CAN 接口控制器,最高传送速率1Mbps
- can0 基地址:0x8000000010080400
- can1 基地址:0x8000000010080500
- can2 基地址:0x8000000010080600
- can3 基地址:0x8000000010080700
复用控制:引脚复用配置寄存器1 地址:0x80000e0010010444 bit0~bit3
2.6.3 I2C 控制器
集成了 6 个 I2C 控制器,I2C 接口的最高传送速率 400kbps
- i2c0 基地址:0x8000000010090000
- i2c1 基地址:0x8000000010090100
- i2c2 基地址:0x8000000010090200
- i2c3 基地址:0x8000000010090300
2.6.4 PWM 控制器
集成了四路脉冲宽度调节/计数控制器,每路 PWM 有一路脉冲宽度输出信号和一路待测脉冲输入信号。时钟频率为50MHz,计数寄存器和参考寄存器均 32 位数据宽度。
- pwm0 基地址:0x80000000100a0000
- pwm1 基地址:0x80000000100a0100
- pwm2 基地址:0x80000000100a0200
- pwm3 基地址:0x80000000100a0300
2.6.5 HPET 控制器
HPET 控制器兼容标准规范。内部包括一个 64 位的主计数器(main count)以及三个32位的比较器(comparator)
- 基地址:0x80000000100c0000
3.5.6 电源管理模块(ACPI)
- 基地址:0x80000000100d0000
2.6.7 RTC 控制器
- 基地址:0x80000000100d0100
3.6.8 GPIO 控制器
- 基地址1:0x80000000100e0800
- 基地址2:0x80000000100e0000