9static int snd_base = 0xea001600, wptr, buffer_len;
39 static unsigned char smc_snd[32] = {0x8d, 1, 1};
42 unsigned int descr_base = ((
unsigned int)descr) & 0x1fffffff;
44 buffer_len =
sizeof(buffer);
45 memset(buffer, 0, buffer_len);
48 unsigned int buffer_base = ((
unsigned int)buffer) & 0x1fffffff;
51 for (i = 0; i < 0x20; ++i)
53 descr[i * 2] = __builtin_bswap32(buffer_base + (buffer_len/0x20) * i);
54 descr[i * 2 + 1] = __builtin_bswap32(0x80000000 | (buffer_len/0x20));
59 write32(snd_base + 8, 0);
60 write32(snd_base + 8, 0x2000000);
61 write32(snd_base + 0, descr_base);
62 write32(snd_base + 8, 0x1d08001c);
63 write32(snd_base + 0xC, 0x1c);
73 int av = buffer_len - wptr;
77 memcpy(buffer + wptr,
data + i, av);
83 if (wptr == buffer_len)
86 int cur_descr = (wptr / (buffer_len/0x20) -1) & 0x1f;
88 write32(snd_base + 4, cur_descr << 8);
89 write32(snd_base + 8, read32(snd_base) | 0x1000000);
96 int rptr_descr = reg & 0x1f;
97 int last_valid_descr = (reg & 0x1f00) >> 8;
98 int cur_len = (reg >> 16) & 0xFFFF;
100 if (rptr_descr == last_valid_descr && !cur_len)
103 int rptr = rptr_descr * (buffer_len/0x20);
104 int av = rptr - wptr;
112 uint32_t reg = read32(snd_base + 4);
114 int rptr_descr = reg & 0x1f;
115 int last_valid_descr = (reg & 0x1f00) >> 8;
116 int cur_len = (reg >> 16) & 0xFFFF;
118 int l = last_valid_descr - rptr_descr;
121 l *= (buffer_len/0x20);
void memdcbf(void *addr, int len)
void memdcbst(void *addr, int len)
unsigned int __mf_uintptr_t __attribute__((__mode__(__pointer__)))
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)