Page 3 of 3

Re: VS1005 MP3 Player with USB Host

Posted: Mon 2016-10-03 12:32
by Srikanth
Dear Panu and Hannu,

Thank you for your valuable response. Currently I am looking at the youtube video that panu has shared. The searching devices and printing files part in that youtube video link is really worthy. I guess this is same for USB device as well.

after looking at Panu and Hannu comments. I guess VSOS automatically detects the USB drives before starting the application, i.e. sending SOF will be done automatically and internally by VSOS. If any USB device is connected before starting the application, the internal USB library loads the USB device with drive letter 'U' and will be ready for use in vs_pdevices.

once it is connected. we can create File handle for that USB Device to search for files in that drive. VSOS supports FAT or FAT16 or FAT32 filesystem.

I have to handle the situation where USB connection and disconnection occurs while application is running.
Let me know if I am not correct.

Dear Hannu,

I don't have VSOS development board. I am working on one of our project in which MP3 is a part of it. I will be working directly on our customised board.
currently I don't have the hardware to check for that config.txt file.

Thank you,

Re: VS1005 MP3 Player with USB Host

Posted: Mon 2016-10-03 13:49
by Hannu
So you have UART and USB access? From VSOS Shell you can share S: by commanding

Code: Select all

usbmsc s:
Remember safely remove the disk before hitting CTRL-C on terminal which exits from sharing.

Another option is to pull high GPIO0_0 pin during boot which is what S1 button does on dev board.

Without knowing all the details how and what features your design will have, I'll say you are on the right track.
There is a lot of info in VSOS guide ... _guide.pdf Also the

And now that you mentioned filesystems, VSOS supports all FAT12/16/32 but not exFAT which can be found from some 64GB and bigger USB disks and SD cards.

Re: VS1005 MP3 Player with USB Host

Posted: Sun 2018-01-28 8:32
by sreilly
Hello VLSI team,

I'd like to use GPIO0_4 and GPIO0_5 for interrupt routines.
I added tact switches and 5.6kohm resistors pulled up to IOVDD and set GPIO0_4 and GPIO0_5 as inputs.
I tried your code on my development board GPIO0_4 and GPIO0_5 will not trigger the interrupt routine.
Why will your code only read buttons GPIO0_0 through GPIO0_3 on the development board where the function GpioReadPin will read the GPIO0_4 and GPIO0_5 pin?


Henrik wrote:
Thu 2016-09-01 9:44
Hello again!

You have lots of good thought in your code, but there are certain points which will prevent it from working.

As a point of reference, I made a very simple code example that reads buttons from GPIO0_0 through GPIO0_3 using an interrupt, then handle those button presses in a main program.

The reason for doing it this way is to keep the interrupt as short as possible. Long interrupts sooner or later cause trouble with real-time features, like glitches in audio playback or e.g. SPI communications (if an application has such features). This is here avoided by using a very short interrupt to collect the data, but to handle these events in a main program that doesn't have strict real-time requirements.

From the example you will also see other recommended stylistical habits, like using the PERIP() macro, which makes peripheral accesses easier to read.

Code: Select all

#include <vo_stdio.h>
#include <volink.h>     // Linker directives like DLLENTRY
#include <apploader.h>  // RunLibraryFunction etc
#include <timers.h>
#include <consolestate.h>
#include <string.h>
#include <vs1005g.h>
#include <vo_gpio.h>

u_int16 gpioState=0, gpioPend=0;

#pragma interrupt y 0x27
void Gpio0Interrupt(void) {
  /* Let's make the interrupt as short as possible. */
  gpioPend |= PERIP(GPIO0_INT_PEND); /* Get which bits have changed. */
  PERIP(GPIO0_INT_PEND) = 0xFFFF;    /* Clear the flags. */
  gpioState = PERIP(GPIO0_IDATA);    /* Get the actual GPIO data. */

ioresult main(char *parameters) {
  int quit = 0;

  if (!strcmp(parameters, "-h")) {
    printf("Usage: GpioDemo [-h]\n");
    goto finally;

  /* Make GPIO0_0 through GPIO0_3 inputs */

  /* We are interested in the rising edges of GPIO0_0 through GPIO0_3... */
  /* ... as well as the falling edges. */

  /* Activate GPIO0 interrupt at lowest interrupt priority */
  /* Run main loop until Ctrl-C is pushed. */
  while (!(appFlags & APP_FLAG_QUIT)) {
    u_int16 localGpioPend, localGpioState;

    /* Disable interrupts */
    /* Take local copy of the variables */
    localGpioPend = gpioPend;
    localGpioState = gpioState;
    /* Clear main variables. */
    gpioPend = 0;
    /* Re-enable interrupts */

    if (localGpioPend) {
      int i;
      for (i=0; i<4; i++) {
	if ((localGpioPend >> i) & 1) {
	  printf("GPIO0_%d = %d\n", i, (localGpioState>>i) & 1);
    } else {
      /* Wait for one millisecond */

  /* Remove the interrupt */

  return S_OK;
For your convenience, the demonstration Solution is attached below.

Kind regards,
- Henrik

Re: VS1005 MP3 Player with USB Host

Posted: Sun 2018-01-28 13:11
by Panu
Why will your code only read buttons GPIO0_0 through GPIO0_3 on the development board
Here's why:

Code: Select all

  /* We are interested in the rising edges of GPIO0_0 through GPIO0_3... */
(0x000F is 0000000000001111 in binary so only the lowest four bits are read. Use 0x0030 (0000000000110000b) to trigger GPIO0_4 and GPIO0_5)


Re: VS1005 MP3 Player with USB Host

Posted: Sun 2018-09-23 7:28
by 321go
The "MP3MODEL" that you announced is a very nice and lean code which works better than the solution that we coded ourselves. But how can you rewind in a song? I mean not skipping to the previous file, but go back for a few seconds inside a playing song. Is there a solution?
Best regards,

Re: VS1005 MP3 Player with USB Host

Posted: Mon 2018-09-24 9:46
by Panu

Should be. There's a CodecServices::goTo property that sets the current decode time in seconds. In MP3MODEL I can see that the message at least is interpreted.

Code: Select all

		if (auDec) {
			auDec->cs.goTo = value;
So you can set the current position by sending the UIMSG_U32_PLAY_TIME_SECONDS message.
You can get the current play time in seconds by receiving the UIMSG_U32_PLAY_TIME_SECONDS message.


Re: VS1005 MP3 Player with USB Host

Posted: Thu 2018-09-27 20:32
by 321go
Thank you Panu for the fast reply. There is a rewind-function, but it is not so smart as the wind-function. When you wind forward, the audio plays faster, when you rewind, it only jumps from one point to another. Is there a possibility to do this nicer?

Re: VS1005 MP3 Player with USB Host

Posted: Fri 2018-09-28 8:50
by Panu

do you mean, like, play audio backwards? Not realistically - first of all, would you really want that? And second of all, none of the music file formats (except PCM WAV, which could techinically be played in either direction) are designed to support such operations - there's no backwards linked lists of blocks, only forward and thus it would mean at least double the memory consumption and even more CPU consumption to seek backwards for blocks, decode them, play backwards, filter - an unbelieveable amount of work for a result you probably wouldn't like at all...

All you can do is experiment in the amount of how much you jump backwards and how much, I'd say.