Linux driver hacking

This is the story of when a company dropped a tiny computer in my lap and asked me to get it working. It was not quite a single board computer, as it was built in several layers. Compared to something like a Raspberry Pi, it was quite thick. They didn’t give me any information about it, only a small list containing what they wanted to use it for, and which operating system they needed. The rest was up to me.

The journey to success started with a screwdriver and a soldering iron. To learn the brand and model of the computer I had to disassemble it quite a bit. Eventually I managed to install the version of Ubuntu they needed. I also installed their custom software to ensure that everything was working. I discovered three glaring issues: the wifi didn’t work, 3G wasn’t working, bluetooth wasn’t working, and it had a strange issue where the monitor turned completely white when I started the software.

It turned out that wifi and 3G was combined into one chip, and the drivers for it had been abandoned for a long time. As a result they were no longer compatible with modern Linux kernels, and I was not allowed to downgrade for security reasons. The monitor was white because the software required precisely one monitor. This particular computer had a hardware based frame buffer, which showed up to the OS as an extra monitor. This was surprisingly difficult to disable, and I had to get clever with it.

The first issue I tried to solve was to get the wifi and 3G chip working. This was also surprisingly hard, as the OS wouldn’t identify it at all for me, and the machine’s own documentation didn’t list it. I had to tear the machine down and dissolve some glue before I could find out which chip it was. The next issue was to find the drivers. It turned out that the big problem with them was that Linux’ timer API has gone through a major rewrite. The drivers I was working with were long abandoned, and it fell to me to patch them, which surprisingly wasn’t too difficult. The documentation for the new and old timing systems was readily available, and the driver code was well written C.

After getting wifi up and running I had to come up with clever ways of disabling its hardware based frame buffer. Again, the machine’s documentation failed me, and the time consuming solution turned out to be a combination of BIOS flags and X11 settings.

I eventually fixed all the issues, which took somewhere along the lines of 10 days in total.