Cubieboard series have support for infra-red (IR) support and analog sound ouput. Together with mplayer & LIRC, Cubieboard could be turned into a great music box.
Select the sunxi IR support in kernel config, it's straightforward.
<*> Device Drivers ---> <*> Input device support ---> <*> Keyboards ---> <*> sunxi IR support
If you compile the sunxi IR support as a module, it would be sunxi-ir.ko
If your kernel has already support IR feature, you can test the IR device interface.
root@Cubieboard1:~# dmesg | grep -i sunxi-ir [ 2.254701] input: sunxi-ir as /devices/virtual/input/input0
If you see the above line, /dev/input/event0 should be the IR device interface.
It is time to test your IR remote and get the keycodes.
root@Cubieboard1 ~# cat /dev/input/event0 | hexdump
Grasp your remote pointing to Cubieboad IR receiver and press a key, watch the output and last three columns, maybe like this
0000000 c0d6 528c c81c 0000 0001 0009 0001 0000 0000010 c0d6 528c c830 0000 0000 0000 0000 0000 0000020 c0d6 528c 9c3f 0004 0001 0009 0000 0000 0000030 c0d6 528c 9c51 0004 0000 0000 0000 0000 0000040 c0d7 528c 3275 0001 0001 0015 0001 0000 0000050 c0d7 528c 3292 0001 0000 0000 0000 0000 0000060 c0d7 528c 272b 0004 0001 0015 0000 0000 0000070 c0d7 528c 273e 0004 0000 0000 0000 0000
Pay attention to digits such as "0009", "0015", yes, they are the remote keycode, and you'd better write them down. Take notice that these keycodes are hexadecimal value.
root@Cubieboard1:~# apt-get install lirc mplayer
LIRC is a package that allows you to decode and send infra-red signals of many (but not all) commonly used remote controls (http://www.lirc.org/). The configuration for Cubieboard is a little bit complicated, which involes 4 files. Let's do it step by step.
Create a udev rule file, like * /etc/udev/rules.d/10-cubie-ir.rules * whose content is as follows
SUBSYSTEM=="input", ACTION=="add", KERNEL=="event*", ATTRS{name}=="sunxi-ir", SYMLINK+="input/cubieir"
Modify the /etc/lirc/hardware.conf now, modify the following lines
#Try to load appropriate kernel modules LOAD_MODULES=true # Run "lircd --driver=help" for a list of supported drivers. DRIVER="devinput" # usually /dev/lirc0 is the correct setting for systems using udev DEVICE="/dev/input/cubieir" MODULES="sunxi-ir"
Edit /etc/lirc/lircd.conf in your case. The codes section should be altered according to your own keycodes definitions, and they are in decimal form.
begin remote name devinput bits 16 eps 30 aeps 100 pre_data_bits 16 pre_data 0x0001 post_data_bits 32 post_data 0x00000001 gap 132799 toggle_bit 0 begin codes POWER 69 MUTE 71 VOLUME+ 9 VOLUME- 21 MODE 70 MOUSE 109 HOME 108 BACK 110 LEFT 100 RIGHT 101 UP 102 DOWN 103 OK 105 STOP 106 PLAY 68 SHUFFLE 25 PREV 64 NEXT 67 RED 185 GREEN 178 YELLOW 173 BLUE 172 EQ 7 1 12 2 24 3 94 4 8 5 28 6 90 7 66 8 82 9 74 0 22 AUDIO 168 USD 13 end codes end remote
The above keycode definitions are for the IR remote like this
Edit /etc/lirc/lircrc.conf in your case.
begin button = VOLUME+ prog = mplayer config = volume 1 repeat = 1 end begin button = VOLUME- prog = mplayer config = volume -1 repeat = 1 end begin button = PLAY prog = mplayer config = pause end begin button = MUTE prog = mplayer config = mute end begin button = POWER prog = mplayer config = stop end begin button = NEXT prog = mplayer config = pt_step +1 end begin button = PREV prog = mplayer config = pt_step -1 end #---------------------------- begin button = 0 prog = irexec config = start_mplayer.sh end begin button = SHUFFLE prog = irexec config = start_mplayer.sh rescan end
Mplayer has well support for LIRC, but we still need do some work to make it functional like a music box. We intend to make mplayer scan some specified directory (on Cubieboard or network-sharing directory), picking out those supported music files, like ape, flac, mp3, ogg etc., and play them in a shuffle way. Here goes the shell code snippet.
#!/bin/bash # start_mplayer.sh # Set this line in your case. A play.list file will be created in this directory, so make it writable. MUSIC_PATH="/data/share/music" PLAY_LIST="play.list" MUSIC_TYPES="mp3 wav ape ogg flac"; if [ ! -e "${MUSIC_PATH}/${PLAY_LIST}" ] || ( [ $# -gt 0 ] && [ $1 == "rescan" ] ); then echo "" > ${MUSIC_PATH}/${PLAY_LIST} for music_type in $MUSIC_TYPES ; do find ${MUSIC_PATH} -type f -iname "*.${music_type}" >> ${MUSIC_PATH}/${PLAY_LIST} done fi mplayer -lircconf /etc/lirc/lircrc.conf -vo null -shuffle -playlist ${MUSIC_PATH}/${PLAY_LIST}
Assign this script with an executable bit, and test it.
# chmod +x start_mplayer.sh # ./start_mplayer.sh rescan
If mplayer is starting playing the music, good to go.
You can test LIRC with mplayer right now, with irexec, a convenient tool for running programs via LIRC.
# irexec -d /etc/lirc/lircrc.conf
Now, press your IR remote key, enjoy the music comes from Cubieboard.
If you would like the program running in a daemon style, add the fowlling line into /etc/rc.local, right before "exit 0".
sudo /usr/bin/irexec -d /etc/lirc/lircrc.conf ## If there is no "sudo", irexec won't work, which is weird.