u08 cmd_parse(u08 len, const char *cmd) { u08 status; switch(cmd[0]) { // ----- v) version ----- case 'v': uart_send_string("plip2slip " VERSION); uart_send_crlf(); return SER_PARSE_CMD_OK; // ----- x) exit ----- case 'x': return SER_PARSE_CMD_EXIT; // ----- s) stats ----- case 's': if(len==1) { // show stats stats_dump(); return SER_PARSE_CMD_OK; } else { switch(cmd[1]) { case 'r': // stats reset stats_reset(); return SER_PARSE_CMD_OK; default: return SER_PARSE_CMD_UNKNOWN; } } // ----- b) bench ----- case 'b': bench_dump(); return SER_PARSE_CMD_OK; // ----- p) param ----- case 'p': if(len==1) { // show params param_dump(); return SER_PARSE_CMD_OK; } else { switch(cmd[1]) { case 's': // param save status = param_save(); return (status == PARAM_OK) ? SER_PARSE_CMD_OK : SER_PARSE_CMD_FAIL; case 'l': // param load status = param_load(); return (status == PARAM_OK) ? SER_PARSE_CMD_OK : SER_PARSE_CMD_FAIL; case 'r': // param reset param_reset(); return SER_PARSE_CMD_OK; default: return SER_PARSE_CMD_UNKNOWN; } } return SER_PARSE_CMD_UNKNOWN; // ----- m) mode ----- case 'm': if(len==2) { u08 value; status = parse_nybble(cmd[1],&value); if(!status || (value >= PARAM_MODE_TOTAL_NUMBER)) { return SER_PARSE_CMD_FAIL; } param.mode = value; return SER_PARSE_CMD_OK; } return SER_PARSE_CMD_UNKNOWN; // ----- f) fake_tx ----- case 'f': if(len==2) { u08 value; status = parse_nybble(cmd[1],&value); if(!status) { return SER_PARSE_CMD_FAIL; } param.fake_tx = value ? 1 : 0; return SER_PARSE_CMD_OK; } return SER_PARSE_CMD_UNKNOWN; // ----- l) log ----- case 'l': if(len==1) { // show log log_dump(); return SER_PARSE_CMD_OK; } else { switch(cmd[1]) { case 'r': // reset log log_init(); return SER_PARSE_CMD_OK; default: return SER_PARSE_CMD_UNKNOWN; } } return SER_PARSE_CMD_UNKNOWN; // ----- e) error sim ----- case 'e': if(len==2) { u08 value; status = parse_nybble(cmd[1],&value); if(!status) { return SER_PARSE_CMD_FAIL; } for(u08 i=0;i<value;i++) { error_add(); } return SER_PARSE_CMD_OK; } else { error_add(); } return SER_PARSE_CMD_OK; // unknown command default: return SER_PARSE_CMD_UNKNOWN; } }
static int set_params(struct pcm *pcm) { struct snd_pcm_hw_params *params; struct snd_pcm_sw_params *sparams; unsigned long periodSize, bufferSize, reqBuffSize; unsigned int periodTime, bufferTime; unsigned int requestedRate = pcm->rate; int channels = (pcm->flags & PCM_MONO) ? 1 : ((pcm->flags & PCM_5POINT1)? 6 : 2 ); params = (struct snd_pcm_hw_params*) calloc(1, sizeof(struct snd_pcm_hw_params)); if (!params) { fprintf(stderr, "Aplay:Failed to allocate ALSA hardware parameters!"); return -ENOMEM; } param_init(params); param_set_mask(params, SNDRV_PCM_HW_PARAM_ACCESS, (pcm->flags & PCM_MMAP)? SNDRV_PCM_ACCESS_MMAP_INTERLEAVED : SNDRV_PCM_ACCESS_RW_INTERLEAVED); param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, pcm->format); param_set_mask(params, SNDRV_PCM_HW_PARAM_SUBFORMAT, SNDRV_PCM_SUBFORMAT_STD); if (period) param_set_min(params, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, period); else param_set_min(params, SNDRV_PCM_HW_PARAM_PERIOD_TIME, 10); param_set_int(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS, 16); param_set_int(params, SNDRV_PCM_HW_PARAM_FRAME_BITS, pcm->channels * 16); param_set_int(params, SNDRV_PCM_HW_PARAM_CHANNELS, pcm->channels); param_set_int(params, SNDRV_PCM_HW_PARAM_RATE, pcm->rate); param_set_hw_refine(pcm, params); if (param_set_hw_params(pcm, params)) { fprintf(stderr, "Aplay:cannot set hw params\n"); return -errno; } if (debug) param_dump(params); pcm->buffer_size = pcm_buffer_size(params); pcm->period_size = pcm_period_size(params); pcm->period_cnt = pcm->buffer_size/pcm->period_size; if (debug) { fprintf (stderr,"period_cnt = %d\n", pcm->period_cnt); fprintf (stderr,"period_size = %d\n", pcm->period_size); fprintf (stderr,"buffer_size = %d\n", pcm->buffer_size); } sparams = (struct snd_pcm_sw_params*) calloc(1, sizeof(struct snd_pcm_sw_params)); if (!sparams) { fprintf(stderr, "Aplay:Failed to allocate ALSA software parameters!\n"); return -ENOMEM; } // Get the current software parameters sparams->tstamp_mode = SNDRV_PCM_TSTAMP_NONE; sparams->period_step = 1; sparams->avail_min = pcm->period_size/(channels * 2) ; sparams->start_threshold = pcm->period_size/(channels * 2) ; sparams->stop_threshold = pcm->buffer_size ; sparams->xfer_align = pcm->period_size/(channels * 2) ; /* needed for old kernels */ sparams->silence_size = 0; sparams->silence_threshold = 0; if (param_set_sw_params(pcm, sparams)) { fprintf(stderr, "Aplay:cannot set sw params"); return -errno; } if (debug) { fprintf (stderr,"sparams->avail_min= %lu\n", sparams->avail_min); fprintf (stderr," sparams->start_threshold= %lu\n", sparams->start_threshold); fprintf (stderr," sparams->stop_threshold= %lu\n", sparams->stop_threshold); fprintf (stderr," sparams->xfer_align= %lu\n", sparams->xfer_align); fprintf (stderr," sparams->boundary= %lu\n", sparams->boundary); } return 0; }