Hi all,
We have just done EMIF performance measurements with one Hercules Dev KIT with a Rev B mask (chip is marked "TMP570 4357BZW"). These measures
were done for asynchronous interface mode. We were happy to see that problems traced by errata #39 on Rev A mask is fully corrected for read cycles.
But for write cycles, we still have three WE pulses whatever the write type is (32 bits, 16 bits, 8 bits). This is exactly what was decribed in the forum subject "TMS570LC4357 Errata #39 clarification" where precise timing diagrams for 32/16/8 bits reads & writes were given by TI
By searching in forum we found that the problem may be due to incorrect programming of R5 core memory protection unit (MPU). So we did again the test by enabling the R5 core MPU and setting up a region for EMIF bus async (CS2, CS3, CS4) in "DEVICE" mode but we found no difference, problem was still present. We also did the same test with MPU region for EMIF bus async set to "STRONGLY_ORDERED" and we get the same problem (see joined figure). The programming of R5 core MPU is given in file also shown below (derived from same name file generated by HalCoGen)
So my question is to know if this errata of TMS570LC4357 still exists for writes cycles because the Rev B mask errata list (document spnz232 dated August 2015) indicates this Errata #39 has been corrected in Rev B mask, and it seems that there is no new errata dealing with EMIF bus in asynchronous mode for this new mask release.
This problem on write cycles leads to divide EMIF performance by a factor of 3 since for a simple 16 bits write, it takes 3 basic cycles instead of one. For instantaneous write performance, it's a problem in our real time application.
Thank you for your help
Best regards
Sylvain Balssa
-------------------- HL_sys_mpu.asm file (extract) -------------------------------
FLASHBase .word 0x00000000
SRAMBase .word 0x08000000
SYSPCR1Base .word 0xFFF80000
SYSPCR2Base .word 0xFC000000
SYSPCR3Base .word 0xFF000000
TIOTPBase .word 0xF0080000
EMIFASYNCBase .word 0x60000000
r7Base .word 0x08000000
r8Base .word 0x08000000
r9Base .word 0x08070000
r10Base .word 0x08070000
r11Base .word 0x00000000
r12Base .word 0x00000000
r13Base .word 0xF0000000
r14Base .word 0xF8000000
r15Base .word 0xF8000000
r16Base .word 0xF0000000
MPU_S_U_X .equ 0x0000
MPU_SRW_U_X .equ 0x0100
MPU_SRW_UR_X .equ 0x0200
MPU_SRW_URW_X .equ 0x0300
MPU_SR_U_X .equ 0x0500
MPU_SR_UR_X .equ 0x0600
MPU_S_U_ .equ 0x1000
MPU_SRW_U_ .equ 0x1100
MPU_SRW_UR_ .equ 0x1200
MPU_SRW_URW_ .equ 0x1300
MPU_SR_U_ .equ 0x1500
MPU_SR_UR_ .equ 0x1600
MEMTYPE_STRONGLY_ORDERED .equ 000000B
MEMTYPE_SHAREABLE_DEVICE .equ 000001B
MEMTYPE_NORMAL_NON_CACHE .equ 001000B
MPU_SIZE_32B .equ (00100B << 1)
MPU_SIZE_64B .equ (00101B << 1)
MPU_SIZE_128B .equ (00110B << 1)
MPU_SIZE_256B .equ (00111B << 1)
MPU_SIZE_512B .equ (01000B << 1)
MPU_SIZE_1K .equ (01001B << 1)
MPU_SIZE_2K .equ (01010B << 1)
MPU_SIZE_4K .equ (01011B << 1)
MPU_SIZE_8K .equ (01100B << 1)
MPU_SIZE_16K .equ (01101B << 1)
MPU_SIZE_32K .equ (01110B << 1)
MPU_SIZE_64K .equ (01111B << 1)
MPU_SIZE_128K .equ (10000B << 1)
MPU_SIZE_256K .equ (10001B << 1)
MPU_SIZE_512K .equ (10010B << 1)
MPU_SIZE_1M .equ (10011B << 1)
MPU_SIZE_2M .equ (10100B << 1)
MPU_SIZE_4M .equ (10101B << 1)
MPU_SIZE_8M .equ (10110B << 1)
MPU_SIZE_16M .equ (10111B << 1)
MPU_SIZE_32M .equ (11000B << 1)
MPU_SIZE_64M .equ (11001B << 1)
MPU_SIZE_128M .equ (11010B << 1)
MPU_SIZE_256M .equ (11011B << 1)
MPU_SIZE_512M .equ (11100B << 1)
MPU_SIZE_1G .equ (11101B << 1)
MPU_SIZE_2G .equ (11110B << 1)
MPU_SIZE_4G .equ (11111B << 1)
MPU_ENA_REGION .equ (0x0001)
MPU_DIS_SUBREG1 .equ (0x1 << 8)
MPU_DIS_SUBREG2 .equ (0x1 << 9)
MPU_DIS_SUBREG3 .equ (0x1 << 10)
MPU_DIS_SUBREG4 .equ (0x1 << 11)
MPU_DIS_SUBREG5 .equ (0x1 << 12)
MPU_DIS_SUBREG6 .equ (0x1 << 13)
MPU_DIS_SUBREG7 .equ (0x1 << 14)
MPU_DIS_SUBREG8 .equ (0x1 << 15)
.def _mpuInit_
.asmfunc
* --------------------------------------------------------------------------- *
* This function initializes MPU regions : *
* - Region 1 : Flash : 4MB / SRW_URW_X Normal mode *
* - Region 2 : SRAM : 512KB / SRW_URW Normal mode *
* - Region 3 : System and module under PCR1/PCR3 : 16MB / SRW_URW Normal mode *
* - Region 4 : module under PCR2 : 16MB / SRW_URW Normal mode *
* - Region 5 : TI OTP : 16KB / SR Normal mode *
* - Region 6 : EMIF Asynchronous : 256 MB / SRW_URW Strongly ordered mode *
* --------------------------------------------------------------------------- *
_mpuInit_
stmfd sp!, {r0}
; Disable mpu
mrc p15, #0, r0, c1, c0, #0
bic r0, r0, #1
dsb
mcr p15, #0, r0, c1, c0, #0
isb
; Disable background region
mrc p15, #0, r0, c1, c0, #0
bic r0, r0, #0x20000
mcr p15, #0, r0, c1, c0, #0
; Set-up region 1 : Flash Prom
;---------------------------------------------------
; - base address = 0x00000000
; - access control :
; - Memory type = Normal non cacheable
; - Sharing = Non Shared
; - access = Supervisor R&W + User R&W + Execution allowed
; - Size & Enable
; - Size = 4 MBytes
; - Enabled = YES
; - Sub-regions = all enabled
mov r0, #0
mcr p15, #0, r0, c6, c2, #0
ldr r0, FLASHBase
mcr p15, #0, r0, c6, c1, #0
mov r0, #MEMTYPE_NORMAL_NON_CACHE
orr r0, r0, #MPU_SRW_URW_X
mcr p15, #0, r0, c6, c1, #4
movw r0, #(MPU_SIZE_4M | MPU_ENA_REGION)
mcr p15, #0, r0, c6, c1, #2
; Set-up region 2 : SRAM
;---------------------------------------------------
; - base address = 0x08000000
; - access control :
; - Memory type = Normal non cacheable
; - Sharing = Non Shared
; - access = Supervisor R&W + User R&W
; - Size & Enable
; - Size = 512 KBytes
; - Enabled = YES
; - Sub-regions = all enabled
mov r0, #1
mcr p15, #0, r0, c6, c2, #0
ldr r0, SRAMBase
mcr p15, #0, r0, c6, c1, #0
mov r0, #MEMTYPE_NORMAL_NON_CACHE
orr r0, r0, #MPU_SRW_URW_
mcr p15, #0, r0, c6, c1, #4
movw r0, #(MPU_SIZE_512K | MPU_ENA_REGION)
mcr p15, #0, r0, c6, c1, #2
; Set-up region 3 : System and module under PCR1/PCR3
;---------------------------------------------------
; - base address = 0xFF000000
; - access control :
; - Memory type = Normal non cacheable
; - Sharing = Non Shared
; - access = Supervisor R&W + User R&W
; - Size & Enable
; - Size = 16 MBytes
; - Enabled = YES
; - Sub-regions = all enabled
mov r0, #2
mcr p15, #0, r0, c6, c2, #0
ldr r0, SYSPCR3Base
mcr p15, #0, r0, c6, c1, #0
mov r0, #MEMTYPE_NORMAL_NON_CACHE
orr r0, r0, #MPU_SRW_URW_
mcr p15, #0, r0, c6, c1, #4
movw r0, #(MPU_SIZE_16M | MPU_ENA_REGION)
mcr p15, #0, r0, c6, c1, #2
; Set-up region 4 : module under PCR2
;---------------------------------------------------
; - base address = 0xFC000000
; - access control :
; - Memory type = Normal non cacheable
; - Sharing = Non Shared
; - access = Supervisor R&W + User R&W
; - Size & Enable
; - Size = 16 MBytes
; - Enabled = YES
; - Sub-regions = all enabled
mov r0, #3
mcr p15, #0, r0, c6, c2, #0
ldr r0, SYSPCR2Base
mcr p15, #0, r0, c6, c1, #0
mov r0, #MEMTYPE_NORMAL_NON_CACHE
orr r0, r0, #MPU_SRW_URW_
mcr p15, #0, r0, c6, c1, #4
movw r0, #(MPU_SIZE_16M | MPU_ENA_REGION)
mcr p15, #0, r0, c6, c1, #2
; Setup region 5 : TI OTP : 16K / SR
;---------------------------------------------------
; - base address = 0xFF000000
; - access control :
; - Memory type = Normal non cacheable
; - Sharing = Non Shared
; - access = Supervisor R
; - Size & Enable
; - Size = 16 KBytes
; - Enabled = YES
; - Sub-regions = all enabled
mov r0, #4
mcr p15, #0, r0, c6, c2, #0
ldr r0, TIOTPBase
mcr p15, #0, r0, c6, c1, #0
mov r0, #MEMTYPE_NORMAL_NON_CACHE
orr r0, r0, #MPU_SR_U_
mcr p15, #0, r0, c6, c1, #4
movw r0, #(MPU_SIZE_16K | MPU_ENA_REGION)
mcr p15, #0, r0, c6, c1, #2
; Set-up region 6 : EMIF bus in asynchronous mode
;---------------------------------------------------
; - base address = 0x60000000
; - access control :
; - Memory type = Strongly ordered
; - Sharing = no meaning, strongly ordered type is always shareable ?
; - access = Supervisor R&W + User R&W
; - Size & Enable
; - Size = 256 MBytes
; - Enabled = YES
; - Sub-regions = 7 and 8 disabled
mov r0, #5
mcr p15, #0, r0, c6, c2, #0
ldr r0, EMIFASYNCBase
mcr p15, #0, r0, c6, c1, #0
mov r0, #MEMTYPE_STRONGLY_ORDERED
orr r0, r0, #MPU_SRW_URW_
mcr p15, #0, r0, c6, c1, #4
movw r0, #(MPU_SIZE_256M | MPU_DIS_SUBREG7 | MPU_DIS_SUBREG8 | MPU_ENA_REGION)
mcr p15, #0, r0, c6, c1, #2
; Setup region 7 : disable
mov r0, #6
mcr p15, #0, r0, c6, c2, #0
ldr r0, r7Base
mcr p15, #0, r0, c6, c1, #0
mov r0, #0x0002
orr r0, r0, #0x1300
mcr p15, #0, r0, c6, c1, #4
movw r0, #((0 << 15) + (0 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x12 << 1) + (0))
mcr p15, #0, r0, c6, c1, #2
; Setup region 8 : disable
mov r0, #7
mcr p15, #0, r0, c6, c2, #0
ldr r0, r8Base
mcr p15, #0, r0, c6, c1, #0
mov r0, #0x0002
orr r0, r0, #0x1300
mcr p15, #0, r0, c6, c1, #4
movw r0, #((0 << 15) + (0 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x12 << 1) + (0))
mcr p15, #0, r0, c6, c1, #2
; Setup region 9 : disable
mov r0, #8
mcr p15, #0, r0, c6, c2, #0
ldr r0, r9Base
mcr p15, #0, r0, c6, c1, #0
mov r0, #0x000C
orr r0, r0, #0x1200
mcr p15, #0, r0, c6, c1, #4
movw r0, #((0 << 15) + (1 << 14) + (1 << 13) + (1 << 12) + (1 << 11) + (1 << 10) + (1 << 9) + (1 << 8) + (0x0E << 1) + (0))
mcr p15, #0, r0, c6, c1, #2
; Setup region 10 : disable
mov r0, #9
mcr p15, #0, r0, c6, c2, #0
ldr r0, r10Base
mcr p15, #0, r0, c6, c1, #0
mov r0, #0x000C
orr r0, r0, #0x1300
mcr p15, #0, r0, c6, c1, #4
movw r0, #((1 << 15) + (0 << 14) + (1 << 13) + (1 << 12) + (1 << 11) + (1 << 10) + (1 << 9) + (1 << 8) + (0x0F << 1) + (0))
mcr p15, #0, r0, c6, c1, #2
; Setup region 11 : disable
mov r0, #10
mcr p15, #0, r0, c6, c2, #0
ldr r0, r11Base
mcr p15, #0, r0, c6, c1, #0
mov r0, #0x0008
orr r0, r0, #0x0600
mcr p15, #0, r0, c6, c1, #4
movw r0, #((0 << 15) + (0 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x15 << 1) + (0))
mcr p15, #0, r0, c6, c1, #2
; Setup region 12 : disable
mov r0, #11
mcr p15, #0, r0, c6, c2, #0
ldr r0, r12Base
mcr p15, #0, r0, c6, c1, #0
mov r0, #0x0010
orr r0, r0, #0x1600
mcr p15, #0, r0, c6, c1, #4
movw r0, #((1 << 15) + (1 << 14) + (1 << 13) + (1 << 12) + (1 << 11) + (1 << 10) + (1 << 9) + (1 << 8) + (0x15 << 1) + (0))
mcr p15, #0, r0, c6, c1, #2
; Setup region 13 : disable
mov r0, #12
mcr p15, #0, r0, c6, c2, #0
ldr r0, r13Base
mcr p15, #0, r0, c6, c1, #0
mov r0, #0x0010
orr r0, r0, #0x1600
mcr p15, #0, r0, c6, c1, #4
movw r0, #((1 << 15) + (1 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x16 << 1) + (0))
mcr p15, #0, r0, c6, c1, #2
; Setup region 14 : disable
mov r0, #13
mcr p15, #0, r0, c6, c2, #0
ldr r0, r14Base
mcr p15, #0, r0, c6, c1, #0
mov r0, #0x0010
orr r0, r0, #0x1100
mcr p15, #0, r0, c6, c1, #4
movw r0, #((0 << 15) + (0 << 14) + (1 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (1 << 9) + (1 << 8) + (0x1A << 1) + (0))
mcr p15, #0, r0, c6, c1, #2
; Setup region 15 : disable
mov r0, #14
mcr p15, #0, r0, c6, c2, #0
ldr r0, r15Base
mcr p15, #0, r0, c6, c1, #0
mov r0, #0x0010
orr r0, r0, #0x1300
mcr p15, #0, r0, c6, c1, #4
movw r0, #((0 << 15) + (0 << 14) + (1 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (1 << 9) + (1 << 8) + (0x1A << 1) + (0))
mcr p15, #0, r0, c6, c1, #2
; Setup region 16 : disable
mov r0, #15
mcr p15, #0, r0, c6, c2, #0
ldr r0, r16Base
mcr p15, #0, r0, c6, c1, #0
mov r0, #0x0000
orr r0, r0, #0x1300
mcr p15, #0, r0, c6, c1, #4
movw r0, #((0 << 15) + (0 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x1B << 1) + (0))
mcr p15, #0, r0, c6, c1, #2
; Enable mpu
mrc p15, #0, r0, c1, c0, #0
orr r0, r0, #1
dsb
mcr p15, #0, r0, c1, c0, #0
isb
ldmfd sp!, {r0}
bx lr
.endasmfunc
;-------------------------------------------------------------------------------
