File indexing completed on 2025-05-11 08:23:59
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #include <rtems.h>
0017 #include <rtems/error.h>
0018
0019 #include <mpc8xx.h>
0020 #include <mpc8xx/cpm.h>
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 static struct {
0031 uint8_t *base;
0032 size_t size;
0033 unsigned int used;
0034 } dpram_regions[] = {
0035 { (uint8_t *) &m8xx.dpram0[0], sizeof m8xx.dpram0, 0 },
0036 { (uint8_t *) &m8xx.dpram1[0], sizeof m8xx.dpram1, 0 },
0037 { (uint8_t *) &m8xx.dpram2[0], sizeof m8xx.dpram2, 0 },
0038 { (uint8_t *) &m8xx.dpram3[0], sizeof m8xx.dpram3, 0 },
0039 { (uint8_t *) &m8xx.dpram4[0], sizeof m8xx.dpram4, 0 },
0040 };
0041
0042 #define NUM_DPRAM_REGIONS (sizeof(dpram_regions) / sizeof(dpram_regions[0]))
0043
0044 void *
0045 m8xx_dpram_allocate( unsigned int byte_count )
0046 {
0047 unsigned int i;
0048 ISR_Level level;
0049 void *blockp = NULL;
0050
0051 byte_count = (byte_count + 3) & ~0x3;
0052
0053
0054
0055
0056
0057
0058 _ISR_Local_disable (level);
0059
0060 for ( i = 0; i < NUM_DPRAM_REGIONS; i++ ) {
0061
0062
0063
0064
0065
0066
0067 if (dpram_regions[i].used == 0) {
0068 volatile unsigned char *cp = dpram_regions[i].base;
0069 *cp = 0xAA;
0070 if (*cp != 0xAA)
0071 dpram_regions[i].used = dpram_regions[i].size;
0072 else {
0073 *cp = 0x55;
0074 if (*cp != 0x55)
0075 dpram_regions[i].used = dpram_regions[i].size;
0076 }
0077 *cp = 0x0;
0078 }
0079 if (dpram_regions[i].size - dpram_regions[i].used >= byte_count) {
0080 blockp = dpram_regions[i].base + dpram_regions[i].used;
0081 dpram_regions[i].used += byte_count;
0082 break;
0083 }
0084 }
0085
0086 _ISR_Local_enable(level);
0087
0088 if (blockp == NULL)
0089 rtems_panic("Can't allocate %d bytes of dual-port RAM.\n", byte_count);
0090 return blockp;
0091 }