⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nano_misc.c

📁 eCos操作系统源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    // (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 + -