{"id":27,"date":"2015-08-30T11:28:24","date_gmt":"2015-08-30T16:28:24","guid":{"rendered":"http:\/\/drmad.org\/blog\/?p=27"},"modified":"2016-09-08T14:29:40","modified_gmt":"2016-09-08T19:29:40","slug":"jugando-con-el-framebuffer-de-linux-en-raspberry-pi","status":"publish","type":"post","link":"https:\/\/drmad.org\/blog\/jugando-con-el-framebuffer-de-linux-en-raspberry-pi.html","title":{"rendered":"Jugando con el framebuffer de Linux en Raspberry PI"},"content":{"rendered":"<p>Hace una semana lleg\u00f3 (despu\u00e9s de 4 meses),&nbsp;<a href=\"https:\/\/twitter.com\/drmad\/status\/633496955495317504\">la pantalla 7&#8243; touch<\/a> que ped\u00ed al Papa Noel chino \ud83d\ude42<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/drmad.org\/blog\/wp-content\/uploads\/2015\/08\/IMG-20150817-WA0009.jpg?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-30\" src=\"https:\/\/i0.wp.com\/drmad.org\/blog\/wp-content\/uploads\/2015\/08\/IMG-20150817-WA0009.jpg?resize=810%2C455&#038;ssl=1\" alt=\"IMG-20150817-WA0009\" width=\"810\" height=\"455\"><\/a><\/p>\n<p>Docenas de ideas se me ocurrieron para usar esta pantalla con el <a href=\"https:\/\/twitter.com\/drmad\/status\/524436157510483968\">Rasperry Pi<\/a>&nbsp;del la visita anterior de Papa Noel:&nbsp;Desde&nbsp;un <em>on-board display<\/em> para el carro, hasta un reloj mono para mi alcoba.&nbsp;Pero cualquier cosa que haga tiene un peque\u00f1o reto: El <em>hardware<\/em> es bastante limitado: 700 MHz de velocidad de procesador, 512MB de RAM, entre otras cosas. Pero eso es excelente: con pocos recursos,&nbsp;necesitas ser creativo \ud83d\ude42<\/p>\n<p>El primer problema es c\u00f3mo dibujar una interfase gr\u00e1fica para lo que vaya a hacer. Lo m\u00e1s sencillo hubiera sido quiz\u00e1s usar&nbsp;<a href=\"http:\/\/gambas.sourceforge.net\/en\/main.html\">Gambas<\/a>, pero el <em>overhead<\/em> ser\u00eda demasiado. As\u00ed que comenc\u00e9 a bajar de nivel, pensando en <a href=\"https:\/\/www.python.org\/\">Python<\/a> + OpenGL, C++ + OpenGL, pero todo me pareci\u00f3 muy complicado y\/o con demasiado <em>overhead<\/em>.&nbsp;Al final, despu\u00e9s de indagar un poco, llegu\u00e9 a viejo <a href=\"https:\/\/en.wikipedia.org\/wiki\/Linux_framebuffer\">Framebuffer de Linux<\/a>. Y es perfecto: No requiere ninguna dependencia (ya viene todo en&nbsp;Linux), funciona en cualquier Linux, y es bastante sencillo de usar: Como en los viejos tiempos, accedes a la memoria de v\u00eddeo directo para&nbsp;dibujar los pixeles. Mi lado <em>oldschool <a href=\"https:\/\/en.wikipedia.org\/wiki\/Demoscene\">demoscener<\/a><\/em> se emocion\u00f3 B-)<\/p>\n<p>Y qu\u00e9 mejor forma de probarlo, que implementar un viejo efecto de fuego \ud83d\ude00<\/p>\n<p><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/O2NAr2LjTTM\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>Este c\u00f3digo est\u00e1 hecho en C, y tuvo varias iteraciones. Primero lo empec\u00e9 probando en Dorothy, que su framebuffer s\u00f3lo trabaja a 1024&#215;768 y 32bpp. Pero era demasiado lento en el RPI. Al final qued\u00f3 trabajando a 8 bpp (como en la VGA de anta\u00f1o, <em>so retro!!1ONE <\/em>\ud83d\ude00<em>&nbsp;<\/em>), usando <a href=\"https:\/\/es.wikipedia.org\/wiki\/Lookup_table\">lookup tables<\/a>&nbsp;para evitar ejecutar rand() en el bucle principal (lento), y convirtiendo las funciones para leer y escribir pixeles en macros.<\/p>\n<p>El c\u00f3digo fuente est\u00e1 en <a href=\"https:\/\/github.com\/drmad\/rpi-framebuffer\">github<\/a>.<\/p>\n<p>Mi <em>c-foo<\/em>&nbsp;est\u00e1 muy oxidado&#8230; aun hay espacio para optimar m\u00e1s ese c\u00f3digo. A\u00fan as\u00ed, fue una semana excelente, acabando con un perfecto&nbsp;<a href=\"https:\/\/twitter.com\/hashtag\/viernesretro\">#viernesretro&nbsp;<\/a>\ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hace una semana lleg\u00f3 (despu\u00e9s de 4 meses),&nbsp;la pantalla 7&#8243; touch que ped\u00ed al Papa Noel chino \ud83d\ude42 Docenas de<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[6,7],"tags":[],"class_list":["post-27","post","type-post","status-publish","format-standard","hentry","category-linux","category-raspberry-pi"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6p3z1-r","jetpack-related-posts":[],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts\/27","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/comments?post=27"}],"version-history":[{"count":5,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts\/27\/revisions"}],"predecessor-version":[{"id":96,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts\/27\/revisions\/96"}],"wp:attachment":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/media?parent=27"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/categories?post=27"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/tags?post=27"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}