25 #if defined(GSC_TARGET_SYSTEM_STM32F746GDISCOVERY) // $gsc ターゲットシステムは32F746GDISCOVERY 26 #include "stm32746g_discovery_audio.h" 27 #elif defined(GSC_TARGET_SYSTEM_STM32F769IDISCOVERY) // $gsc ターゲットシステムは32F769IDISCOVERY 28 #include "stm32f769i_discovery_audio.h" 33 #define MAX_AUDIOBUF (1152*2*2*2) 34 static unsigned char audio_buf[MAX_AUDIOBUF];
35 static int flg_buf_half = 0;
37 static int flg_play = 0;
38 static int flg_audio_start = 0;
40 static int volume = 30;
41 static int bufsize = MAX_AUDIOBUF;
42 static int flg_bs_chg = 0;
43 static int sampling_rate = I2S_AUDIOFREQ_48K;
47 extern SAI_HandleTypeDef haudio_out_sai;
49 void BSP_AUDIO_OUT_TransferComplete_CallBack(
void)
56 void BSP_AUDIO_OUT_HalfTransfer_CallBack(
void)
63 void BSP_AUDIO_OUT_Error_CallBack(
void)
65 SYSERR_PRINT(
"AUDIO OUT Error\n");
68 static void inthdr_audio(
unsigned int intnum,
void *sp)
70 HAL_DMA_IRQHandler(haudio_out_sai.hdmatx);
75 static int audio_register(
struct st_device *dev,
char *param)
79 register_interrupt(IRQ2VECT(AUDIO_OUT_SAIx_DMAx_IRQ), inthdr_audio);
83 tprintf(
"Touch sensor found\n");
89 static void lock_ts(
void)
96 static void unlock_ts(
void)
103 static int audio_init(
int vol,
int smprate)
106 if(BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_HEADPHONE, vol, smprate) != AUDIO_OK) {
108 SYSERR_PRINT(
"AUDIO Init Error.\n");
111 BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
112 HAL_NVIC_SetPriority(AUDIO_OUT_SAIx_DMAx_IRQ, 0, 0);
119 static int audio_open(
struct st_device *dev)
121 audio_init(volume, sampling_rate);
126 static int audio_close(
struct st_device *dev)
129 BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW);
130 BSP_AUDIO_OUT_DeInit();
136 static int audio_write(
struct st_device *dev,
const void *data,
unsigned int size)
139 const unsigned char *sp = data;
140 unsigned char *dp = &audio_buf[0];;
149 if(len > (bufsize/2)) {
154 if(flg_buf_half != 1) {
156 dp = &audio_buf[bufsize/2];
162 for(i=0; i<len; i++) {
163 if(dp >= &audio_buf[MAX_AUDIOBUF]) {
164 SYSERR_PRINT(
"Write buffer over %d %ld\n", bufsize, size);
173 if(len < (bufsize/2)) {
174 while(dp < &audio_buf[bufsize]) {
185 static int audio_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
191 DKFPRINTF(0x01,
"IOCMD_AUDIO_SET_VOLUME %ld\n", arg);
195 if(BSP_AUDIO_OUT_SetVolume(volume) == AUDIO_OK) {
206 long *p_volume = (
long *)param;
213 long *p_bufsize = (
long *)param;
214 *p_bufsize = bufsize;
219 if(arg <= MAX_AUDIOBUF) {
232 if(flg_audio_start == 0) {
235 BSP_AUDIO_OUT_Play((uint16_t*)audio_buf, bufsize);
240 if(flg_bs_chg == 0) {
241 BSP_AUDIO_OUT_Resume();
243 BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW);
244 BSP_AUDIO_OUT_Play((uint16_t*)audio_buf, bufsize);
245 BSP_AUDIO_OUT_Resume();
248 BSP_AUDIO_OUT_SetVolume(volume);
259 BSP_AUDIO_OUT_Pause();
263 for(i=0; i<MAX_AUDIOBUF; i++) {
277 if(sampling_rate != arg) {
280 BSP_AUDIO_OUT_SetFrequency(sampling_rate);
288 long *p_sampling_rate = (
long *)param;
289 *p_sampling_rate = sampling_rate;
295 unsigned char **p_audio_buf = (
unsigned char **)param;
296 *p_audio_buf = audio_buf;
302 unsigned char **p_audio_buf = (
unsigned char **)param;
304 if(flg_buf_half != 1) {
306 *p_audio_buf = &audio_buf[bufsize/2];
309 *p_audio_buf = &audio_buf[0];
319 BSP_AUDIO_OUT_SetMute(AUDIO_MUTE_OFF);
321 BSP_AUDIO_OUT_SetMute(AUDIO_MUTE_ON);
328 SYSERR_PRINT(
"Unknow command %08lX arg %08lX\n", com, arg);
335 static int audio_select(
struct st_device *dev,
unsigned int timeout)
338 return (
long)timeout;
346 .explan =
"STM32F769I-Disc Audio Out",
347 .register_dev = audio_register,
348 .mutex = &audio_mutex,
350 .close = audio_close,
351 .write = audio_write,
352 .ioctl = audio_ioctl,
353 .select = audio_select,
#define IOCMD_AUDIO_PLAY_START
オーディオ再生を開始する
#define IOCMD_AUDIO_GET_BUFSIZE
オーディオバッファサイズを取得する
#define IOCMD_AUDIO_GET_BUFFER
オーディオバッファメモリアドレスを取得する
#define DEF_DEV_NAME_AUDIO
標準AUDIOデバイス名
#define DEF_DEV_NAME_TS
標準タッチセンサデバイス名
struct st_device * open_device(char *name)
デバイスをオープンする
void event_wakeup(struct st_event *evtque, void *arg)
イベントキューにイベントを登録する
#define IOCMD_AUDIO_SET_VOLUME
ボリュームを設定する
void eventqueue_register_ISR(struct st_event *evtque, const char *name, void *args, unsigned int arg_size, int arg_count)
イベントキューを登録する
void event_wakeup_ISR(void *sp, struct st_event *evtque, void *arg)
イベントキューにイベントを登録し、イベント待ちタスクを起動する
#define IOCMD_AUDIO_GET_STATUS
オーディオ再生状態を取得する
#define IOCMD_AUDIO_PLAY_STOP
オーディオ再生を停止
int unlock_device(struct st_device *dev)
デバイスをアンロックする
#define IOCMD_AUDIO_WAIT_BUFFER
オーディオバッファが空くのを待つ
#define IOCMD_AUDIO_SET_MUTE
ミュートを設定、解除する
#define IOCMD_AUDIO_SET_BUFSIZE
オーディオバッファサイズを設定する
#define IOCMD_AUDIO_SET_SMPRATE
サンプリングレートを設定する
int tprintf(const char *fmt,...)
簡易printf
#define IOCMD_AUDIO_GET_VOLUME
ボリュームを取得する
#define IOCMD_AUDIO_GET_SMPRATE
サンプリングレートを取得する
char name[MAX_DEVNAMELRN]
デバイス名文字列
unsigned int size
1イベントのサイズ
int lock_device(struct st_device *dev, unsigned int timeout)
デバイスをロックする
int event_wait(struct st_event *evtque, void *argp, unsigned int timeout)
タスクをイベント待ち状態にする