release
dev builds
extras
themes manual
wiki
device status forums
mailing lists
IRC bugs
patches
dev guide



Search | Go
Wiki > Main > FiioM3K

FiiO M3K

Native port status

Feature Working Notes
Audio playback Yes >= 176.4 KHz playback and too much DSP can make the UI unresponsive
Recording No Planned feature, until then the OF's recording function can be used
Display Yes Known bug: very rarely, system might lock up after screen turns on
Buttons/touchpad Yes  
MicroSD Yes  
Battery charging Yes  
Dual boot Yes  
USB Partial File transfers are slower than the OF
USB DAC No Feature not available in Rockbox; use the OF for this
Rockbox utility support No Manual installation is required

The native port is the current supported way to run Rockbox on the FiiO M3K. At present, it should be stable for audio playback and general everyday use, although as with any software there may be bugs. This port should not be confused with the unofficial XVortex port or the "M3K Linux" port, which both run as an application under the original firmware's Linux kernel. The native port of Rockbox drives the hardware directly, and doesn't rely on the original firmware or the Linux kernel.

Rockbox can be installed alongside the original FiiO firmware in a dual-boot installation. The Rockbox bootloader lets you select which firmware you want to boot, defaulting to Rockbox.

The Rockbox Utility does not yet support the M3K, so installing the bootloader is a manual process. Up-to-date installation instructions for the bootloader can be found in this forum post. After installing the bootloader, you can install and update Rockbox by unzipping a daily build to your SD card.

Hardware summary

Component Model Notes
SoC X1000E 1.0GHz MIPS XBurst with 64MB of SIP LPDDR RAM
NAND ATO25D1GA-10ED 1Gb SPI SLC NAND Flash
PMU AXP192 I2C PMU, driver is AXP173?
Backlight driver SGM3122 simple PWM LED driver
Touch controller FT6236U I2C
LCD controller likely ST7789S educated guess from Fiio's M3K kernel source
DAC AK4376A I2S
Microphone MSM42A3722H9KR plain MEMS analog mic
USB OVP IC WP3881  
Battery 413372 2-wire with built-in basic protection circuit, 1100mAh

See also: IngenicX1000

Hardware notes

  • Touchpad backlight
    • Driven by an S8050 (J3Y) and presumably a GPIO.
    • TODO: Which GPIO??
  • About the LCD
  • Audio Codec Notes
    • in-kernel driver is a real mess, but at least we have source code!
    • Powerup pin controlled by GPIO A16, requires a magic ioctl(!) to /dev/ak4376 to toggle
    • Most mixer controls are no-ops, meant for different HW. Only DACL/DACR Playback volume and "Low Mode Switch" are connected to HW. DAC filter also not hooked up.
  • CPU notes
    • CPU supports mips32r2 integer instructions, but other r2 features aren't available -- no shadow register sets, no external interrupt controller mode

Known issues / TODO list

  • Partial LCD updates are actually worse than full-frame updates because DMA can only (easily) transfer full frames, and we need to wait for the last frame to complete before sending a new one. This causes some themes to flicker as different layers are drawn in quick succession with partial updates.

  • Coealescing partial LCD updates in the driver could eliminate most flicker. Using the spare TCU timer IRQ would have less overhead & higher precision than the kernel-based timers. Coealescing would have to be bypassed during a panic, otherwise the LCD would never be updated.

  • Very rarely, the LCD driver might be causing a hang when the screen turns on after being off. This is almost certainly due to bugs in the complicated locking/synchronization design.

  • LCD's continuous DMA mode don't seem to respect the panel FPS even when the vsync signal is turned on. This appears to cause stuttering, which is why the driver uses one-shot DMA transfers.

  • The DAC makes popping noises when changing frequency. It seems to be both digital and analog in nature, but getting rid of the digital signal by shutting off the AIC_CR.ERPL bit doesn't seem to help. Maybe it needs to be ramped down smoothly in software?

  • Playback at 192 KHz with all DSP / EQ settings enabled puts the CPU to almost 100% usage, with frequent UI slowdown and audio underruns. Increasing the size of the PCM mix buffers may help, since there are huge numbers of DMA interrupts at this sample rate.

  • AIC fifo underruns aren't reported reliably. It's probably because the DMA interrupt is hogging the CPU so the underrun bit clears before we can see it.

  • The touchpad sometimes goes wonky on boot and won't respond properly to scrolling or button presses for the first few seconds. There's nothing that can really be done about this except artificially forcing Rockbox to wait longer in the splash screen so you can't see the problem.

  • Scrolling might feel a bit off because the touchpad doesn't report coordinates linearly as it should. In particular the edges of the touchpad seem more sensitive than the middle, so scrolling in the middle of the pad requires a bigger motion than at the edges.

  • USB is buggy when using DMA -- hangs and lockups happen but apparently only in the early stages of connection when endpoints are being enumerated, status getting queried, etc. PIO mode is stable, but transfers are at least 30% slower.

