Deus-Ex 0 16 января, 2023 Опубликовано 16 января, 2023 · Жалоба Здравствуйте, имеется 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 16 января, 2023 Опубликовано 16 января, 2023 · Жалоба 55 minutes ago, Deus-Ex said: хочу сделать частоту работы памяти 48Mhz Память может не захотеть: по стандарту минимальная частота DDR - 83MHz. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Deus-Ex 0 16 января, 2023 Опубликовано 16 января, 2023 · Жалоба Память mDDR1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 16 января, 2023 Опубликовано 16 января, 2023 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Deus-Ex 0 28 января, 2023 Опубликовано 28 января, 2023 · Жалоба Не получается у меня что-то , при сравнении данных из 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Deus-Ex 0 16 февраля, 2023 Опубликовано 16 февраля, 2023 · Жалоба Алгоритм примерно такой 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." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться