This short series of articles shows you how to take a conveniently inexpensive, high-end PowerPC® platform (specifically, an Apple Mac mini) and build it into a home multimedia appliance using Linux™. At the end of the series, you'll have a stand-alone device that can play slide shows of images, audio, and movies, and that is controlled and administered from another machine using a standard Web browser.
The PowerPC platform is very well-suited to this type of multimedia application, and the G4 with AltiVec used in the Mac mini is an exceptionally powerful and flexible choice. This first article introduces you to the hardware's capabilities and walks you through installing and configuring Yellow Dog Linux so you can delve into some application code in the next article.
Before getting into the actual project details, however, I need to say a few words about an important intellectual property issue. You need to be aware that data compression, encryption, and other technologies related to digital multimedia are a minefield of patents, unfriendly copyright laws, and intellectual property squabbles. This series of articles, and its accompanying source code, are educational and research materials, so I can ignore many of the legal issues. If you're following along and experimenting, for your own edification, with the materials I provide, you can largely skip over the legal worries, too. However, if you plan to distribute a product based on this or similar code, you have significant homework to do. The source code accompanying these articles is licensed to you under the GNU GPL; you can sell derivative works or give them away as you please (as long as you comply with the terms of the GPL), and I don't want a dime from you. However, I don't own, and hence can't license to you, any patented algorithms this code happens to implement. You need to do an audit of which patents might need to be licensed, and which authority governs their licensing.
This warning is mostly applicable to movie playback. For example, there are numerous open source MPEG-2 video playback programs. Standard DVD discs use MPEG-2 encoding. However, if you start selling a device that uses one of these open source player programs to play DVDs (even if you ignore the thorny issues surrounding DVD encryption and only support unprotected disks), you'll soon be receiving letters demanding license fees for each unit sold. An interesting data point I read recently is that the US$39.95 DVD players you commonly see at chain stores contain almost US$20 of patent license fees. (This is one reason why China is trying to promote the homegrown EVD standard in preference to DVD for domestic video content; EVD was specifically designed to avoid Western patent portfolios). Hidden legal bear traps like this are waiting almost everywhere for the unwary. For example, Fraunhofer IIS requires a (small) per-unit payment for every device sold containing an MP3 decoder. There is even a patent claim on an aspect of the common JPEG still-image compression algorithm; it's widely regarded as meritless, to date it has not been successfully litigated by the holder, and it does expire fairly soon, but it's still something you might need to think about.
One safe route, by the way: Build your application around a media player
that has already negotiated licenses for the appropriate patents. As far
as I know, the only company actively working on a patent-licensed media player
for Linux at the moment is Linspire (see Resources). They have a licensed
xine for sale; it's intended for use
with their particular flavor of
Linux, but when I've inquired about this in the past they have indicated
a willingness to issue serial numbers for use with any Linux variant,
for a fairly reasonable per-unit fee. The only problem in this
series is that their product is x86-only, though they might be persuaded
to build it for PowerPC if asked nicely.
If you're still reading after all that legal waffle, take a look at the important attributes of the Mac mini. This system makes a good choice for this project for the following reasons:
- Price. At US$499, the entry-level Mac mini is unquestionably the best-value, high-end PowerPC evaluation platform money can buy. It is about one quarter the cost of an equivalent evaluation board from industrial single-board computer (SBC) vendors, AND the price of the Mac mini includes a hard disk, RAM, optical drive, and housing and power supply, all of which would be add-on costs for the industrial SBC.
- Physical size. Even without tearing the electronics out of the housing, the Mac mini is small and light.
- Orientation-neutral design. The optical drive is slot-loading and is equally usable at any angle to the horizontal. This means that you can simply glue it to the back of a monitor and presto! -- instant multimedia appliance!
The following is a brief overview of the Mac mini hardware capabilities:
- PowerPC G4 microprocessor. The motherboard is jumper-configurable from 1.25 to 1.58GHz (the jumpers are soldered), with the standard speeds from Apple being 1.25 or 1.42GHz. Find a link in Resources to a site with all the overclocking details you might want, if that sort of thing appeals to you. Overclocking is totally unnecessary for this application and I don't recommend it. The Mac mini is already frisky enough for everything you need to do.
- Built-in wired Ethernet
- One Firewire port
- Two USB 2.0 ports
- Internal (mono) speaker and stereo audio output. At the time of writing this article, the specific audio chip used in the Mac mini is not supported by the Linux kernel, but this appears to be a very minor chip ID (revision level) issue. There is no audio input connector.
- DVI video output. This also provides analog VGA signals through an adapter shipped with the computer. (It can even composite video and S-video signals through an optional adapter.)
- One internal IDE bus connected to a 2.5" IDE hard disk (either 40Gb or 80Gb according to model).
- A slot-loading laptop-style optical drive; either a combo DVD/CD-RW drive or a "Superdrive" (DVD+/-R, CD-RW).
- A proprietary internal mezzanine card holding an optional 802.11g wireless LAN adapter (unfortunately not supportable by Linux due to lack of disclosure by Broadcom, the chipset manufacturer) and/or a Bluetooth module.
- An internal 56Kbps modem. I don't have an analog phone line (we're a cell phone and broadband family) so I don't know anything about this peripheral.
This series uses the Linux operating system for a couple of reasons. The foremost reason is that it is a design goal for this project to be entirely open source. This goal cannot be fulfilled on top of Mac OS. The other primary reasons for selecting Linux are that it is modularly configurable to a relatively fine granularity, and it offers excellent API-level compatibility amongst different platforms that are popular for high-end (32-bit and larger) embedded cores: PPC, ARM, x86, and MIPS.
I experimented with a few distributions of Linux for PowerPC platforms. Debian (available in Resources) weighs in at a svelte nine gigabyte download, or fourteen CD images, although you don't actually need all of those disks. I eventually chose Yellow Dog Linux 4.0.1 because the standard disk set is a smaller download (four CD images), and, more importantly, this distribution resembles Fedora very closely. I happen to have spent most of my Linux life working with Red Hat-based products, so this was a comfort choice for me. I had no compelling technical reason to choose Yellow Dog, and if you're more comfortable with another distribution, feel free to use it as you follow along with this series. The application you'll build in this series will run happily on practically any distribution.
To install Yellow Dog, first download and burn the four ISO CD images.
Power up the Mac mini, insert CD #1 in the drive (quickly) and hold C to
force CD startup. You'll be taken to the
yaboot startup screen, at which
you should simply type
install to run the default graphical installer.
You can use this disk for emergency startup as well as installation, and
it has some alternative images on it also, such as a G5-optimized
version. You can get a list of available images by pressing Tab at the
boot: prompt, but for now let's move on with the installation.
When you press Return after typing
there will be a brief pause
while the kernel and initial RAM disk are loaded off the CD. You then
see the familiar Linux kernel startup messages (observe that it's
running in framebuffer mode, by the way), and finally you reach the
X-based graphical installer. If you've ever installed Red Hat or Fedora
Core, the graphical installer will be completely familiar to you; if not,
it'll be unfamiliar but still very easy. I'll
briefly walk you through the screens so that you wind up with a
configuration that contains everything you need and not too much
- Welcome to Yellow Dog Linux -- Click Next.
- Language -- Choose English and click Next.
- Keyboard Configuration -- Choose US English and click Next.
- Installation Type -- Select Custom and click Next.
- Disk Partitioning Setup -- Select Manually partition with Disk Druid and click Next.
- Disk Setup -- You'll be installing the simple case: a Linux-only system (as opposed to a dual-boot Mac OS + Linux environment). In Disk Druid, first delete any partitions you see. Next, create a 1Mb partition of type Apple Bootstrap. Next, create a swap partition at least as large as the amount of physical RAM in your Mac mini. Finally, create a root partition of type ext3, and select Fill to maximum allowable size so it covers the remainder of the disk. This is not necessarily the best file system arrangement, particularly for an embedded appliance, but I'm configuring things this way for simplicity's sake. By the way, you'll notice that this version of Disk Druid, unlike the version used on x86 distributions, does not sort partitions; it puts them on the disk in the order you request them.
- Firewall Configuration -- For this simple application, choose No firewall, and set Enable SELinux to Disabled.
- Additional Language Support -- Leave this at its default settings; just click Next.
- Time Zone Selection -- Choose your physical location as appropriate.
- Set Root Password -- select a password that's easy for you to remember.
The last thing you have to set up is the Package Group Selection dialog. First, go down the list of package groups unchecking everything. Then, check the following package groups ONLY, go into the details for these groups, and verify that only the items listed below are checked:
- In the X Window System group, check
- In the Editors group, check whichever editor(s) you prefer to
use; I use
emacs; you might like something else.
- In the Text-based Internet group, select
elinks-- it's very useful to have a simple Web browser available in case you need it.
- In Development Tools, the default package options are pretty
good. I personally prefer to deselect
gcc-java, since I know I never use these languages, but feel free to leave them checked if you want to keep your options open.
- In Kernel Development, for some reason, GTK+ and Qt library materials are listed. Deselect all the optional packages in this group; you only need the kernel source.
- In X Software Development, keep the default package set.
All the hard work is now done. After you confirm your desire to install the operating system, the installer informs you which CDs you're going to need -- if you followed my installation choices exactly, you'll need CDs 1, 2, and 3. You then merely need to change disks as prompted.
When the installation is complete, the last disk will eject and
you'll be prompted to reboot. The startup process, if left unmolested,
will run through all the familiar Red Hat-style screens and scripts, and
you'll wind up at a text-mode login prompt. If Kudzu (RedHat's hardware
probing code; see Resources) runs the first time you
start the machine up, let it install or remove hardware configurations
however it wants. Log in as
root, with the
password you specified earlier in the installation process.
You now need to do a little tweaking and polishing to get the system into a useful state. The first thing you need to know is that you won't have audio facilities -- at least not right away. The reason for this is that currently the audio chip in the Mac mini is not supported by the Linux kernel. However, it will almost certainly be supported soon (in fact, a patch might well be available by the time you read this). Alternatively, you could pick up a supported USB audio interface, such as the Griffin Technologies iMic (see Resources).
To test the audio features I'll mention in a later
article, and to verify that my code really works, I secretly built myself a
second development system (a first-generation Bondi blue iMac, if you're
interested) with the exact same software configuration that I discuss
here. Audio wasn't detected or enabled by default after installing on
the iMac, so I had to set it up manually. At the end
/etc/rc.d/rc.sysinit (immediately before the
comment that reads
"# Let rhgb know that we're leaving rc.sysinit"), I added the lines:
Listing 1. Configuring sound
modprobe snd-powermac modprobe snd-pcm-oss aumix-minimal -v85 -l85 -c85 -w85 -W85
I also added the line
although this isn't strictly necessary.
You can set your own audio volume levels, of course; those defaults just
happen to work for my environment. You can use the
playwave command with
.wav file, or the
cdp program with an audio CD, to
test your current volume settings; use the
user interface to
adjust the various mixer settings. After you set the audio to a
comfortable level, run
aumix again and press
s (note the lowercase).
This will save the current mixer settings to a file called
simply examine this file to determine the exact numbers to put in the
script. Note that you cannot use the
(load settings) option
from within startup scripts; it almost always segfaults. That's why you
aumix-minimal with command-line options.
You should make all the audio-related configuration changes described above to your Mac mini, in preparation for the availability of compatible drivers. Think of it as a vaccination against having to come back and reread this article later!
The next thing to do is get the network connectivity
operational. Although Linux supports the Ethernet MAC in the Mac mini, unfortunately it doesn't appear to be auto-detected. Make sure that the line
alias eth0 sungem appears
/etc/modprobe.conf. You then need to create a configuration file
for the Ethernet adapter. This file must be saved
and it should contain the following lines:
Listing 2. Configuring the network
DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Ethernet
Note that some people report that Kudzu automatically set all of this up for them on first boot. This didn't happen for me; it could have something to do with the rather austere set of install options I selected, or it could simply be the unreality field that surrounds me.
An FYI note: If you're really getting into the swing of this
article, and you're setting up an ancient iMac like mine as your
secondary system, note that the Ethernet driver is called
bmac on this
old machine -- so change the
modprobe.conf line to
alias eth0 bmac. The
other setup details are all the same.
At this point you should be able to bring up the Ethernet interface with
ifup eth0. Assuming you're connected to a network and a
functional DHCP server is within reach, you should be able to run some
basic network tests like pinging your default router. Use
find out your machine's IP address, and write it down -- you'll need it
to do some testing in a moment.
Next, install the
thttpd Web server,
which will provide a user interface to control your appliance-to-be. You can download the source code for
thttpd from the link in
Resources. Extract the tarball, cd to the directory thus created, and
./configure to create the makefile. Now execute
make all ; make install to build and install the daemon. During the install process,
you'll see an error message about a nonexistent
www group. You can safely ignore this error, since it relates to a feature of
thttpd that you
Now that you've built and installed the server, create a minimal configuration file, using the following lines:
Listing 3. Configuring thtppd
dir=/web cgipat=/cgi-bin/* logfile=/dev/null pidfile=/var/run/thttpd.pid
Save the above lines as
add the line
/etc/thttpd.conf. It doesn't
matter where you put this line. By the way, while you're debugging your
system, it might be useful to direct the log output to a real file
/dev/null. For a production
system, however, you should
disable logging unless you have some methodology in process to rotate or
truncate the log file. Otherwise, you're setting the stage for an
out-of-disk-space condition at some unpredictable time in the future.
Before continuing, make certain that the
/web directory exists on your
system, and create it if it doesn't. Also ensure that it is world writable
chmod 777 /web. When you have done this, run
thttpd -C /etc/thttpd.conf to start the
thttpd daemon manually. On another
machine on the same network, open a Web browser and navigate to
http://a.b.c.d/, where a.b.c.d is the IP address of your Macintosh. If
everything is working properly, and assuming you didn't put anything in
/web directory, you'll see a directory listing, on a lime-green
background, headed "Index of /".
Next, you need an easy way for people to get pictures and other
multimedia files onto the unit's hard disk. I use ProFTPD
for this, because it's one of the best-known open source FTP servers
around. It's flexible, reasonably secure, and available at an unbeatable
price. The current version at the time of writing is 1.2.10, and you can find it from the link in Resources. Again, to build and install it,
simply extract the tarball, change to the directory thus created,
make all ;
Configuring ProFTPD is substantially more complicated than configuring
thttpd, because the FTP server tries to interact with the operating
system a lot for authentication purposes. The default configuration
file, which gets installed to
/usr/local/etc/proftpd.conf, contains a
bunch of assumptions that aren't valid for what you want to do. Here's an
abbreviated configuration file that should meet your needs:
Listing 4. Configuring ProFTPD
ServerName "developerWorks Multimedia Appliance" ServerType standalone DefaultServer on Port 21 Umask 022 MaxInstances 30 User root Group root AllowOverwrite on <Anonymous /web> User ftp Group ftp UserAlias anonymous ftp MaxClients 10 </Anonymous>
You also need to edit
again and add the line
/usr/local/sbin/in.proftpd; again, it doesn't matter where you put
this line. At this point you should be able to
/usr/local/sbin/in.proftpd to start the server manually, and then
test connecting from another machine (log in as "anonymous" with any
The above discussion assumes that your network is inherently
secure against people that are going to want to do Bad Things to your
photos. If you want to develop a more secure system, please refer to the
ProFTPD documentation (see Resources). The complication here is that you want to provide
remote access to the same directory that
thttpd uses for the Web serving
root; you need to be extremely careful that you don't inadvertently make
it impossible for
thttpd (and the CGI programs it's going to call) to
read files that were uploaded over the Web interface.
One more useful network daemon runs by default in the Yellow
Dog setup you installed, and that's
sshd. Leave this process
running, because it's handy to be able to connect to the box over the
command line. (You might also want to do your development remotely). Because
you haven't set up any secondary users on the Mac mini, to connect through
ssh on your remote computer, use the command
ssh -l root a.b.c.d, where
a.b.c.d is the IP address of the Mac mini. The first time you do this,
you will need to confirm the identity of the remote system. Remember
yes and not just
This article showed you how to install Linux, configure the networking and audio subsystems, and install and configure a simple Web server. You also set up an FTP server that will let you get multimedia content onto the hard disk remotely. At this point you can start doing your development pretty much entirely from a remote PC, too.
- See the other articles in this series.
- My Linux distribution of choice is Yellow Dog. Besides being freely downloadable, you can also buy this distribution in various cute packaging options.
- You can
a Mac with Yellow Dog Linux pre-installed on it
from Terra Soft Solutions.
- Another Linux option you might want to consider is Debian. Start with
PPC Debian snapshots,
found on their Web site. If you're familiar with Debian
on x86, this is probably a better choice. Although I was initially
considering this distribution, I decided that the Red-Hat-ness of Yellow
Dog made it a more comfortable platform.
- If you're going with Debian, you'll probably want to read this
installing Debian on the Mac mini.
Actually, it's an interesting piece of background reading
regardless of which distribution you intend to use.
- Yellow Dog Linux may not support the mini's built-in audio, but it
supports the Griffin
iMic USB audio interface.
- The Web server used in this article is the slender, high-performance
thttpd. I've spoken about this
elsewhere, so I won't repeat myself. Just download it, already!
- I also use the ProFTPD FTP
server. This is a
very full-featured package; this series only uses a tiny section of it.
- Linspire sells a custom Linux distribution for PCs.
The interesting thing about this company is that they have taken an
active interest in acquiring multimedia codec licenses, and they sell a
Linux media player which is fully licensed for playing DVDs and other
media. If you were planning to do a commercial product of the kind we're
talking about here, you might want to contact these people.
- This FAQ about DVDs
goes into more detail about licensing issues.
- Another developerWorks article offers a different
view of the Mac mini as an embedded development platform.
- IBM maintains substantial documentation on its strong
commitment to Linux.
- Mini too cheap? Maybe you should run your Linux
application on big iron.
- If you enjoy living on the bleeding edge, you can overclock
your Mac mini with the information found here.
- Find more information about the Kudzu hardware probing library
and related code on RedHat's site.
Lewin A.R.W. Edwards works for a Fortune 50 company as a wireless security/fire safety device design engineer. Prior to that, he spent five years developing x86, ARM and PA-RISC-based networked multimedia appliances at Digi-Frame Inc. He has extensive experience in encryption and security software and is the author of two books on embedded systems development. He can be reached at email@example.com.