10static int snd_base = 0xea001600, wptr, buffer_len;
40 static unsigned char smc_snd[32] = {0x8d, 1, 1};
43 unsigned int descr_base = ((
unsigned int)descr) & 0x1fffffff;
45 buffer_len =
sizeof(buffer);
46 memset(buffer, 0, buffer_len);
49 unsigned int buffer_base = ((
unsigned int)buffer) & 0x1fffffff;
52 for (i = 0; i < 0x20; ++i)
54 descr[i * 2] = __builtin_bswap32(buffer_base + (buffer_len/0x20) * i);
55 descr[i * 2 + 1] = __builtin_bswap32(0x80000000 | (buffer_len/0x20));
60 write32(snd_base + 8, 0);
61 write32(snd_base + 8, 0x2000000);
62 write32(snd_base + 0, descr_base);
63 write32(snd_base + 8, 0x1d08001c);
64 write32(snd_base + 0xC, 0x1c);
74 int av = buffer_len - wptr;
78 memcpy(buffer + wptr,
data + i, av);
84 if (wptr == buffer_len)
87 int cur_descr = (wptr / (buffer_len/0x20) -1) & 0x1f;
89 write32(snd_base + 4, cur_descr << 8);
90 write32(snd_base + 8, read32(snd_base) | 0x1000000);
97 int rptr_descr = reg & 0x1f;
98 int last_valid_descr = (reg & 0x1f00) >> 8;
99 int cur_len = (reg >> 16) & 0xFFFF;
101 if (rptr_descr == last_valid_descr && !cur_len)
104 int rptr = rptr_descr * (buffer_len/0x20);
105 int av = rptr - wptr;
113 uint32_t reg = read32(snd_base + 4);
115 int rptr_descr = reg & 0x1f;
116 int last_valid_descr = (reg & 0x1f00) >> 8;
117 int cur_len = (reg >> 16) & 0xFFFF;
119 int l = last_valid_descr - rptr_descr;
122 l *= (buffer_len/0x20);
139 const uint32_t total_frames = (sample_rate * duration) / 1000;
140 uint32_t frames_remaining = total_frames;
142 while (frames_remaining)
145 uint32_t chunk_frames =
sizeof(pcm_data) / bytes_per_frame;
147 if (chunk_frames > frames_remaining)
148 chunk_frames = frames_remaining;
150 for (i = 0; i < chunk_frames; ++i)
153 int16_t v = (phase & 0x80000000U) ? -amplitude : amplitude;
158 pcm_data[o + 0] = le & 0xFF;
159 pcm_data[o + 1] = (le >> 8) & 0xFF;
160 pcm_data[o + 2] = le & 0xFF;
161 pcm_data[o + 3] = (le >> 8) & 0xFF;
169 frames_remaining -= chunk_frames;
void memdcbf(void *addr, int len)
void memdcbst(void *addr, int len)
unsigned int __mf_uintptr_t __attribute__((__mode__(__pointer__)))
void xenon_tone(uint32_t frequency, uint32_t duration, int16_t amplitude)
int xenon_sound_get_free(void)
void xenon_sound_init(void)
void xenon_sound_submit(void *data, int len)
int xenon_sound_get_unplayed(void)
void xenon_gpio_control(uint32_t reg, uint32_t clear, uint32_t set)
void xenon_smc_send_message(const unsigned char *msg)
int xenon_smc_i2c_write(uint16_t addr, uint8_t val)