00. 目录


文章目录


00. 目录01. 开发环境02. 协处理器简介03. 获取Main ID04. 获取CCSIDR05. 获取SCTLR06. ID_MMFR307. 附录


01. 开发环境


  • 开发板:Tiny4412SDK标准版 「Tiny4412 SDK 1506」
  • 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
  • 平台:Ubuntu 20.04

02. 协处理器简介

协处理器(coprocessor),一种芯片,用于减轻系统微处理器的特定处理任务。

协处理器,这是一种协助中央处理器完成其无法执行或执行效率、效果低下的处理工作而开发和应用的处理器。这种中央处理器无法执行的工作有很多,比如设备间的信号传输、接入设备的管理等;而执行效率、效果低下的有图形处理、声频处理等。为了进行这些处理,各种辅助处理器就诞生了。需要说明的是,由于现在的计算机中,整数运算器与浮点运算器已经集成在一起,因此浮点处理器已经不算是辅助处理器。而内建于CPU中的协处理器,同样不算是辅助处理器,除非它是独立存在。

ARM 微处理器可支持多达 16 个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略 ARM 处理器和其他协处理器的指令。ARM 的协处理器指令主要用于 ARM 处理器初始化 ARM 协处理器的数据处理操作,以及在ARM 处理器的寄存器和协处理器的寄存器之间传送数据,和在 ARM 协处理器的寄存器和存储器之间传送数据。 ARM 协处理器指令包括以下 5 条: — CDP 协处理器数操作指令— LDC 协处理器数据加载指令— STC 协处理器数据存储指令— MCR ARM 处理器寄存器到协处理器寄存器的数据传送指令— MRC 协处理器寄存器到ARM 处理器寄存器的数据传送指令。

ARM:协处理器包括以下5条:


  • CDP:协处理器数据操作指令。
  • LDC:协处理器数据加载指令。
  • STC:协处理器数据存储指令。
  • MCR:ARM处理器寄存器到协处理器寄存器的数据传送指令。
  • MRC:协处理器寄存器到ARM处理器寄存器的数据传送指令 。

03. 获取Main ID


B3.17.2 Full list of VMSA CP15 registers, by coprocessor register number


MIDR相关描述31:24位

【ARM】Tiny4412裸板编程之协处理器_arm

16:19位描述

【ARM】Tiny4412裸板编程之协处理器_tiny4412_02

访问方法:

MRC p15, 0, <Rt>, c0, c0, 0 ; Read MIDR into Rt

cp15.S文件内容如下

.section .text
.align 2
.global get_midr
get_midr:
MRC p15, 0, r0, c0, c0, 0
mov pc, lr

test.c文件内容如下

#include <string.h>
#include <adc.h>



void (*udelay)(unsigned int) = (void*)0x43e26480;
int (*print)(const char *format, ...) = (void*)0x43e11a2c;

int main(void)
{

print("main start\n");


print("MIDR: %p\n", get_midr());

print("main end\n");

return 0;
}

执行结果

## Starting application at 0x50000000 ...
main start
MIDR: 413fc090
main end
## Application terminated, rc = 0x0
DengJin #

04. 获取CCSIDR

CCSIDR寄存器介绍

【ARM】Tiny4412裸板编程之协处理器_协处理器_03

访问方法

MRC p15, 1, <Rt>, c0, c0, 0 ; Read current CCSIDR into Rt

cp15.S文件

.section .text
.align 2
.global get_ccsidr
get_ccsidr:
MRC p15, 1, r0, c0, c0, 0
mov pc, lr

test.c文件

#include <string.h>
#include <adc.h>



void (*udelay)(unsigned int) = (void*)0x43e26480;
int (*print)(const char *format, ...) = (void*)0x43e11a2c;

int main(void)
{

print("main start\n");


print("MIDR: %p\n", get_midr());
print("CCSIDR: %p\n", get_ccsidr());

print("main end\n");

return 0;
}

执行结果

## Starting application at 0x50000000 ...
main start
MIDR: 413fc090
CCSIDR: 701fe019
main end
## Application terminated, rc = 0x0

05. 获取SCTLR


B4.1.130 SCTLR, System Control Register, VMSA
【ARM】Tiny4412裸板编程之协处理器_cp15_04



M, bit[0] MMU enable​. This is a global enable bit for the PL1&0 stage 1 MMU. The possible values of this
bit are:
0 PL1&0 stage 1 MMU disabled.
1 PL1&0 stage 1 MMU enabled.
In an implementation that includes the Security Extensions, this bit is Banked between the Secure
and Non-secure copies of the register.


访问方法

MRC p15, 0, <Rt>, c1, c0, 0 ; Read SCTLR into Rt
MCR p15, 0, <Rt>, c1, c0, 0 ; Write Rt to SCTLR

cp15.S文件

.section .text
.align 2
.global get_sctlr
get_sctlr:
MRC p15, 0, r0, c1, c0, 0
mov pc, lr

test.c文件

#include <string.h>
#include <adc.h>



void (*udelay)(unsigned int) = (void*)0x43e26480;
int (*print)(const char *format, ...) = (void*)0x43e11a2c;

int main(void)
{

print("main start\n");


print("MIDR: %p\n", get_midr());
print("CCSIDR: %p\n", get_ccsidr());
print("SCTLR: %p\n", get_sctlr());

print("main end\n");

return 0;
}

执行结果

## Starting application at 0x50000000 ...
main start
MIDR: 413fc090
CCSIDR: 701fe019
SCTLR: 00c5187a
main end
## Application terminated, rc = 0x0

06. ID_MMFR3

B4.1.92 ID_MMFR3, Memory Model Feature Register 3, VMSA

【ARM】Tiny4412裸板编程之协处理器_arm_05

访问方法

MRC p15, 0, <Rt>, c0, c1, 7 ; Read ID_MMFR3 into Rt

cp15.S文件

.section .text
.align 2
.global get_id_mmfr3
get_id_mmfr3:
MRC p15, 0, r0, c0, c1, 7
mov pc, lr

test.c文件

#include <string.h>
#include <adc.h>



void (*udelay)(unsigned int) = (void*)0x43e26480;
int (*print)(const char *format, ...) = (void*)0x43e11a2c;

int main(void)
{

print("main start\n");


print("MIDR: %p\n", get_midr());
print("CCSIDR: %p\n", get_ccsidr());
print("SCTLR: %p\n", get_sctlr());
print("ID_MMFR3: %p\n", get_id_mmfr3());

print("main end\n");

return 0;
}

执行结果

## Starting application at 0x50000000 ...
main start
MIDR: 413fc090
CCSIDR: 701fe019
SCTLR: 00c5187a
ID_MMFR3: 00102111
main end
## Application terminated, rc = 0x0

07. 附录

Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf