The if(0) trick in switch() {}

March 31st, 2013

Sometimes you have two case -statements in a switch()-section which does almost identical stuff except some initial thing. Now, here’s a neat trick (related to Duff’s device) for doing that all inline.

int v;
switch(x) {
case 1:
  v = foo();
  if(0)
case 2:
    v = bar();
  do_stuff(v);
  break;
}

You’re welcome!

Serial port on MK802

August 30th, 2012

Got myself an MK802 the other day. Yep, it’s one of those cheap and increasingly powerful pen-drive sized computers that’s trending these days.

In order to do some serious hacking on a device like this you need a serial console. The MK802 have UART pads next to the CPU, but the pads are LVTTL so you need an RS-232 level convert in order to connect it to a standard serial port.

You need:

1 x MAX232
4 x 1µF capacitors
1 x 9 pin d-sub female dongle.

How to do it

Snap open the plastic case, have a look around and locate the UART pads.

In this picture I’ve soldered two of them (GND and Vcc) already.

Schematics

I use Vcc from the MK802 to power the MAX232.

After some soldering

As usual, make sure you don’t short circuit anything.

Final “assembly”

Almost looks better than the original, ait?! :-)

Hook up to your computer, set speed to 115200 (No flow control)


HELLO! BOOT0 is starting!
boot0 version : .3.0
dram size =512
Succeed in opening nand flash.
Succeed in reading Boot1 file head.
The size of Boot1 is 0x00036000.
The file stored in 0X00000000 of block 2 is perfect.
Check is correct.
Ready to disable icache.
Succeed in loading Boot1.
Jump to Boot1.
[ 0.144] boot1 version : 1.3.1a
[ 0.468] set dcdc2 failed, set default clock 384M
[ 0.469] key
[ 0.481] no key found
[ 0.481] flash init start
[ 3.682] flash init finish
[ 3.685] fs init ok
[ 3.686] fattype FAT16
[ 3.686] fs mount ok
[ 3.693] script finish
[ 5.317] power finish
[ 5.324] BootMain start
[ 5.324] 0
[ 5.344] usbdc_vol = 4000, usbdc_cur = 0
[ 5.344] usbpc_vol = 4000, usbpc_cur = 0
[ 5.346] init to usb pc
[ 5.349] set pc
[ 6.084] startup status = -1
[ 6.084] key value = 0
[ 6.085] recovery key high 16, low 16
[ 6.089] unable to find fastboot_key key_max value
[ 6.097] test for multi os boot with display
[ 6.668] WRN:L149(OSAL/OSAL_De.c):Length is ZERO!
[ 6.719] show pic finish
[ 6.719] load kernel start
[ 6.739] load kernel successed
[ 6.740] start address = 0x4a000000
[ 6.741] power exit detect
[ 7.069] twi write err
[ 7.069] usb exit detect
[ 7.069] jump to

U-Boot 2011.09-rc1-dirty (Jun 08 2012 – 12:45:15) Allwinner Technology

CPU: SUNXI Family
Board: A10-EVB
DRAM: 512 MiB
NAND: 3896 MiB
In: serial
Out: serial
Err: serial
——–fastboot partitions——–
-total partitions:9-
-name- -start- -size-
bootloader : 100000 1000000
env : 1100000 200000
boot : 1300000 2000000
system : 3300000 20000000
data : 23300000 40000000
misc : 63300000 100000
recovery : 63400000 2000000
cache : 65400000 8000000
UDISK : 6d400000 86400000
———————————–
Hit any key to stop autoboot: 0

How to fix problems with UTF-8 in ssh sessions on Mac OS X Lion

March 20th, 2012

The “problem” is that ssh forwards some environment variables that screws up the remote end.
Open /etc/ssh_config and remove (or comment out) this line:

SendEnv LANG LC_*

North Texas Red

July 5th, 2010

It’s summer and summer means Corona beer and Corona beer means Chili.

For all you chili lovin’ swedish speaking fellows out there i’ve resurrected the “North Texas Red” recipe previously found at http://www.hornfeldt.se/chili.html. It’s in swedish but that’s just the way it is. Even if you do not speak swedish you might still appreciate the Spotify playlist I’ve prepared for these events

Enjoy!

Detta recept fanns ursprungligen på http://www.hornfeldt.se/chili.html men sidan verkar numera nere. Tack vare archive.org har jag lyckats återskapa den igen. Jag (Andreas) har även lagt in lite kommentarer i kursiv stil i orginaltexten nedan.


VÄRLDENS BÄSTA CHILI

Receptet hittade vi ursprungligen i en bok av Texas-journalisten
Francis X Tolbert, en man som vigde sitt liv åt denna eldiga köttgryta.

Det hela började på det tidiga 60-talet då Tolbert skrev en artikel som
fick rubriken “Jakten på den äkta chilin”.

Under de kommande åren fick han 48 000 brevsvar från världens alla
hörn. Han läste, lagade, reste, provåt och intervjuade levande legender
som Cap Warren, den siste ranchkocken som fortfarande kokade
mat åt sina cowboys på en vedeldad spis bakpå den täckta kokvagnen.

Ganska snart kunde Tolbert slå fast vad som a b s o l u t inte får
finnas med i en chili:

  • tomater
  • vita bönor
  • gul lök
  • köttfärs

Äkta chili lagar man nämligen på hela köttbitar och rätt lagad ska den
vara just vad namnet chili con carne antyder: rödpeppar med en
viss tillsats av kött.

Det stora problemet visade sig vara att hitta den rätta blandningen av
olika pepparsorter så att chilin får en bred fyllig hetta som varar länge
och inte enbart blir olidligt skarp.

Till sist tvingades Tolbert arrangera ett världens första chili-VM och det
recept som vi publicerar här är en variant av det som segrade
- NORTH TEXAS RED.

Det recept som följer är en lätt försvanekad version. Ingen som prövat det har
klagat på styrkan, men många har haft svårt att hitta de rätta ingredienserna.
För er som bor i Stockholm rekommenderar vi en butik som heter BBQ & Chili
som har det mesta i chili-väg och dessutom en stor sortering salsor och såser.

Frukt och grönt -butiken i Hötorgshallen i Stockholm har det man behöver i Chilifruktväg (Andreas anm.)

Det här är vad du behöver:

  • En mycket stor svart järngryta
  • En stekpanna
  • En liten kastrull
  • En helflaska tequila
  • Sex burkar ljust öl, helst det mexikanska Corona.
  • 5 torkade ancho-pepparfrukter (De är stora, mörkt brunröda och finns i
    affärer som säljer latinamerikansk mat. I nödfall kan de ersättas med en
    blandning av mörkrött chilipulver och ett antal flådda, urkärnade
    röda paprikor.)
  • 1 chipotle-peppar (Röd, rökt. Finns konserverad i latinamerikanska
    affärer.)
  • 3 birdseye-pepparfrukter (Små spetsiga klarröda. Kan ersättas av
    torkad, mald piri-piri).
  • 4 jalapeno-pepparfrukter (Knubbiga, gröna. Finns på burk i de flesta
    välsorterade livsmedelsaffärer. Ta den starka varianten.)
  • Baconfett (eller olja) att steka i.
  • 10 stora vitlöksklyftor, grovt hackade.
  • 5 kilo oxkött, skuret i centimeterstora tärningar.
  • En halv kopp mjöl.
  • En kopp chilipulver.
  • Två koppar mörk oxbuljong.
  • 2 matskedar spiskummin. (Kännarna kan inte komma överens om
    kryddan ska rostas innan den används eller inte.)
  • 2 matskedar oregano.
  • 2 matskedar malda korianderfrön.
  • 1/2 matsked socker.
  • Salt, efter smak. Börja försiktigt!
  • Lite grovt majsmjöl, masa harina.

Så här gör du:

  1. Ta dig en rejäl tequila. En platta med gamla Hank Williams-låtar bidrar
    också till så att det rätta chili-perspektivet på tillvaron infinner sig.
  2. Börja sedan med pepparn. Rensa bort stjälkar och frön. Koka den torkade
    pepparn 15 minuter under lock, ställ åt sidan och låtsvalna.
  3. Rensa och hacka den övriga pepparn. Ställ åt sidan. (Här är
    en varning på plats. Peppar är starkt. Den BRÄNNS. Se upp för
    ångorna när du kokar och tvätta händerna noga efteråt. Och
    tänk noga på vad då gör med fingrarna det närmaste dygnet.
    Om du petar dig i näsan kan du lika gärna göra det med
    lödkolven.)
  4. Ta ett glas tequila till, ett rejält glas. Det kommer att behövas. Nu
    börjar det nämligen dra ihop sig.
  5. Fräs vitlöken mjuk och brun. Lägg i grytan.
  6. Öka värmen i stekpannan och börja stek köttet. Ta lite i sänder och rör
    om ordentligt så att bitarna steks på alla sidor. Lägg ner i grytan. Detta är
    ett varmt, osigt och tidsödande slitgöra som kräver både tålamod och tequila.
  7. Blanda mjöl och chilipulver. Strö över köttet i grytan.
  8. Sila av den blötlagda pepparn, men spara vattnet. Mosa den kokta
    pepparn, tillsätt sedan all peppar till köttet.
  9. Häll på pepparvattnet, oxbuljongen och öl tills vätskan täcker köttet.
    Koka upp.
  10. Nu är chilin på väg. En nöjd kock kan ta ett steg tillbaka, beundra sin
    skapelse och belönar sig själv med ytterligare en tequila, raskt åtföljd
    av det resterande ölet.
  11. Låt chilin småkoka. Rör ner spiskummin, oregano och koriander. Rör ofta
    så att mästerverket inte bränns fast i botten.
  12. Fortsätt kokningen tills köttet börjar falla sönder. Det bör ta två,
    tre timmar.
  13. Tequila!!!
  14. Det kan hända att chilin är lite lös när den närmar sig slutkokningen.
    Riktiga Texasbor reder den då med grovt majsmjöl.
  15. Gör slut på den sista skvätten tequila (om du inte redan gjort det).
  16. Ta av grytan och skumma bort det fett som samlats ovanpå.

Den här satsen räcker till ett tjugotal normala människor, men högst
tio chiliälskare.

Servera chilin i små, djupa tallrikar. Många gillar att äta den med
majschips till, en klick cremé fraiche eller lite grovt riven cheddarost
ovanpå. Servera sallad, bröd, guacamole (avocadoröra) och stora
mängder ljust öl till.

Musiken är nästan lika viktig. Satsa på någon genuint: Hank Williams,
Buddy Holly, Joe Ely, Jerry Jeff Walker, Flaco Jiminez, Butch Hancock,
Commander Cody and his Lost Planet Airmen eller Gram Parsons.
Fram mot natten passar det utmärkt att spela Freddy Fenders odödliga
“Before the next teardrops falls”, Doug Sahms “Wasted days and wasted
nights” eller Creedende Clearwater Revivals “Lodi”.

För dig som använder Spotify har jag gjort en färdig spellista

Det går också att spela Wilco, Weeping Willows och helst bör alla sjunga
allsång i någon gammal Carter Family sång typ “Will The Circle Be Unbroken”
Volymen bör vara öronbedövande. Sjung med. Skråla gärna. Och kom ihåg,
en äkta chiliafton S K A spåra ur fram mot natten.


FOTNOT 1: Sedan första publiceringen har vi mottagit en rad klagomål mot
tequilan i detta recept. De som har hört av sig har varit rörande ense om
att en helflaska är alldeles för lite. Naturligvis var den mängden enbart en
rekommendation, anpassad för en person.

Och kollegan Peter Svensson har förslagit en intressant variant. Den
följer här:

SNABB-CHILI:

I nödfall kan alla ingredienser utom tequilan utgå. I sådana fall
förkortas koktiden avsevärt.


FOTNOT 2: Nyårsafton 1990 lagade Jan Gradvall och Stefan
Lindström chili och följde detta recept slaviskt. Ingen av dem
minns någonting efter klockan 18.00 men överlevande har berättat
att kvällen var ovanligt lyckad.


FOTNOT 3: Texten ovan är en lätt omarbetad och uppdaterad
version av ett recept som publicerats två gånger i Expressen. Först
1988 och sedan 1991. Under några år var detta den mest efterfrågade
artikeln i tidningens arkiv. Vännerna på textarkivet berättar att de till
och med fick en förfrågan på en kopia från Saudiarabien under
Desert Storm.


FOTNOT 4: denna text får fritt spridas och kopieras under förutsättning
att ni inte blandar bönor i chilin.


About my HTPC

March 12th, 2010

Some people, after have read my last post, have asked what kind of HTPC, etc I use. So, here is a quick overview:

Hardware

  • Chassis: Fanless HFX Mini Chassis with 130W external power supply.
    Fairly expensive though. I think I payed around 400€ for just the case without electronics (PSU, DVD-drive, etc). It’s quite heavy too. But it’s good…. because it’s heavy :)
  • ASUS P5B MB, Intel Core2Duo and nVidia 8000 series GPU with HDMI output.
    Fairly standard. Not much to say about it.
  • M-Audio externa USB 5.1 audio device.
    I had a lot of problems with noise from the internal audio card so I was more or less forced to use an external one
  • Sonic Impact T-Amp external amplifiers for Front and Back speakers.
    These are pretty crappy actually. I’ve run into some problems with corrosion on the volume dials so they tend to produce bad sound from time to time. Stay away from those. You never get more than you pay for.
  • USB power manager USB controlled power list.
    I use this one to turn on/off the amplifiers and the subwoofer when the HTPC enter/leaves standby mode.
  • Logitech S 510 Cordless Keyboard/Mouse + Remote
    I really like this one. I’ve tried a two other remotes, Logitech diNovo Mini and SoundGraph iMon Pad, but I still think the S 510 remote is best for one simple reason: Fewer buttons.

Software

  • Ubuntu 9.04 installed on a 4 GB USB pendrive with Reiser FS.
    Don’t want a noisy hard drive and SSD drives are still a bit too expensive to be justified. All media is kept on a server that’s located elsewhere.
  • Showtime spawned via an auto-logged-in user.

Pictures

Heat pipe and cable salad is served…

This is where I live. Upstairs from me lives a nice Mac.

And Showtime running on the TV

Repairing my TV

February 17th, 2010

Edit: Unfortunately I’ve lost all pictures for this blogpost.

A few months ago the HTPC (with my Showtime installation) refused to start. Power LED were lit, but nothing else happened. After quite some troubleshooting I realised that the machine would hang if connected to my TV. The TV did not even have to be powered in order to block the system boot. My initial thought was that somehow the DDC bus had been damaged in one way or another (ESD, short circuit, some weird ground loop or whatever). Fortunately the TV has two HDMI connectors so I just switched to the other one and everything was fine and dandy. Until a few days ago…

The same problem was now exhibited on the other HDMI port. This definitely called for some deeper analysis. I didn’t want to buy a new TV just because of this. All other parts of it worked just fine.

First approach – Open the thing and do some measurements. For some reason beyond my understanding LG had been kind enough to bundle printed schematics with the TV. This picture shows one of the HDMI connectors and the I2C EEPROM holding the EDID information for it. The only thing powered by the computer are those EDID EEPROMs.

So our prime suspects where IC1201 and IC1202 (outside of the image above), but both highlighted in this photograph of the PCB:

Initially I thought that the I2C bus was somehow locked due to either SDL or SDC constantly being pulled low. I’ve prior experience with I2C bus lockups like this due to malfunctioning hardware. So I did some measurements with my multimeter. Everything seemed OK. I had also realised that if I plugged in the HDMI cable after boot the system would not hang. It just was just not able detect the monitor even though I explicitly asked it to reprobe all monitors. So next idea was to actually try to see what was going on over the I2C bus…

I decided to sacrifice an HDMI cable and build an I2C bus snooper using the parallel port. Perhaps not the most beautiful thing I’ve made, but hey, it worked just fine.

Now, things started to get interesting. I also found some snooping code on this page. Surprisingly the snooper worked at first attempt. I didn’t even care to check that I didn’t mixed up SDA and SCL. Apparently Murphy had other things to mess up that day.

 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: ff ff ff ff ff ff ff ff 1e 6d 6c 75 7f d1 02 00 ........?mlu???. 10: 0b 10 01 03 80 46 27 78 ea d9 b0 a3 57 49 9c 25 ?????F'x????WI?% 20: 11 49 4b a5 6e 80 31 40 01 01 01 01 45 40 01 01 ?IK?n?1@????E@?? 30: 61 40 01 01 01 01 1b 21 50 a0 51 00 1e 30 48 88 a@?????!P?Q.?0H? 40: 35 00 bc 88 21 00 00 1c 4e 1f 00 80 51 00 1e 30 5.??!..?N?.?Q.?0 50: 40 80 37 00 bc 88 21 00 00 18 00 00 00 fc 00 33 @?7.??!..?...?.3 60: 37 4c 43 32 52 2d 5a 48 0a 20 20 20 00 00 00 fd 7LC2R-ZH? ...? 70: 00 38 4b 1f 3d 09 00 0a 20 20 20 20 20 20 01 c1 .8K?=?.? ?? 

If you spend some time reading more about EDID, it says that byte 00–07 is Header information “00h FFh FFh FFh FFh FFh FFh 00h”. This is clearly not what’s in my EDID ROM. Also the last byte of the EDID is a checksum byte which should be written such that if you sum all 128 bytes the sum should be zero. When I summed the bytes it ended up being 0xFE. Another evidence that the first and last byte in the EDID header has been changed from 00 to FF. The obvious strategy now was to rewrite those bytes back to zero again. So I had to build a full blown I2C interface:

This is based on the Linux kernel parport interface. I loaded the i2c_parport kernel module and run the i2cdetect tool. Nothing was found.

Well, after a fixing a few incorrect solderings I finally got it running (It’s so much easier to write software than to build hardware, that’s for sure). It did detect something at address 0×50, just where the EDID EEPROM is supposed to be located. And even when clocking out the bits myself I could confirm that the two bytes in the header were corrupted.

So now, all that was left was to modify those bytes back. Or? Not really, the EEPROM is write protected (Pin 7 is pulled low, just look at the schematics) so this is not possible. But what the heck, at least I could try it.

 root@htpc:~/nvidia# i2cset 3 0x50 0x00 0x00 No size specified (using byte-data access) WARNING! This program can confuse your I2C bus, cause data loss and worse! DANGEROUS! Writing to a serial EEPROM on a memory DIMM may render your memory USELESS and make your system UNBOOTABLE! I will write to device file /dev/i2c-3, chip address 0x50, data address 0x00, data 0x00, mode byte. Continue? [y/N] y Value 0x00 written, readback matched 

Wait? What’s that: ”readback matched”. It actually succeeded to write the byte?!

 root@htpc:~/nvidia# i2cset 3 0x50 0x07 0x00 No size specified (using byte-data access) WARNING! This program can confuse your I2C bus, cause data loss and worse! DANGEROUS! Writing to a serial EEPROM on a memory DIMM may render your memory USELESS and make your system UNBOOTABLE! I will write to device file /dev/i2c-3, chip address 0x50, data address 0x07, data 0x00, mode byte. Continue? [y/N] y Value 0x00 written, readback matched root@htpc:~/nvidia# i2cdump -r 0-127 -y 3 0x50 c 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: 00 ff ff ff ff ff ff 00 1e 6d 6c 75 7f d1 02 00 ........?mlu???. 10: 0b 10 01 03 80 46 27 78 ea d9 b0 a3 57 49 9c 25 ?????F'x????WI?% 20: 11 49 4b a5 6e 80 31 40 01 01 01 01 45 40 01 01 ?IK?n?1@????E@?? 30: 61 40 01 01 01 01 1b 21 50 a0 51 00 1e 30 48 88 a@?????!P?Q.?0H? 40: 35 00 bc 88 21 00 00 1c 4e 1f 00 80 51 00 1e 30 5.??!..?N?.?Q.?0 50: 40 80 37 00 bc 88 21 00 00 18 00 00 00 fc 00 33 @?7.??!..?...?.3 60: 37 4c 43 32 52 2d 5a 48 0a 20 20 20 00 00 00 fd 7LC2R-ZH? ...? 70: 00 38 4b 1f 3d 09 00 0a 20 20 20 20 20 20 01 c1 .8K?=?.? ?? 

Yep, the other address seemed to play along nice too.

Next I Connected it all back together again as it is supposed to be and it worked again :-)

Having initially been bothered by the fact that the bytes somehow changed even though the EEPROM is write protected I now rather believe that the write protect pin is not correctly hooked up. Either it’s left floating or the “Don’t mount” optional resistor is actually mounted. But right now I don’t care to open the TV once again just to check that. Perhaps I’ll look into it if this happens again.

GCC’s built-in defines

February 14th, 2010

From time to time I’d like to see what defines GCC sets as default. It usually takes some time for me to figure out. So instead of having to look it up every time on some obscure web page I’ll keep a copy of it here. Enjoy!

:| gcc -dM -E -x c -

open(“blog”, O_TRUNC);

February 14th, 2010

Ok, This blog used to be a blog about HTS (my Media player project), but it no longer is. I thought it would be more useful and interesting to use it for sharing ideas and findings about coding in general. Also, the idea of trying to maintain a web page in WordPress for an open source project failed miserably. Instead I resorted to use a shell script and some other trickery for composing the HTS webpage. The pages are not that dynamic, so it really doesn’t matter that it is rebuilt from scratch every time. And by using custom scripts I can include documentation and other automatically generated stuff right into the site.