📄 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
//
void
plf_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_H
typedef 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 + -