Internal images

PCB images:

PCB_front_s.png PCB_back_s.png

Closeup of the PWM LED controller and the I2S DAC:

SGM3122_s.png AK4376A_s.png

Screen assembly closeup:

TODO: transcribe silkscreen text

screen_assembly_overview_s.png

TODO: transcribe silkscreen text and pinout

touch_controller_closeup_s.png

Datasheets

All datasheet links were archived versions whenever possible.

Disassembly instructions

Disclaimer: everything you do is at your own risk and I cannot be held responsible if you damage your device or overheat the battery and it catches on fire.

Please don't attempt it unless you can afford to damage the device, this is for your reference only. There are no real benefits of disassembling the device (internal photos are already available from me and all the important chips have been identified) unless you want to access the native UART port (which doesn't have an interactive boot console that you can interrupt btw, the loader is not u-boot), and you'll need some E6000 adhesive to glue the screen back if you want to put it together again.

Tools required:
  • Hair dryer
  • LCD screen repair plier tool with removable suction cups
  • E6000 adhesive
  • Precision Philips screwdrivers
  • Plastic pry tool (the triangular type)
  • A thin plastic card
  • Xacto knife
  • Kapton tape

Procedure:
  1. Unscrew a suction cup from your plier tool, firmly adhere it to the upper back side of the device with the E6000 glue, let it sit for at least 14h. Be generous with the glue, you'll be able to cleanly remove them later before they harden completely. This is necessary because the aluminum back doesn't play nice with the suction cup, it slips off before you can exert enough force onto the front glass.
  2. Heat up the front of the device until the aluminum frame is very hot to the touch. Immediately screw the glued suction cup back onto the plier tool, and you should be able to get enough grip to pull the screen off now. You must pull it apart from the LCD side (not the touch controls side) to avoid damaging the ribbon cables.
  3. Detach the two ribbon cable connectors and remove the screen assembly. Beware that the touch controller ribbon cable has a sticky back, carefully peel it off the board with a tweezer. Hit it with a hair dryer if it's hard to remove, that'll hopefully soften the adhesive.
  4. Take your triangular pry tool, use it to push up & warp the upper panel from the inside of the device, there's an aluminum overlay that you'll hopefully be able to separate with your xacto knife (the key here is to cut away the adhesive instead of prying). There will be two screws hidden under that overlay, remove them and you'll be able to side the entire inner tray out from the bottom side.
  5. Peel off the black insulation tape on the board to reveal some test points, including UART. Put on some Kapton tape before you attach the screen to prevent the metal bracket from shorting anything out.
  6. Remove the 6 screws from the plastic tray (one screw is smaller than the rest), and you can take the board out.
  7. Heat up the board again from the front side and use a thin plastic card to slowly separate the battery from the board. The PCB bends pretty easily so be careful NOT to bend it in the process, I find gripping on the PCB on the long sides can reduce bending. After you detach and desolder the battery, the disassembly is now complete.

I Attachment Action Size Date Who Comment
AK4376A_s.pngpng AK4376A_s.png manage 2611.1 K 07 Jul 2020 - 01:33 EdwardBiryukov  
PCB_back_s.pngpng PCB_back_s.png manage 4760.8 K 07 Jul 2020 - 01:32 EdwardBiryukov PCB back
PCB_front_s.pngpng PCB_front_s.png manage 4261.3 K 07 Jul 2020 - 01:32 EdwardBiryukov PCB front
SGM3122_s.pngpng SGM3122_s.png manage 2744.7 K 07 Jul 2020 - 01:33 EdwardBiryukov  
m3k_alsa.txttxt m3k_alsa.txt manage 3.0 K 15 Oct 2020 - 11:55 SolomonPeachy Exported ALSA Mixer controls
nand.binbin nand.bin manage 128.0 K 28 Mar 2021 - 01:19 AidanMacDonald first 128k of NAND flash
screen_assembly_overview_s.pngpng screen_assembly_overview_s.png manage 3248.6 K 07 Jul 2020 - 01:34 EdwardBiryukov  
touch_controller_closeup_s.pngpng touch_controller_closeup_s.png manage 4079.7 K 07 Jul 2020 - 01:34 EdwardBiryukov  
zadig.pngpng zadig.png manage 22.3 K 15 May 2021 - 16:06 AidanMacDonald  
r17 - 16 Jul 2021 - 00:03:56 - AidanMacDonald

Copyright © by the contributing authors.