{"id":778,"date":"2007-11-24T22:24:46","date_gmt":"2007-11-24T21:24:46","guid":{"rendered":"http:\/\/bitacora.eniac2000.com\/?p=778"},"modified":"2007-11-24T22:24:46","modified_gmt":"2007-11-24T21:24:46","slug":"uso-de-lectores-de-tarjetas-ltc31-en-linux","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=778","title":{"rendered":"Uso de lectores de tarjetas LTC31 en linux"},"content":{"rendered":"<p>Los lectores de tarjetas electr\u00f3nicas <a href=\"http:\/\/www.c3po.es\/ltc31.html\">LTC31<\/a> de <a href=\"http:\/\/www.c3po.es\">C3PO<\/a> (ejem) son unos dispositivos dise\u00f1ados para leer tarjetas electr\u00f3nicas (por ejemplo el nuevo <a href=\"http:\/\/www.dnielectronico.es\">DNI-e<\/a>) que gozan de una amplia difusi\u00f3n.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/www.c3po.es\/img_products\/LTC31_04.jpg\" alt=\"Lector LTC31\" \/><\/p>\n<p>Hace poco tiempo tuve la oportunidad de hacerme con uno, y como no pod\u00eda ser menos, decid\u00ed utilizarlo en mi Debian, para lo que tuve que cacharrear un poco. En la propia p\u00e1gina del fabricante ofrecen informaci\u00f3n de <a href=\"http:\/\/www.c3po.es\/pv_ltc31.html#ltc3x_usb_v1_linux\">c\u00f3mo configurarlo en linux<\/a>, pero dado que resulta un poco cr\u00edptica, he decidido a\u00f1adir mi granito de arena.<\/p>\n<p>El primer problema con el que nos encontramos es que hay dos versiones del dispositivo, con configuraciones diferentes&#8230; y el m\u00edo no informa de ninguna manera de cu\u00e1l es su versi\u00f3n. Tuve que averiguarlo prob\u00e1ndolo en un Windows, donde, al instalarlo con el <a href=\"http:\/\/www.c3po.es\/downloads\/ltc3x227Installer.zip\">instalador gen\u00e9rico<\/a>, informa de la versi\u00f3n. En mi caso, la versi\u00f3n 1.<\/p>\n<p>Al mirar la documentaci\u00f3n de c\u00f3mo instalarlo, lo primero que vi es que es necesario parchear y recompilar el kernel. Adem\u00e1s, es preciso solicitar el parche al servicio post-venta. A trav\u00e9s de la p\u00e1gina <a href=\"http:\/\/soyunfreaky.blogspot.com\/\">The Ubuntu Linux Experience<\/a> pude conseguir <a href=\"http:\/\/soyunfreaky.blogspot.com\/2007\/02\/instalando-el-lector-de-tarjetas.html\">una buena gu\u00eda de parcheado<\/a> (e incluso una versi\u00f3n del parche). Sin embargo, en esta p\u00e1gina se informa de c\u00f3mo parchear el kernel 2.6.17, cuando el m\u00edo es el 2.6.16. Pese a ello, me di\u00f3 un par de buenas pistas.<\/p>\n<p>En mi caso tambi\u00e9n era necesario modificar el archivo <em>drivers\/usb\/host\/uhci-q.c<\/em>, pero de una manera diferente: ni era necesario aplicar el parche, ni la modificaci\u00f3n apuntada para la versi\u00f3n 2.6.17. S\u00f3lo estim\u00e9 necesario comentar el siguiente fragmento de c\u00f3digo:<\/p>\n<p><code>\/* Can't have low-speed bulk transfers *\/<br \/>\nif (urb->dev->speed == USB_SPEED_LOW)<br \/>\nreturn -EINVAL;<\/code><\/p>\n<p>ya que el reemplazo previsto en el c\u00f3digo para el fragmento anterior ya se encontraba presente en la funci\u00f3n:<\/p>\n<p><code>ret = uhci_submit_common(uhci, urb, eurb, uhci->skel_bulk_qh);<br \/>\nif (ret == -EINPROGRESS)<br \/>\nuhci_inc_fsbr(uhci, urb);<\/code><br \/>\n(<br \/>\nDicho y hecho, recompil\u00e9 el n\u00facleo, pero me limit\u00e9 a copiar el nuevo m\u00f3dulo (<em>uhci-hcd.ko<\/em>, localizado en el directorio <em>\/usr\/src\/linux\/drivers\/usb\/host\/<\/em>) en el lugar del antiguo (<em>\/lib\/modules\/2.6.16.11\/kernel\/drivers\/usb\/host\/<\/em>), sin instalar el nuevo kernel. Despu\u00e9s, con <em>modconf<\/em> elimin\u00e9 la antigua versi\u00f3n e instal\u00e9 la nueva,  y ejecut\u00e9 un <em>depmod -a<\/em>.<\/p>\n<p>Una vez hecho lo anterior, y tras instalar los paquetes indicados en la gu\u00eda de instalaci\u00f3n del LTC31 (a saber, <em>pcscd<\/em> y <em>pcsc-tools<\/em>), reinici\u00e9 el demodio de pcsc, y el lector empez\u00f3 a funcionar perfectamente:<\/p>\n<p><code>$ pcsc_scan<br \/>\nPC\/SC device scanner<br \/>\nV 1.4.11 (c) 2001-2007, Ludovic Rousseau<br \/>\nCompiled with PC\/SC lite version: 1.4.4<br \/>\nScanning present readers<br \/>\n0: ActivCard USB Reader 2.0 (00045127) 00 00<\/p>\n<p>Sat Nov 24 22:23:20 2007<br \/>\n Reader 0: ActivCard USB Reader 2.0 (00045127) 00 00<br \/>\n  Card state: Card inserted, Shared Mode,<br \/>\n  ATR: 3B 7F 38 00 00 00 6A 44 4E 49 65 10 02 4C 34 01 13 03 90 00<\/p>\n<p>ATR: 3B 7F 38 00 00 00 6A 44 4E 49 65 10 02 4C 34 01 13 03 90 00<br \/>\n+ TS = 3B --> Direct Convention<br \/>\n+ T0 = 7F, Y(1): 0111, K: 15 (historical bytes)<br \/>\n  TA(1) = 38 --> Fi=744, Di=12, 62 cycles\/ETU (57600 bits\/s at 3.57 MHz)<br \/>\n  TB(1) = 00 --> VPP is not electrically connected<br \/>\n  TC(1) = 00 --> Extra guard time: 0<br \/>\n+ Historical bytes: 00 6A 44 4E 49 65 10 02 4C 34 01 13 03 90 00<br \/>\n  Category indicator byte: 00 (compact TLV data object)<br \/>\n    Tag: 6, len: A (pre-issuing data)<br \/>\n      Data: 44 4E 49 65 10 02 4C 34 01 13<br \/>\n    Mandatory status indicator (3 last bytes)<br \/>\n      LCS (life card cycle): 03 (Initialisation state)<br \/>\n      SW: 9000 (Normal processing.)<br \/>\n<\/code><\/p>\n<p>Un detalle: para que me detectara las tarjetas inteligentes, al rearrancar el demonio tengo que tener la tarjeta introducida en el lector, ya que si no es as\u00ed no parece arrancar correctamente. A partir de ah\u00ed ya es posible retirar la tarjeta y volverla a introducir sin problemas, pero en el primer arranque parece necesario que est\u00e9 presente.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los lectores de tarjetas electr\u00f3nicas LTC31 de C3PO (ejem) son<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[],"series":[],"class_list":["post-778","post","type-post","status-publish","format-standard","hentry","category-informatica"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/778","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=778"}],"version-history":[{"count":0,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/778\/revisions"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=778"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=778"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=778"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}