Showing posts with label Fat32. Show all posts
Showing posts with label Fat32. Show all posts

Sunday, September 11, 2011

MikroMMB for Xmega MP3 Player

This project is created in AVR GCC with 100% my own drivers and libraries , this player can play MP3, WMA and OGG files from micro SD/SDHC memory card fat16/32 formatted.

V1.3

On this firmware I made some bug fixes and I adding some functions to player:

Bug fixes:

  1. The previous versions has a bug that forces user to put on first location of root directory the volume ID or a file or folder with the short name only.
Function's added:
  1. A progress bar to track the melody, with the same progress bar the user can force the audio player to play file from a specified point.
  2. Player can run now like a thread "Open player" "Close Player" when card is inserted is automatically opened the player, when SD card is removed all resources used by Audio Player will be freed.
  3. Now you can play music from SD/SDHC card's formatted in FAT16 or FAT32(The FAT16 has a little bug, on root directory is displayed only files and directory's from first Page(512Bytes).
On this version you can play: MP3, AAC, OGG, WAV and WMA.



V1.2

 On this version I made some changes:

  1. I change the navigation from the "next" "previous" button to a list box.
  2. On this version is not capable to display bitmap's because I want to design another interface to view bitmap photo.
  3. The VS chip data is send by a service that work inside the RTC interrupt service, in this case has a high priority to send data to VS chip.




Download V1.2 demo version of this player.

V1.1

On this version I made huge improvements.

  1. Now you can navigate through the directories when you listen music, you can choose another melody when you listen another melody.
  2. The player has change the listen melody with the next from the current directory, the payback is stopped after the last melody is played.
  3. Now you can see bitmaps images in 8, 24 and 32 bit/pixel with some limitations, maximum size 240x200pixels, the maximum file size 140KB (140000bytes), the 240x200 pixels limitation is implemented to no interference with the player interface, the 140KB limitation is made because I have a bug in the bitmap library, that can't read files bigger than this value.
This version is limited to play only MP3 files, the core clock is 32Mhz.







V1.0

The controller is running at 16Mhz.

On this version can't manage the power consumption.

This version can play MP3, WMA and OGG.






Wednesday, April 29, 2009

DiY: MP3 player with ATmega64 VS1011a and Samsung E700 color Display

This is my new mp3 player.

For this MP3 player is new: the display and a new graphical interface explorer.

Knowing that the display of the Nokia 6100 is an old and extremely poor quality, I thought to exchange it with one TFT display ( higher quality ) , by doing this I thought I make an new interface, and this is the result:

-File type played (VS1011): Decodes MPEG 1.0 & 2.0 audio layer III
(CBR, VBR, ABR); layers I & II optional;
WAV (PCM + IMA ADPCM)

-File type played (VS1033): Decodes MPEG 1 & 2 audio layer III (CBR
+VBR +ABR); layers I & II optional;
MPEG4 / 2 AAC-LC-2.0.0.0 (+PNS);
WMA4.0/4.1/7/8/9 all profiles (5-384 kbps);
WAV (PCM + IMA ADPCM);
General MIDI / SP-MIDI format 0 files
-File type played (VS1053): Decodes Ogg Vorbis;
MPEG 1 & 2 audio layer III (CBR +VBR
+ABR); layers I & II optional;
MPEG4 / 2 AAC-LC(+PNS),
HE-AAC v2 (Level 3) (SBR + PS);
WMA4.0/4.1/7/8/9 all profiles (5-384 kbps);
WAV (PCM + IMA ADPCM);
General MIDI 1 / SP-MIDI format 0 files

For bitrate higher than 320Kb/s is necessary to increase the CPU frequency from fuses for 4Mhz to fuses for 8Mhz internal RC

This project is under develop.
Last update 14-06-2009
Download source code
Download the board .max and gerber files
Download orcad schematick
Download PDF schematick




Mp3 Player with Winamp skin

Mp3 Player with Synthetic skin

Mp3 Player with Media Player skin Download demo hex fileThe fuse bit be set for 4Mhz Internal RC Oscillator

Mp3 Player with Half Life skin

This player run 2 threads , one for navigating and one for serving data to VS1011.

The last rectify of compatibility of Fat32 filesystem library and Player data service library has increase the transfer rate , in this moment the player is capable to read 256Kbit/s melody at 4Mhz internal RC clock with osccal=199(default), and 320Kbit/s at 4Mhz and osccal=255 (approximately 5Mhz) internal RC clock.

Now i work to one explorer configured from skin file like XML file.

This navigator display the short filename if the long file name is not writed on the name of file.

For support post a comment






This project was abandoned for another more powerful.

Saturday, February 28, 2009

Fat32 complete library in asm language

Observing that the file system created by me is almost identical to FAT32, i decided to convert to FAT32, this library work with clusters from 256 bytes to 32768 bytes autodetect from storage device.

This library is in asm language.

This file system is designed for double buffered (a buffer to the Allocation Table and a data buffer) this method of using separate buffers increase the rate of transfer to the storage device.

The buffer’s separation between allocation table and the data, makes that at each change of the data cluster not to charge the next cluster index from storage device. In this case, the index is token from allocation table’s buffer, if this is inside the sector memorized inside buffer. If this is not inside the sector of the buffer, then will be saved the buffer in allocation table (in case that inside the buffer has been made a modification), and then will be loaded in the sector where the index is.

In this way can be made with the data buffer. The pointer can be putted at an particular offset from open file, and then, from the address of the pointer can be read byte with byte, the pointer been incremented automatically. The same will be the sectors inside the buffer, those will be changed automatically. It doesn’t matter for user which cluster or bit must be read, because everything is done automatically. User must set the address of the file needed and the pointer of the address of the byte inside the file.

Done functions:
-Go to file/folder ( address in clusters )
-Go to next file/folder in current directory ( this function return Flag T in Sreg = 0 if the pointer is on bottom of the list else return 1)
-Go to forward file folder in current directory ( this function return Flag T in Sreg = 0 if the pointer is on top of the list else return 1)
-Read address on pointed file/folder ( in clusters )
-Read short name of pointed file/folder ( string 11 char )
-Read full name of pointed file/folder ( string max 128 char )
-Read byte by byte the file opened ( offset of byte in file ) with autoincrement pointer
-Write byte by byte in the file opened ( offset of byte in file ) with autoincrement pointer ( this function work with append in file and have property to enlarge the size of file )
-Read pointed file size (in bytes)
-Write pointed file size = current pointer
-Read pointed file attribute
-Write pointed file attribute
-Read pointer in opened file
-Write pointer in opened file
-Create file with short name converted from long name( Creating with long name not completed )
-CloseFile ( when the file is closed if the pointer in file is bigger to actual size of file , the actual size of file = pointer position in file ( in read mode is not possible to point to an byte address bigger to file size but in write mode this is possible because the file is auto enlarged )

The terminal have next functions:
+ :
Go Down one file folder and read short and long file name.
- :
Go Up one file folder and read short and long file name.
Enter :
1) Go to selected folder,
2) Open selected file,
3) Close opened file.
Esc :
Close opened file
p :
Enter in write long file name, and Enter will convert from long filename to short filename
c :
Create file with converted short filename


Performance obtained with ATmega640 at 16 Mhz and SPI hardware at 8Mhz:

Write SD Card with 512 Bytes/cluster = 48659 Bytes/s
Write SD Card with 4096 Bytes/cluster = 40163 Bytes/s
Read SD Card with 512 Bytes/cluster = 70286 Bytes/s
Read SD Card with 4096 Bytes/cluster = 56229 Bytes/s

Transfer rate depends on the device storage and on fragmentation.
The flash used not include the terminal

Resources for maxim 512 bytes/cluster:
Flash= 3220 Bytes ( Only read section )
Flash= 5042 Bytes ( Read and write sections )
Ram for allocation table management= 542
Ram for data management= 629 (512Bytes (Data Buffer)+ 64 (Bytes String Long Name) + 11Bytes (String Short Name) + Variables )
Total Ram= 1171Bytes

Resources for maxim 4096 bytes/cluster:
Flash= 3220 Bytes ( Only read section )
Flash= 5042 Bytes ( Read and write sections )
Ram for allocation table management= 542
Ram for data management= 4213 (4096Bytes (Data Buffer)+ 64 Bytes (String Long Name) + 11Bytes (String Short Name) + Variables )
Total Ram= 4755 Bytes

The ram size is set by user because the maximum size of cluster is set by ram buffer data cluster

The data management library is a dynamic library ( That means this library can be open multiple times, and when you call the library in Z must be the beginning address of RAM to work with ) for this i wrote the ram size table occupied by allocation library and data management library separately

In conclusion we can work with multiple open files using a single library written in flash that can work with multiple sections of ram

Operating principle:
This block function is one example only for 512 Bytes/Cluster Fat32 formats for other cluster dimension the ram allocation is different.


Fig1


In this moment i work to create and allocation table library from static library to dynamic library

These two libraries ( allocation table and data section ) will be in 2 variants:
1) A library will have only buffer for data which can be put on the controllers with ram more than 655Bytes
2) A library that does not include buffers (will lose the stats of dynamic library) but which can be put on the controllers that have the minimum 128Bytes of ram
____________________________________________________________________

This library is concept to work with only one buffer and work fine to my MP3 players at 5Mhz with 320Kb/s melody with one artifice, and from this moment this library is open source
This library use 3016Bytes of flash and 655Bytes of ram memory
The up bloc description in Fig1 can by applied and for this library

1)Fat32_DataInit
2)Fat32_ReadByte
3)Fat32_GoToRoot
4)Fat32_GoToFile
5)Fat32_ResetDirPointer
6)Fat32_IncrementDirPointer
7)Fat32_DecrementDirPointer
8)Fat32_GetShortFileName
9)Fat32_GetLongFileName
10)Fat32_GetFileAdress
11)Fat32_ReadFileSize
12)Fat32_ReadFileAttr
13)Fat32_WritePointerInFile
14)Fat32_ReadPointerInFile
15)Fat32_OpenPointedFileFolder
16)Fat32_CloseFile

Last update 17-06-2009
Download fat32 read only library for atmega64
Download fat32 read only library for atmega8

Now this driver is updated and included in my ASM_SDK here

For support post a comment