📄 nano_misc.c
字号:
// (intersperse some other activity) testmem[2] += testmem[3]; *p_hdtype |= ((( 0x11224488 == *dev2p ) && (0x77BBDDEE == *dev2p2 )) ? 0x200 : 0x100); // Next byte is devcount. breakout: // NB: *p_hdtype is carefully crafted to make a system with an error // detected above default to a single 8Mb device in all the ensuing // setup. // So now we should know: *p_hdsize = (0xff & ((*p_hdtype) >> 8)) * (0xff & *p_hdtype) * SZ_1M; /* * Set the TTB register */ asm volatile ("mcr p15,0,%0,c2,c0,0" : : "r"(ttb_base) /*:*/); /* * Set the Domain Access Control Register */ i = ARM_ACCESS_DACR_DEFAULT; asm volatile ("mcr p15,0,%0,c3,c0,0" : : "r"(i) /*:*/); /* * First clear all TT entries - ie Set them to Faulting */ memset((void *)ttb_base, 0, ARM_FIRST_LEVEL_PAGE_TABLE_SIZE); /* Actual Virtual Size Attributes Function */ /* Base Base MB cached? buffered? access permissions */ /* xxx00000 xxx00000 */ X_ARM_MMU_SECTION(0x000, 0x500, 32, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Boot flash ROMspace */#endif // CYG_HAL_STARTUP_ROM - ROM start only// We can do the mapping of the other stuff (NOT RAM) in RAM startup OK. X_ARM_MMU_SECTION(0x180, 0x180, 16, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Ethernet Adaptor */ X_ARM_MMU_SECTION(0x400, 0x400, 128, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* External IO Mux */ X_ARM_MMU_SECTION(0x480, 0x480, 128, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* External IO NonMux */#ifdef CYG_HAL_STARTUP_ROM // ROM start only X_ARM_MMU_SECTION(0x800, 0x800, 0x400, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* StrongARM(R) Registers */// X_ARM_MMU_SECTION(0xC00, 0, 32, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0,... */// X_ARM_MMU_SECTION(0xC00, 0xC00, 32, ARM_UNCACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0,... */ if ( (*p_hdtype & 32) ) { // Then they are 32Mb devices - KISS: X_ARM_MMU_SECTION(0xC00, 0, 32, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0 */ X_ARM_MMU_SECTION(0xC00, 0xC00, 32, ARM_UNCACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0 */ if ( 0x200 & *p_hdtype ) { // Got the 2nd device? X_ARM_MMU_SECTION(0xC80, 32, 32, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 1 */ X_ARM_MMU_SECTION(0xC80, 0xC80, 32, ARM_UNCACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 1 */ } } else if ( (*p_hdtype & 16) ) { // Then they are 16Mb devices - KISS: X_ARM_MMU_SECTION(0xC00, 0, 16, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0 */ X_ARM_MMU_SECTION(0xC00, 0xC00, 16, ARM_UNCACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0 */ if ( 0x200 & *p_hdtype ) { // Got the 2nd device? X_ARM_MMU_SECTION(0xC80, 16, 16, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 1 */ X_ARM_MMU_SECTION(0xC80, 0xC80, 16, ARM_UNCACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 1 */ } } else { // Then they are 8Mb devices, complicated: X_ARM_MMU_SECTION(0xC00, 0, 2, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0 */ X_ARM_MMU_SECTION(0xC04, 2, 2, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0 */ X_ARM_MMU_SECTION(0xC08, 4, 2, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0 */ X_ARM_MMU_SECTION(0xC0C, 6, 2, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0 */ // Next slot is 16Mb of space, with 2Mb gaps per 4Mb. X_ARM_MMU_SECTION(0xC00, 0xC00, 16, ARM_UNCACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 0 */ if ( 0x200 & *p_hdtype ) { // Got the 2nd device? X_ARM_MMU_SECTION(0xC80, 8, 2, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 1 */ X_ARM_MMU_SECTION(0xC84, 10, 2, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 1 */ X_ARM_MMU_SECTION(0xC88, 12, 2, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 1 */ X_ARM_MMU_SECTION(0xC8C, 14, 2, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 1 */ // Next slot is also 16Mb of space, with 2Mb gaps per 4Mb. X_ARM_MMU_SECTION(0xC80, 0xC80, 16, ARM_UNCACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* DRAM Bank 1 */ } }#endif // CYG_HAL_STARTUP_ROM - ROM start only#ifdef CYGPKG_IO_PCI /* * Actual Base = CYGHWR_HAL_ARM_EBSA285_PCI_MEM_MAP_BASE * Virtual Base = CYGHWR_HAL_ARM_EBSA285_PCI_MEM_MAP_BASE * Size = CYGHWR_HAL_ARM_EBSA285_PCI_MEM_MAP_SIZE * Memory accessible from PCI space. Overrides part of the above mapping. */ for (i = CYGHWR_HAL_ARM_NANO_PCI_MEM_MAP_BASE >> 20; i < ((CYGHWR_HAL_ARM_NANO_PCI_MEM_MAP_BASE+CYGHWR_HAL_ARM_NANO_PCI_MEM_MAP_SIZE) >> 20); i++) {#ifndef CYG_HAL_STARTUP_ROM // RAM start - common code below must go via uncached pointer int *p_hdsize = (int *)(((cyg_uint32)&hal_dram_size) | (0xC00u *SZ_1M));#endif // not CYG_HAL_STARTUP_ROM - RAM start only // Find the actual real address as above if already mapped: cyg_uint32 phys = hal_virt_to_phys_address( ((cyg_uint32)i) << 20 ); int j = phys >> 20; if ( ! ( 0xc00 < j && j < 0xe00 ) ) { // Not in physical SDRAM so yet mapped - so steal some from the main area. int k = (*p_hdsize) >> 20; // Top MegaByte k--; phys = hal_virt_to_phys_address( ((cyg_uint32)k) << 20 ); j = phys >> 20; CYG_ASSERT( 0xc00 < j && j < 0xe00, "Top Mb physical address not in SDRAM" ); (*p_hdsize) = (k << 20); // We just stole 1Mb. *(ARM_MMU_FIRST_LEVEL_DESCRIPTOR_ADDRESS(ttb_base, k)) = 0; // smash the old entry } CYG_ASSERT( 0xc00 < j && j < 0xe00, "PCI physical address not in SDRAM" ); ARM_MMU_SECTION(ttb_base, j, i, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); }#endif#ifdef CYG_HAL_STARTUP_ROM X_ARM_MMU_SECTION(0xE00, 0xE00, 128, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Zeros (Cache Clean) Bank */#endif // CYG_HAL_STARTUP_ROM - ROM start only // All done, phew!}//// Platform specific initialization//voidplf_hardware_init(void){// RAM startup only - rewrite relevent bits depending on config#ifndef CYG_HAL_STARTUP_ROM HAL_DCACHE_SYNC(); // Force data out hal_mmu_init(); // This works on real addresses only HAL_DCACHE_INVALIDATE_ALL(); // Flush TLBs: make new mmu state effective#endif // ! CYG_HAL_STARTUP_ROM - RAM start only#ifdef CYGPKG_IO_PCI cyg_pci_window_real_base = hal_virt_to_phys_address( CYGHWR_HAL_ARM_NANO_PCI_MEM_MAP_BASE );#endif}#include CYGHWR_MEMORY_LAYOUT_Htypedef void code_fun(void);void nano_program_new_stack(void *func){ register CYG_ADDRESS stack_ptr asm("sp"); register CYG_ADDRESS old_stack asm("r4"); register code_fun *new_func asm("r0"); old_stack = stack_ptr; stack_ptr = CYGMEM_REGION_ram + CYGMEM_REGION_ram_SIZE - sizeof(CYG_ADDRESS); new_func = (code_fun*)func; new_func(); stack_ptr = old_stack; return;}//// Memory layout//externC cyg_uint8 *hal_arm_mem_real_region_top( cyg_uint8 *regionend ){ CYG_ASSERT( hal_dram_size > 0, "Didn't detect DRAM size!" ); CYG_ASSERT( hal_dram_size <= 256<<20, "More than 256MB reported - that can't be right" ); CYG_ASSERT( 0 == (hal_dram_size & 0xfffff), "hal_dram_size not whole Mb" ); // is it the "normal" end of the DRAM region? If so, it should be // replaced by the real size if ( regionend == ((cyg_uint8 *)CYGMEM_REGION_ram + CYGMEM_REGION_ram_SIZE) ) { regionend = (cyg_uint8 *)CYGMEM_REGION_ram + hal_dram_size; } // Also, we must check for the top of the heap having moved. This is // because the heap does not abut the top of memory.#ifdef CYGMEM_SECTION_heap1 else if ( regionend == ((cyg_uint8 *)CYGMEM_SECTION_heap1 + CYGMEM_SECTION_heap1_SIZE) ) { // hal_dram_size excludes the PCI window on this platform. if ( regionend > (cyg_uint8 *)CYGMEM_REGION_ram + hal_dram_size ) // Only report if the heap shrank; if it abuts RAMtop, the // previous test will have caught it already. If RAM enlarged, // but the heap did not abut RAMtop then there is likely // something in the way, so don't trample it. regionend = (cyg_uint8 *)CYGMEM_REGION_ram + hal_dram_size; }#endif return regionend;}// ------------------------------------------------------------------------// EOF nano_misc.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -