Can't even say those two words "Clickbait Title" anymore without getting our local baby all in tears...
Its that time of the year again, when WTC (we think code) pay MyBroadband to punt their recruitment drive. Except this year I find it pretty interesting. However before we go into this year's challenge, let's discuss a little about these people:
What We Think Code is?
In my opinion, they are what I would call a "finishing school" for DERIVCO, BBD and other body shops. This is clearly demonstrated on how they discriminate on age i.e. 17-35 year old people only. So basically that excludes a fuck-load of people in my age group who haven't had a chance to study IT, yet we're already fighting our way in the software development space. So basically, as I understand it, you get prepped for a role at one of the body shops, and probably with some kind of paper that doesn't hold nearly as much weight as the bona fide degree one would get from university.
I have actually spoken to them last year, when I was being banned by Spamcaster on MyBB, and while they seem to be a nice bunch, the whole business model is not clear. That is, however, not for me to judge, they obviously make money, but they are obviously trying to create a glut of software developers, pretty much like a glut of bean counters and lawyers. This is not good for any of us who code for a living, we will soon find ourselves being pushed out by these people.
So this year's challenge
In 2017 it appears people are looking for people who can hack. Considering all the crap that went down last year, its not surprising. Their challenge, which resembles the familiar Cicada3301 puzzles, are to be found here.
The challenge is a no-brainer actually, anyone who has even contemplated breaking, or made progress with Cicada3301, will find this a breeze.
This part of the blog is to describe the process of the CDP01 which is essentially a kit-type CD player for audiophiles. I don't generally have the flexibility to add rich content on diyaudio.com as I do here. Its also easier for me to update everything in one place, even while on the road. Therefore this category in the blog is where all the info is posted. This blog here will therefore be perma-linked to the revelant post on diyaudio.com
What is this about?
As most designers know, CD player designs are shrouded in secrecy, partly due to Sony and Philips and their alleigance to the music business. The patents have expired now, and still its kept secret. I am tired of seeing Chinese crap players being sold with zero chance of customization or even further development, so I decided to design something proper, and in addition to this, this has been a personal goal for a long time.
Ah but how come there are difficulties- surely hacking can sort this out?
The CD player is a pretty complex piece of kit. It has multiple PID based servos to control the disc spindle motor, the lens focus, the lens tracking, and the SLED. These are not simple things, as anyone who has done work on PID servos in software will attest. Furthermore, getting concise and complete technical info on the DSP chip has always been a real challenge. Until around 1999 it has been virtually impossible for me to get any information on anything CD player related. Even getting the parts themselves has been a difficult thing to do.
In terms of parts I noticed there was suddenly a glut of Sony pick-ups and CD deck mechanisms going for insane cheap prices all over the show at regular shops in and amongst the Arduino stuff. Even since then I have been trying to make a design to use these cheap parts.
I have attempted to listen in on the bus comms between the CD player DSP and MICOM, but without knowing what registers are present in the DSP, its like taking a stab in the dark. Even with a logic analyzer, if you don't know what you are listening to, how can one know what to do with it? Also adding to this frustration is that some values are specific to the hardware- Sony designs are often "adjustment free" but in reality the MICOM has a table of tuning values stored in EEPROM that are programmed during factory testing. Without having a clue about the registers, and the firmware, its kind of impossible to know what value does what.
Also, if the chip features anything to do with WMA/MP3 playback, the datasheet will not exist on the internet, probably due to all the licensing and royalties demanded by Fraunhofer IIS and Microsoft and all those watertight NDAs
What process have you followed?
I have approached everyone, including Sony, NXP(Philips) and even some Chinese manufacturers such as ALi Corporation. None of those companies would listen to me. In fact, the latter Chinese company played the race card with me, and in the end Panasonic of Japan, told me, there's "no market" for this anymore. In general, as the owner of a small company, it becomes kind of hard to be taken seriously by these large corporations, until 2017 when my fortunes changed.
Fortunes changed? What happened?
So I am a regular reader of elektrotanya.com and I look what is available in the shops, or what I get in for repair or even what I find in the trash. In January 2017 I noticed there was a new car CD player from Sony out on the market.. so I got the service manual and saw they used a new chip from ON Semiconductor. I got the datasheet and noticed that it has everything including an embedded sequencer- its preferred method of control is macro commands via a plain vanilla serial interface.
So without getting my hopes up, I approached ON Semiconductor via the local agent in SA (EBV) and I wrote them a letter explaining my intentions and desire to build high-end audio equipment. Imagine my shock and surprise, when they sent me the complete and full documentation of that chip, including a reference design, with extremely important info about the laser pick-up block the chip is optimized for. After many years of persistence, my tenacity has paid off.
So what chip are you using?
I am using the LC78615E from ON Semiconductor.
I guess I know more now about Kevin Spamcaster, which kind of makes sense...
For someone who has the personality of a robot, and really cannot handle any form of criticism, should I actually be responding to these questions? You never know, one might offend him again, and then go through the whole saga of being an unperson, being banned on DISQUS, being sent a lawyer's letter... hmmm??? Nope!
Man oh man, I was all smiles yesterday when Kevin Spamcaster was put in his place by daffy aka Kieran Murphy, widely regarded as an expert in the ICT field:
I wonder if daffy got a YELLOW CARD, but I don't think so. However the internal heat must have been bad, as this was posted nearly 24 hours later:
So yes, Kevin, 2+2 does NOT EQUAL 5, yet...
After many years, I have ditched the Freescale Platform. The reasons for this I will expand in another post but one of the things that their NON-STANDARD C compiler had, was the neat ability to define a macro to a bit in memory, so basically a port pin could be assigned to directly as either 0 or 1.
Now try and do that with anything that runs in GCC compiler land, and you're pretty much screwed. It has bugged me for a long time, so recently I thought about it again, and now I have a solution, which works in AVR studio and pretty much works like it used to in Freescale Codewarrior.
So to do this, create yourself a header file called whatever. Inside this header file, copypasta the following code:
// Bit Field Conversion for PORT Access
// Data Direction
//#define ddra (*((volatile BYTE_BITFIELD*)(&DDRA)))
#define ddrb (*((volatile BYTE_BITFIELD*)(&DDRB)))
#define ddrc (*((volatile BYTE_BITFIELD*)(&DDRC)))
#define ddrd (*((volatile BYTE_BITFIELD*)(&DDRD)))
// Output Port
//#define porta (*((volatile BYTE_BITFIELD*)(&PORTA)))
#define portb (*((volatile BYTE_BITFIELD*)(&PORTB)))
#define portc (*((volatile BYTE_BITFIELD*)(&PORTC)))
#define portd (*((volatile BYTE_BITFIELD*)(&PORTD)))
// Input Port
//#define pina (*((volatile BYTE_BITFIELD*)(&PINA)))
#define pinb (*((volatile BYTE_BITFIELD*)(&PINB)))
#define pinc (*((volatile BYTE_BITFIELD*)(&PINC)))
#define pind (*((volatile BYTE_BITFIELD*)(&PIND)))
And then, in your source code, its simply a case of....
#define LED portc.bit0