Перейти к содержанию
    

ARM926 disable/clear cache

Здравствуйте, имеется Sansa Fuze plus на imx233  и проект Rockbox , хочу сделать частоту работы памяти 48Mhz  , по умолчанию работает на 133Mhz
Сколько смог перебрать вручную - не получил результата, необходимо сделать опцию "Search Data EYE" , после использования инструкций по записи массива данных в RAM необходимо очистить весь кеш и прочитать даные из RAM
подскажите какую функцию(или функции) использовать для очистки кеша (типа drain-write-buffer + clear-cache )
https://github.com/mguentner/rockbox/blob/master/firmware/target/arm/mmu-arm.S

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

55 minutes ago, Deus-Ex said:

хочу сделать частоту работы памяти 48Mhz

Память может не захотеть: по стандарту минимальная частота DDR - 83MHz.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Deus-Ex сказал:

подскажите какую функцию(или функции) использовать для очистки кеша (типа drain-write-buffer + clear-cache )

См. регистр CP15:

;CP15 Control register bits
CP15_C1_M       .EQU    0  ;MMU enable/disable
CP15_C1_A       .EQU    1  ;Alignment fault enable/disable
CP15_C1_C       .EQU    2  ;DCache enable/disable
CP15_C1_B       .EQU    7  ;Big-endian/little-endian
CP15_C1_S       .EQU    8  ;System protection
CP15_C1_R       .EQU    9  ;ROM protection
CP15_C1_I       .EQU    12 ;ICache enable/disable
CP15_C1_V       .EQU    13 ;Location of exception vectors
CP15_C1_RR      .EQU    14 ;Round robin/random replacement
CP15_C1_L4      .EQU    15 ;Determines if the T bit is set when load instructions change the PC
_ResetMMU:      MCR     P15, #0, R0, C7, C10, #4  ;drain write buffer
                MRC     P15, #0, R2, C1, C0, #0
                MCR     P15, #0, R0, C8, C7, #0  ;invalidate set-associative TLB
                BIC     R2, R2, #(1 << CP15_C1_M | 1 << CP15_C1_C) ;cache off
                BIC     R2, R2, #(1 << CP15_C1_I) ;cache off
                MCR     P15, #0, R2, C1, C0, #0
                BX      LR

_SetMMU:        MRC     P15, #0, R2, C1, C0, #0
                BIC     R2, R2, #(1 << CP15_C1_S)
                MCR     P15, #0, R2, C1, C0, #0
                MRC     P15, #0, R2, C1, C0, #0
                ORR     R2, R2, #(1 << CP15_C1_R)
                MCR     P15, #0, R2, C1, C0, #0
                MCR     P15, #0, R0, C2, C0, #0  ;write Translation Table Base Register
                MCR     P15, #0, R1, C3, C0, #0  ;set the MMU domain access control register

                MRC     P15, #0, R2, C1, C0, #0
                MCR     P15, #0, R0, C8, C7, #0  ;invalidate set-associative TLB
                ORR     R2, R2, #(1 << CP15_C1_M) ;MMU on
                MCR     P15, #0, R2, C1, C0, #0

                MRC     P15, #0, R2, C1, C0, #0
                MCR     P15, #0, R0, C7, C7, #0  ;invalidate entire cache
                ORR     R2, R2, #(1 << CP15_C1_M | 1 << CP15_C1_C) ;cache on
                ORR     R2, R2, #(1 << CP15_C1_I) ;cache on
                MCR     P15, #0, R2, C1, C0, #0
                BX      LR

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не получается у меня что-то ,  при сравнении данных из RAM(mDDR) с данными из внутренней SRAM  - всегда валидация проходит
По умолчанию MMU DCache ICache включены , есть области данных NOCACHEDATA_ATTR ,  DATA_ATTR ( map_section(DRAM_ORIG, CACHED_DRAM_ADDR, MEMORYSIZE, CACHE_ALL);map_section(DRAM_ORIG, BUFFERED_DRAM_ADDR, MEMORYSIZE, BUFFERED);) , а так же IDATA_ATTR (внут SRAM)
В самом начале функции был выключен DCache

asm("mrc p15, 0, r4, c1, c0, 0\n\t"
	"bic	r4, r4, #0x04\n\t"  //Clear DCache bit
	"mcr	p15, 0, r4, c1, c0, 0\n\t"
	"tci_loop: mrc	p15, 0, r4, c7, c14, 3\n\t" //Test, clean, and invalidate DCache
	"bne	tci_loop\n\t"
	: 
    : 
    : "r4");

между записью в RAM и чтением пробовал добавлять комманду  Drain write buffer , Test and clean DCache
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Алгоритм примерно такой

const uint32_t Table[64] IDATA_ATTR ={0x550055,..};
write DQS_OUT_SHIFT_BYPASS = (const) 1;
for(Y=1;Y<0x30;Y++ )
{  write new WR_DQS_SHIFT_BYPASS value ={Y};
   DRAM_SREFRESH=0, DLL_RESET=0
   for(X=1;X<0x30;X++ ) 
   {write new DLL_DQS_DELAY_BYPASS_1 _0 value = {X};
     for(..) DRAM_DATA[i]=Table[i];
     for(..) if(DRAM_DATA[i]!=Table[i]) break;
     //Фиксация результата и отбор самого широкого DATAEYE//
     DRAM_SREFRESH=1, DLL_RESET=1
   }
}

Пробовал и с отключением MMU как командами из предыдущегор сообщения , так и немного другими последовательностями - сравнение данных всегда проходит успешно.
Пробовал без отключения MMU, но с некоторыми параметрами , типа DRAM_DATA NOCACHEDATA_ATTR как-то получилось получить общее количество неподходящих X =  0x30 (для Y=1)  0x30 (Y=2) 0x30 0x30 0x19(Y=4) 0x00(Y=5..30)...
В последней версии я упростил многое , изменил   map_section(DRAM_ORIG, CACHED_DRAM_ADDR, MEMORYSIZE, CACHE_NONE); map_section(DRAM_ORIG, BUFFERED_DRAM_ADDR, MEMORYSIZE, CACHE_NONE); (Uncashed,unbuffered) , отключал так же CP15 Test and Debug Registers " Disable DCache linefill" и еще Memory Region Remap Register принудительно в noncacheable nonbufferable - итого на Y=1 X=1 одна ошибка чтения (вылет из цикла по break) и далее все без ошибок.
 

Может там чего-нибудь эдакового Freescale намудрили и теперь  dcache отключить нельзя , в даташите к примеру приводится  " The i.MX23 always operates in little-endian mode."

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...