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