hid-picolcd.c 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861
  1. /***************************************************************************
  2. * Copyright (C) 2010 by Bruno Prémont <bonbons@linux-vserver.org> *
  3. * *
  4. * Based on Logitech G13 driver (v0.4) *
  5. * Copyright (C) 2009 by Rick L. Vinyard, Jr. <rvinyard@cs.nmsu.edu> *
  6. * *
  7. * This program is free software: you can redistribute it and/or modify *
  8. * it under the terms of the GNU General Public License as published by *
  9. * the Free Software Foundation, version 2 of the License. *
  10. * *
  11. * This driver is distributed in the hope that it will be useful, but *
  12. * WITHOUT ANY WARRANTY; without even the implied warranty of *
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
  14. * General Public License for more details. *
  15. * *
  16. * You should have received a copy of the GNU General Public License *
  17. * along with this software. If not see <http://www.gnu.org/licenses/>. *
  18. ***************************************************************************/
  19. #include <linux/hid.h>
  20. #include <linux/hid-debug.h>
  21. #include <linux/input.h>
  22. #include "hid-ids.h"
  23. #include "usbhid/usbhid.h"
  24. #include <linux/usb.h>
  25. #include <linux/fb.h>
  26. #include <linux/vmalloc.h>
  27. #include <linux/backlight.h>
  28. #include <linux/seq_file.h>
  29. #include <linux/debugfs.h>
  30. #include <linux/completion.h>
  31. #define PICOLCD_NAME "PicoLCD (graphic)"
  32. /* Report numbers */
  33. #define REPORT_ERROR_CODE 0x10 /* LCD: IN[16] */
  34. #define ERR_SUCCESS 0x00
  35. #define ERR_PARAMETER_MISSING 0x01
  36. #define ERR_DATA_MISSING 0x02
  37. #define ERR_BLOCK_READ_ONLY 0x03
  38. #define ERR_BLOCK_NOT_ERASABLE 0x04
  39. #define ERR_BLOCK_TOO_BIG 0x05
  40. #define ERR_SECTION_OVERFLOW 0x06
  41. #define ERR_INVALID_CMD_LEN 0x07
  42. #define ERR_INVALID_DATA_LEN 0x08
  43. #define REPORT_KEY_STATE 0x11 /* LCD: IN[2] */
  44. #define REPORT_IR_DATA 0x21 /* LCD: IN[63] */
  45. #define REPORT_EE_DATA 0x32 /* LCD: IN[63] */
  46. #define REPORT_MEMORY 0x41 /* LCD: IN[63] */
  47. #define REPORT_LED_STATE 0x81 /* LCD: OUT[1] */
  48. #define REPORT_BRIGHTNESS 0x91 /* LCD: OUT[1] */
  49. #define REPORT_CONTRAST 0x92 /* LCD: OUT[1] */
  50. #define REPORT_RESET 0x93 /* LCD: OUT[2] */
  51. #define REPORT_LCD_CMD 0x94 /* LCD: OUT[63] */
  52. #define REPORT_LCD_DATA 0x95 /* LCD: OUT[63] */
  53. #define REPORT_LCD_CMD_DATA 0x96 /* LCD: OUT[63] */
  54. #define REPORT_EE_READ 0xa3 /* LCD: OUT[63] */
  55. #define REPORT_EE_WRITE 0xa4 /* LCD: OUT[63] */
  56. #define REPORT_ERASE_MEMORY 0xb2 /* LCD: OUT[2] */
  57. #define REPORT_READ_MEMORY 0xb3 /* LCD: OUT[3] */
  58. #define REPORT_WRITE_MEMORY 0xb4 /* LCD: OUT[63] */
  59. #define REPORT_SPLASH_RESTART 0xc1 /* LCD: OUT[1] */
  60. #define REPORT_EXIT_KEYBOARD 0xef /* LCD: OUT[2] */
  61. #define REPORT_VERSION 0xf1 /* LCD: IN[2],OUT[1] Bootloader: IN[2],OUT[1] */
  62. #define REPORT_BL_ERASE_MEMORY 0xf2 /* Bootloader: IN[36],OUT[4] */
  63. #define REPORT_BL_READ_MEMORY 0xf3 /* Bootloader: IN[36],OUT[4] */
  64. #define REPORT_BL_WRITE_MEMORY 0xf4 /* Bootloader: IN[36],OUT[36] */
  65. #define REPORT_DEVID 0xf5 /* LCD: IN[5], OUT[1] Bootloader: IN[5],OUT[1] */
  66. #define REPORT_SPLASH_SIZE 0xf6 /* LCD: IN[4], OUT[1] */
  67. #define REPORT_HOOK_VERSION 0xf7 /* LCD: IN[2], OUT[1] */
  68. #define REPORT_EXIT_FLASHER 0xff /* Bootloader: OUT[2] */
  69. #if defined(CONFIG_FB) || defined(CONFIG_FB_MODULE)
  70. /* Framebuffer
  71. *
  72. * The PicoLCD use a Topway LCD module of 256x64 pixel
  73. * This display area is tiled over 4 controllers with 8 tiles
  74. * each. Each tile has 8x64 pixel, each data byte representing
  75. * a 1-bit wide vertical line of the tile.
  76. *
  77. * The display can be updated at a tile granularity.
  78. *
  79. * Chip 1 Chip 2 Chip 3 Chip 4
  80. * +----------------+----------------+----------------+----------------+
  81. * | Tile 1 | Tile 1 | Tile 1 | Tile 1 |
  82. * +----------------+----------------+----------------+----------------+
  83. * | Tile 2 | Tile 2 | Tile 2 | Tile 2 |
  84. * +----------------+----------------+----------------+----------------+
  85. * ...
  86. * +----------------+----------------+----------------+----------------+
  87. * | Tile 8 | Tile 8 | Tile 8 | Tile 8 |
  88. * +----------------+----------------+----------------+----------------+
  89. */
  90. #define PICOLCDFB_NAME "picolcdfb"
  91. #define PICOLCDFB_WIDTH (256)
  92. #define PICOLCDFB_HEIGHT (64)
  93. #define PICOLCDFB_SIZE (PICOLCDFB_WIDTH * PICOLCDFB_HEIGHT / 8)
  94. #define PICOLCDFB_UPDATE_RATE_LIMIT 10
  95. #define PICOLCDFB_UPDATE_RATE_DEFAULT 2
  96. /* Framebuffer visual structures */
  97. static const struct fb_fix_screeninfo picolcdfb_fix = {
  98. .id = PICOLCDFB_NAME,
  99. .type = FB_TYPE_PACKED_PIXELS,
  100. .visual = FB_VISUAL_MONO01,
  101. .xpanstep = 0,
  102. .ypanstep = 0,
  103. .ywrapstep = 0,
  104. .line_length = PICOLCDFB_WIDTH / 8,
  105. .accel = FB_ACCEL_NONE,
  106. };
  107. static const struct fb_var_screeninfo picolcdfb_var = {
  108. .xres = PICOLCDFB_WIDTH,
  109. .yres = PICOLCDFB_HEIGHT,
  110. .xres_virtual = PICOLCDFB_WIDTH,
  111. .yres_virtual = PICOLCDFB_HEIGHT,
  112. .width = 103,
  113. .height = 26,
  114. .bits_per_pixel = 1,
  115. .grayscale = 1,
  116. };
  117. #endif /* CONFIG_FB */
  118. /* Input device
  119. *
  120. * The PicoLCD has an IR receiver header, a built-in keypad with 5 keys
  121. * and header for 4x4 key matrix. The built-in keys are part of the matrix.
  122. */
  123. static const unsigned short def_keymap[] = {
  124. KEY_RESERVED, /* none */
  125. KEY_BACK, /* col 4 + row 1 */
  126. KEY_HOMEPAGE, /* col 3 + row 1 */
  127. KEY_RESERVED, /* col 2 + row 1 */
  128. KEY_RESERVED, /* col 1 + row 1 */
  129. KEY_SCROLLUP, /* col 4 + row 2 */
  130. KEY_OK, /* col 3 + row 2 */
  131. KEY_SCROLLDOWN, /* col 2 + row 2 */
  132. KEY_RESERVED, /* col 1 + row 2 */
  133. KEY_RESERVED, /* col 4 + row 3 */
  134. KEY_RESERVED, /* col 3 + row 3 */
  135. KEY_RESERVED, /* col 2 + row 3 */
  136. KEY_RESERVED, /* col 1 + row 3 */
  137. KEY_RESERVED, /* col 4 + row 4 */
  138. KEY_RESERVED, /* col 3 + row 4 */
  139. KEY_RESERVED, /* col 2 + row 4 */
  140. KEY_RESERVED, /* col 1 + row 4 */
  141. };
  142. #define PICOLCD_KEYS ARRAY_SIZE(def_keymap)
  143. /* Description of in-progress IO operation, used for operations
  144. * that trigger response from device */
  145. struct picolcd_pending {
  146. struct hid_report *out_report;
  147. struct hid_report *in_report;
  148. struct completion ready;
  149. int raw_size;
  150. u8 raw_data[64];
  151. };
  152. /* Per device data structure */
  153. struct picolcd_data {
  154. struct hid_device *hdev;
  155. #ifdef CONFIG_DEBUG_FS
  156. int addr_sz;
  157. #endif
  158. u8 version[2];
  159. /* input stuff */
  160. u8 pressed_keys[2];
  161. struct input_dev *input_keys;
  162. struct input_dev *input_cir;
  163. unsigned short keycode[PICOLCD_KEYS];
  164. #if defined(CONFIG_FB) || defined(CONFIG_FB_MODULE)
  165. /* Framebuffer stuff */
  166. u8 fb_update_rate;
  167. u8 fb_bpp;
  168. u8 *fb_vbitmap; /* local copy of what was sent to PicoLCD */
  169. u8 *fb_bitmap; /* framebuffer */
  170. struct fb_info *fb_info;
  171. struct fb_deferred_io fb_defio;
  172. #endif /* CONFIG_FB */
  173. #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
  174. struct backlight_device *backlight;
  175. u8 lcd_brightness;
  176. u8 lcd_power;
  177. #endif /* CONFIG_BACKLIGHT_CLASS_DEVICE */
  178. /* Housekeeping stuff */
  179. spinlock_t lock;
  180. struct mutex mutex;
  181. struct picolcd_pending *pending;
  182. int status;
  183. #define PICOLCD_BOOTLOADER 1
  184. #define PICOLCD_FAILED 2
  185. #define PICOLCD_READY_FB 4
  186. };
  187. /* Find a given report */
  188. #define picolcd_in_report(id, dev) picolcd_report(id, dev, HID_INPUT_REPORT)
  189. #define picolcd_out_report(id, dev) picolcd_report(id, dev, HID_OUTPUT_REPORT)
  190. static struct hid_report *picolcd_report(int id, struct hid_device *hdev, int dir)
  191. {
  192. struct list_head *feature_report_list = &hdev->report_enum[dir].report_list;
  193. struct hid_report *report = NULL;
  194. list_for_each_entry(report, feature_report_list, list) {
  195. if (report->id == id)
  196. return report;
  197. }
  198. dev_warn(&hdev->dev, "No report with id 0x%x found\n", id);
  199. return NULL;
  200. }
  201. #ifdef CONFIG_DEBUG_FS
  202. static void picolcd_debug_out_report(struct picolcd_data *data,
  203. struct hid_device *hdev, struct hid_report *report);
  204. #define usbhid_submit_report(a, b, c) \
  205. do { \
  206. picolcd_debug_out_report(hid_get_drvdata(a), a, b); \
  207. usbhid_submit_report(a, b, c); \
  208. } while (0)
  209. #endif
  210. /* Submit a report and wait for a reply from device - if device fades away
  211. * or does not respond in time, return NULL */
  212. static struct picolcd_pending *picolcd_send_and_wait(struct hid_device *hdev,
  213. int report_id, const u8 *raw_data, int size)
  214. {
  215. struct picolcd_data *data = hid_get_drvdata(hdev);
  216. struct picolcd_pending *work;
  217. struct hid_report *report = picolcd_out_report(report_id, hdev);
  218. unsigned long flags;
  219. int i, j, k;
  220. if (!report || !data)
  221. return NULL;
  222. if (data->status & PICOLCD_FAILED)
  223. return NULL;
  224. work = kzalloc(sizeof(*work), GFP_KERNEL);
  225. if (!work)
  226. return NULL;
  227. init_completion(&work->ready);
  228. work->out_report = report;
  229. work->in_report = NULL;
  230. work->raw_size = 0;
  231. mutex_lock(&data->mutex);
  232. spin_lock_irqsave(&data->lock, flags);
  233. for (i = k = 0; i < report->maxfield; i++)
  234. for (j = 0; j < report->field[i]->report_count; j++) {
  235. hid_set_field(report->field[i], j, k < size ? raw_data[k] : 0);
  236. k++;
  237. }
  238. data->pending = work;
  239. usbhid_submit_report(data->hdev, report, USB_DIR_OUT);
  240. spin_unlock_irqrestore(&data->lock, flags);
  241. wait_for_completion_interruptible_timeout(&work->ready, HZ*2);
  242. spin_lock_irqsave(&data->lock, flags);
  243. data->pending = NULL;
  244. spin_unlock_irqrestore(&data->lock, flags);
  245. mutex_unlock(&data->mutex);
  246. return work;
  247. }
  248. #if defined(CONFIG_FB) || defined(CONFIG_FB_MODULE)
  249. /* Send a given tile to PicoLCD */
  250. static int picolcd_fb_send_tile(struct hid_device *hdev, int chip, int tile)
  251. {
  252. struct picolcd_data *data = hid_get_drvdata(hdev);
  253. struct hid_report *report1 = picolcd_out_report(REPORT_LCD_CMD_DATA, hdev);
  254. struct hid_report *report2 = picolcd_out_report(REPORT_LCD_DATA, hdev);
  255. unsigned long flags;
  256. u8 *tdata;
  257. int i;
  258. if (!report1 || report1->maxfield != 1 || !report2 || report2->maxfield != 1)
  259. return -ENODEV;
  260. spin_lock_irqsave(&data->lock, flags);
  261. hid_set_field(report1->field[0], 0, chip << 2);
  262. hid_set_field(report1->field[0], 1, 0x02);
  263. hid_set_field(report1->field[0], 2, 0x00);
  264. hid_set_field(report1->field[0], 3, 0x00);
  265. hid_set_field(report1->field[0], 4, 0xb8 | tile);
  266. hid_set_field(report1->field[0], 5, 0x00);
  267. hid_set_field(report1->field[0], 6, 0x00);
  268. hid_set_field(report1->field[0], 7, 0x40);
  269. hid_set_field(report1->field[0], 8, 0x00);
  270. hid_set_field(report1->field[0], 9, 0x00);
  271. hid_set_field(report1->field[0], 10, 32);
  272. hid_set_field(report2->field[0], 0, (chip << 2) | 0x01);
  273. hid_set_field(report2->field[0], 1, 0x00);
  274. hid_set_field(report2->field[0], 2, 0x00);
  275. hid_set_field(report2->field[0], 3, 32);
  276. tdata = data->fb_vbitmap + (tile * 4 + chip) * 64;
  277. for (i = 0; i < 64; i++)
  278. if (i < 32)
  279. hid_set_field(report1->field[0], 11 + i, tdata[i]);
  280. else
  281. hid_set_field(report2->field[0], 4 + i - 32, tdata[i]);
  282. usbhid_submit_report(data->hdev, report1, USB_DIR_OUT);
  283. usbhid_submit_report(data->hdev, report2, USB_DIR_OUT);
  284. spin_unlock_irqrestore(&data->lock, flags);
  285. return 0;
  286. }
  287. /* Translate a single tile*/
  288. static int picolcd_fb_update_tile(u8 *vbitmap, const u8 *bitmap, int bpp,
  289. int chip, int tile)
  290. {
  291. int i, b, changed = 0;
  292. u8 tdata[64];
  293. u8 *vdata = vbitmap + (tile * 4 + chip) * 64;
  294. if (bpp == 1) {
  295. for (b = 7; b >= 0; b--) {
  296. const u8 *bdata = bitmap + tile * 256 + chip * 8 + b * 32;
  297. for (i = 0; i < 64; i++) {
  298. tdata[i] <<= 1;
  299. tdata[i] |= (bdata[i/8] >> (7 - i % 8)) & 0x01;
  300. }
  301. }
  302. } else if (bpp == 8) {
  303. for (b = 7; b >= 0; b--) {
  304. const u8 *bdata = bitmap + (tile * 256 + chip * 8 + b * 32) * 8;
  305. for (i = 0; i < 64; i++) {
  306. tdata[i] <<= 1;
  307. tdata[i] |= (bdata[i] & 0x80) ? 0x01 : 0x00;
  308. }
  309. }
  310. } else {
  311. /* Oops, we should never get here! */
  312. WARN_ON(1);
  313. return 0;
  314. }
  315. for (i = 0; i < 64; i++)
  316. if (tdata[i] != vdata[i]) {
  317. changed = 1;
  318. vdata[i] = tdata[i];
  319. }
  320. return changed;
  321. }
  322. /* Reconfigure LCD display */
  323. static int picolcd_fb_reset(struct picolcd_data *data, int clear)
  324. {
  325. struct hid_report *report = picolcd_out_report(REPORT_LCD_CMD, data->hdev);
  326. int i, j;
  327. unsigned long flags;
  328. static const u8 mapcmd[8] = { 0x00, 0x02, 0x00, 0x64, 0x3f, 0x00, 0x64, 0xc0 };
  329. if (!report || report->maxfield != 1)
  330. return -ENODEV;
  331. spin_lock_irqsave(&data->lock, flags);
  332. for (i = 0; i < 4; i++) {
  333. for (j = 0; j < report->field[0]->maxusage; j++)
  334. if (j == 0)
  335. hid_set_field(report->field[0], j, i << 2);
  336. else if (j < sizeof(mapcmd))
  337. hid_set_field(report->field[0], j, mapcmd[j]);
  338. else
  339. hid_set_field(report->field[0], j, 0);
  340. usbhid_submit_report(data->hdev, report, USB_DIR_OUT);
  341. }
  342. data->status |= PICOLCD_READY_FB;
  343. spin_unlock_irqrestore(&data->lock, flags);
  344. if (data->fb_bitmap) {
  345. if (clear) {
  346. memset(data->fb_vbitmap, 0xff, PICOLCDFB_SIZE);
  347. memset(data->fb_bitmap, 0, PICOLCDFB_SIZE*data->fb_bpp);
  348. } else {
  349. /* invert 1 byte in each tile to force resend */
  350. for (i = 0; i < PICOLCDFB_SIZE; i += 64)
  351. data->fb_vbitmap[i] = ~data->fb_vbitmap[i];
  352. }
  353. }
  354. /* schedule first output of framebuffer */
  355. if (data->fb_info)
  356. schedule_delayed_work(&data->fb_info->deferred_work, 0);
  357. return 0;
  358. }
  359. /* Update fb_vbitmap from the screen_base and send changed tiles to device */
  360. static void picolcd_fb_update(struct picolcd_data *data)
  361. {
  362. int chip, tile, n;
  363. unsigned long flags;
  364. spin_lock_irqsave(&data->lock, flags);
  365. if (!(data->status & PICOLCD_READY_FB)) {
  366. spin_unlock_irqrestore(&data->lock, flags);
  367. picolcd_fb_reset(data, 0);
  368. } else {
  369. spin_unlock_irqrestore(&data->lock, flags);
  370. }
  371. /*
  372. * Translate the framebuffer into the format needed by the PicoLCD.
  373. * See display layout above.
  374. * Do this one tile after the other and push those tiles that changed.
  375. *
  376. * Wait for our IO to complete as otherwise we might flood the queue!
  377. */
  378. n = 0;
  379. for (chip = 0; chip < 4; chip++)
  380. for (tile = 0; tile < 8; tile++)
  381. if (picolcd_fb_update_tile(data->fb_vbitmap,
  382. data->fb_bitmap, data->fb_bpp, chip, tile)) {
  383. n += 2;
  384. if (n >= HID_OUTPUT_FIFO_SIZE / 2) {
  385. usbhid_wait_io(data->hdev);
  386. n = 0;
  387. }
  388. picolcd_fb_send_tile(data->hdev, chip, tile);
  389. }
  390. if (n)
  391. usbhid_wait_io(data->hdev);
  392. }
  393. /* Stub to call the system default and update the image on the picoLCD */
  394. static void picolcd_fb_fillrect(struct fb_info *info,
  395. const struct fb_fillrect *rect)
  396. {
  397. if (!info->par)
  398. return;
  399. sys_fillrect(info, rect);
  400. schedule_delayed_work(&info->deferred_work, 0);
  401. }
  402. /* Stub to call the system default and update the image on the picoLCD */
  403. static void picolcd_fb_copyarea(struct fb_info *info,
  404. const struct fb_copyarea *area)
  405. {
  406. if (!info->par)
  407. return;
  408. sys_copyarea(info, area);
  409. schedule_delayed_work(&info->deferred_work, 0);
  410. }
  411. /* Stub to call the system default and update the image on the picoLCD */
  412. static void picolcd_fb_imageblit(struct fb_info *info, const struct fb_image *image)
  413. {
  414. if (!info->par)
  415. return;
  416. sys_imageblit(info, image);
  417. schedule_delayed_work(&info->deferred_work, 0);
  418. }
  419. /*
  420. * this is the slow path from userspace. they can seek and write to
  421. * the fb. it's inefficient to do anything less than a full screen draw
  422. */
  423. static ssize_t picolcd_fb_write(struct fb_info *info, const char __user *buf,
  424. size_t count, loff_t *ppos)
  425. {
  426. ssize_t ret;
  427. if (!info->par)
  428. return -ENODEV;
  429. ret = fb_sys_write(info, buf, count, ppos);
  430. if (ret >= 0)
  431. schedule_delayed_work(&info->deferred_work, 0);
  432. return ret;
  433. }
  434. static int picolcd_fb_blank(int blank, struct fb_info *info)
  435. {
  436. if (!info->par)
  437. return -ENODEV;
  438. /* We let fb notification do this for us via lcd/backlight device */
  439. return 0;
  440. }
  441. static void picolcd_fb_destroy(struct fb_info *info)
  442. {
  443. struct picolcd_data *data = info->par;
  444. info->par = NULL;
  445. if (data)
  446. data->fb_info = NULL;
  447. fb_deferred_io_cleanup(info);
  448. framebuffer_release(info);
  449. }
  450. static int picolcd_fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
  451. {
  452. __u32 bpp = var->bits_per_pixel;
  453. __u32 activate = var->activate;
  454. /* only allow 1/8 bit depth (8-bit is grayscale) */
  455. *var = picolcdfb_var;
  456. var->activate = activate;
  457. if (bpp >= 8)
  458. var->bits_per_pixel = 8;
  459. else
  460. var->bits_per_pixel = 1;
  461. return 0;
  462. }
  463. static int picolcd_set_par(struct fb_info *info)
  464. {
  465. struct picolcd_data *data = info->par;
  466. u8 *o_fb, *n_fb;
  467. if (info->var.bits_per_pixel == data->fb_bpp)
  468. return 0;
  469. /* switch between 1/8 bit depths */
  470. if (info->var.bits_per_pixel != 1 && info->var.bits_per_pixel != 8)
  471. return -EINVAL;
  472. o_fb = data->fb_bitmap;
  473. n_fb = vmalloc(PICOLCDFB_SIZE*info->var.bits_per_pixel);
  474. if (!n_fb)
  475. return -ENOMEM;
  476. fb_deferred_io_cleanup(info);
  477. /* translate FB content to new bits-per-pixel */
  478. if (info->var.bits_per_pixel == 1) {
  479. int i, b;
  480. for (i = 0; i < PICOLCDFB_SIZE; i++) {
  481. u8 p = 0;
  482. for (b = 0; b < 8; b++) {
  483. p <<= 1;
  484. p |= o_fb[i*8+b] ? 0x01 : 0x00;
  485. }
  486. }
  487. info->fix.visual = FB_VISUAL_MONO01;
  488. info->fix.line_length = PICOLCDFB_WIDTH / 8;
  489. } else {
  490. int i;
  491. for (i = 0; i < PICOLCDFB_SIZE * 8; i++)
  492. n_fb[i] = o_fb[i/8] & (0x01 << (7 - i % 8)) ? 0xff : 0x00;
  493. info->fix.visual = FB_VISUAL_TRUECOLOR;
  494. info->fix.line_length = PICOLCDFB_WIDTH;
  495. }
  496. data->fb_bitmap = n_fb;
  497. data->fb_bpp = info->var.bits_per_pixel;
  498. info->screen_base = (char __force __iomem *)n_fb;
  499. info->fix.smem_start = (unsigned long)n_fb;
  500. info->fix.smem_len = PICOLCDFB_SIZE*data->fb_bpp;
  501. fb_deferred_io_init(info);
  502. vfree(o_fb);
  503. return 0;
  504. }
  505. /* Note this can't be const because of struct fb_info definition */
  506. static struct fb_ops picolcdfb_ops = {
  507. .owner = THIS_MODULE,
  508. .fb_destroy = picolcd_fb_destroy,
  509. .fb_read = fb_sys_read,
  510. .fb_write = picolcd_fb_write,
  511. .fb_blank = picolcd_fb_blank,
  512. .fb_fillrect = picolcd_fb_fillrect,
  513. .fb_copyarea = picolcd_fb_copyarea,
  514. .fb_imageblit = picolcd_fb_imageblit,
  515. .fb_check_var = picolcd_fb_check_var,
  516. .fb_set_par = picolcd_set_par,
  517. };
  518. /* Callback from deferred IO workqueue */
  519. static void picolcd_fb_deferred_io(struct fb_info *info, struct list_head *pagelist)
  520. {
  521. picolcd_fb_update(info->par);
  522. }
  523. static const struct fb_deferred_io picolcd_fb_defio = {
  524. .delay = HZ / PICOLCDFB_UPDATE_RATE_DEFAULT,
  525. .deferred_io = picolcd_fb_deferred_io,
  526. };
  527. /*
  528. * The "fb_update_rate" sysfs attribute
  529. */
  530. static ssize_t picolcd_fb_update_rate_show(struct device *dev,
  531. struct device_attribute *attr, char *buf)
  532. {
  533. struct picolcd_data *data = dev_get_drvdata(dev);
  534. unsigned i, fb_update_rate = data->fb_update_rate;
  535. size_t ret = 0;
  536. for (i = 1; i <= PICOLCDFB_UPDATE_RATE_LIMIT; i++)
  537. if (ret >= PAGE_SIZE)
  538. break;
  539. else if (i == fb_update_rate)
  540. ret += snprintf(buf+ret, PAGE_SIZE-ret, "[%u] ", i);
  541. else
  542. ret += snprintf(buf+ret, PAGE_SIZE-ret, "%u ", i);
  543. if (ret > 0)
  544. buf[min(ret, (size_t)PAGE_SIZE)-1] = '\n';
  545. return ret;
  546. }
  547. static ssize_t picolcd_fb_update_rate_store(struct device *dev,
  548. struct device_attribute *attr, const char *buf, size_t count)
  549. {
  550. struct picolcd_data *data = dev_get_drvdata(dev);
  551. int i;
  552. unsigned u;
  553. if (count < 1 || count > 10)
  554. return -EINVAL;
  555. i = sscanf(buf, "%u", &u);
  556. if (i != 1)
  557. return -EINVAL;
  558. if (u > PICOLCDFB_UPDATE_RATE_LIMIT)
  559. return -ERANGE;
  560. else if (u == 0)
  561. u = PICOLCDFB_UPDATE_RATE_DEFAULT;
  562. data->fb_update_rate = u;
  563. data->fb_defio.delay = HZ / data->fb_update_rate;
  564. return count;
  565. }
  566. static DEVICE_ATTR(fb_update_rate, 0666, picolcd_fb_update_rate_show,
  567. picolcd_fb_update_rate_store);
  568. /* initialize Framebuffer device */
  569. static int picolcd_init_framebuffer(struct picolcd_data *data)
  570. {
  571. struct device *dev = &data->hdev->dev;
  572. struct fb_info *info = NULL;
  573. int error = -ENOMEM;
  574. u8 *fb_vbitmap = NULL;
  575. u8 *fb_bitmap = NULL;
  576. fb_bitmap = vmalloc(PICOLCDFB_SIZE*picolcdfb_var.bits_per_pixel);
  577. if (fb_bitmap == NULL) {
  578. dev_err(dev, "can't get a free page for framebuffer\n");
  579. goto err_nomem;
  580. }
  581. fb_vbitmap = kmalloc(PICOLCDFB_SIZE, GFP_KERNEL);
  582. if (fb_vbitmap == NULL) {
  583. dev_err(dev, "can't alloc vbitmap image buffer\n");
  584. goto err_nomem;
  585. }
  586. data->fb_update_rate = PICOLCDFB_UPDATE_RATE_DEFAULT;
  587. data->fb_defio = picolcd_fb_defio;
  588. info = framebuffer_alloc(0, dev);
  589. if (info == NULL) {
  590. dev_err(dev, "failed to allocate a framebuffer\n");
  591. goto err_nomem;
  592. }
  593. info->fbdefio = &data->fb_defio;
  594. info->screen_base = (char __force __iomem *)fb_bitmap;
  595. info->fbops = &picolcdfb_ops;
  596. info->var = picolcdfb_var;
  597. info->fix = picolcdfb_fix;
  598. info->fix.smem_len = PICOLCDFB_SIZE;
  599. info->fix.smem_start = (unsigned long)fb_bitmap;
  600. info->par = data;
  601. info->flags = FBINFO_FLAG_DEFAULT;
  602. data->fb_vbitmap = fb_vbitmap;
  603. data->fb_bitmap = fb_bitmap;
  604. data->fb_bpp = picolcdfb_var.bits_per_pixel;
  605. error = picolcd_fb_reset(data, 1);
  606. if (error) {
  607. dev_err(dev, "failed to configure display\n");
  608. goto err_cleanup;
  609. }
  610. error = device_create_file(dev, &dev_attr_fb_update_rate);
  611. if (error) {
  612. dev_err(dev, "failed to create sysfs attributes\n");
  613. goto err_cleanup;
  614. }
  615. data->fb_info = info;
  616. error = register_framebuffer(info);
  617. if (error) {
  618. dev_err(dev, "failed to register framebuffer\n");
  619. goto err_sysfs;
  620. }
  621. fb_deferred_io_init(info);
  622. /* schedule first output of framebuffer */
  623. schedule_delayed_work(&info->deferred_work, 0);
  624. return 0;
  625. err_sysfs:
  626. device_remove_file(dev, &dev_attr_fb_update_rate);
  627. err_cleanup:
  628. data->fb_vbitmap = NULL;
  629. data->fb_bitmap = NULL;
  630. data->fb_bpp = 0;
  631. data->fb_info = NULL;
  632. err_nomem:
  633. framebuffer_release(info);
  634. vfree(fb_bitmap);
  635. kfree(fb_vbitmap);
  636. return error;
  637. }
  638. static void picolcd_exit_framebuffer(struct picolcd_data *data)
  639. {
  640. struct fb_info *info = data->fb_info;
  641. u8 *fb_vbitmap = data->fb_vbitmap;
  642. u8 *fb_bitmap = data->fb_bitmap;
  643. if (!info)
  644. return;
  645. data->fb_vbitmap = NULL;
  646. data->fb_bitmap = NULL;
  647. data->fb_bpp = 0;
  648. data->fb_info = NULL;
  649. device_remove_file(&data->hdev->dev, &dev_attr_fb_update_rate);
  650. fb_deferred_io_cleanup(info);
  651. unregister_framebuffer(info);
  652. vfree(fb_bitmap);
  653. kfree(fb_vbitmap);
  654. }
  655. #define picolcd_fbinfo(d) ((d)->fb_info)
  656. #else
  657. static inline int picolcd_fb_reset(struct picolcd_data *data, int clear)
  658. {
  659. return 0;
  660. }
  661. static inline int picolcd_init_framebuffer(struct picolcd_data *data)
  662. {
  663. return 0;
  664. }
  665. static void picolcd_exit_framebuffer(struct picolcd_data *data)
  666. {
  667. }
  668. #define picolcd_fbinfo(d) NULL
  669. #endif /* CONFIG_FB */
  670. #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
  671. /*
  672. * backlight class device
  673. */
  674. static int picolcd_get_brightness(struct backlight_device *bdev)
  675. {
  676. struct picolcd_data *data = bl_get_data(bdev);
  677. return data->lcd_brightness;
  678. }
  679. static int picolcd_set_brightness(struct backlight_device *bdev)
  680. {
  681. struct picolcd_data *data = bl_get_data(bdev);
  682. struct hid_report *report = picolcd_out_report(REPORT_BRIGHTNESS, data->hdev);
  683. unsigned long flags;
  684. if (!report || report->maxfield != 1 || report->field[0]->report_count != 1)
  685. return -ENODEV;
  686. data->lcd_brightness = bdev->props.brightness & 0x0ff;
  687. data->lcd_power = bdev->props.power;
  688. spin_lock_irqsave(&data->lock, flags);
  689. hid_set_field(report->field[0], 0, data->lcd_power == FB_BLANK_UNBLANK ? data->lcd_brightness : 0);
  690. usbhid_submit_report(data->hdev, report, USB_DIR_OUT);
  691. spin_unlock_irqrestore(&data->lock, flags);
  692. return 0;
  693. }
  694. static int picolcd_check_bl_fb(struct backlight_device *bdev, struct fb_info *fb)
  695. {
  696. return fb && fb == picolcd_fbinfo((struct picolcd_data *)bl_get_data(bdev));
  697. }
  698. static const struct backlight_ops picolcd_blops = {
  699. .update_status = picolcd_set_brightness,
  700. .get_brightness = picolcd_get_brightness,
  701. .check_fb = picolcd_check_bl_fb,
  702. };
  703. static int picolcd_init_backlight(struct picolcd_data *data, struct hid_report *report)
  704. {
  705. struct device *dev = &data->hdev->dev;
  706. struct backlight_device *bdev;
  707. struct backlight_properties props;
  708. if (!report)
  709. return -ENODEV;
  710. if (report->maxfield != 1 || report->field[0]->report_count != 1 ||
  711. report->field[0]->report_size != 8) {
  712. dev_err(dev, "unsupported BRIGHTNESS report");
  713. return -EINVAL;
  714. }
  715. memset(&props, 0, sizeof(props));
  716. props.max_brightness = 0xff;
  717. bdev = backlight_device_register(dev_name(dev), dev, data,
  718. &picolcd_blops, &props);
  719. if (IS_ERR(bdev)) {
  720. dev_err(dev, "failed to register backlight\n");
  721. return PTR_ERR(bdev);
  722. }
  723. bdev->props.brightness = 0xff;
  724. data->lcd_brightness = 0xff;
  725. data->backlight = bdev;
  726. picolcd_set_brightness(bdev);
  727. return 0;
  728. }
  729. static void picolcd_exit_backlight(struct picolcd_data *data)
  730. {
  731. struct backlight_device *bdev = data->backlight;
  732. data->backlight = NULL;
  733. if (bdev)
  734. backlight_device_unregister(bdev);
  735. }
  736. static inline int picolcd_resume_backlight(struct picolcd_data *data)
  737. {
  738. if (!data->backlight)
  739. return 0;
  740. return picolcd_set_brightness(data->backlight);
  741. }
  742. #else
  743. static inline int picolcd_init_backlight(struct picolcd_data *data,
  744. struct hid_report *report)
  745. {
  746. return 0;
  747. }
  748. static inline void picolcd_exit_backlight(struct picolcd_data *data)
  749. {
  750. }
  751. static inline int picolcd_resume_backlight(struct picolcd_data *data)
  752. {
  753. return 0;
  754. }
  755. #endif /* CONFIG_BACKLIGHT_CLASS_DEVICE */
  756. /*
  757. * input class device
  758. */
  759. static int picolcd_raw_keypad(struct picolcd_data *data,
  760. struct hid_report *report, u8 *raw_data, int size)
  761. {
  762. /*
  763. * Keypad event
  764. * First and second data bytes list currently pressed keys,
  765. * 0x00 means no key and at most 2 keys may be pressed at same time
  766. */
  767. int i, j;
  768. /* determine newly pressed keys */
  769. for (i = 0; i < size; i++) {
  770. unsigned int key_code;
  771. if (raw_data[i] == 0)
  772. continue;
  773. for (j = 0; j < sizeof(data->pressed_keys); j++)
  774. if (data->pressed_keys[j] == raw_data[i])
  775. goto key_already_down;
  776. for (j = 0; j < sizeof(data->pressed_keys); j++)
  777. if (data->pressed_keys[j] == 0) {
  778. data->pressed_keys[j] = raw_data[i];
  779. break;
  780. }
  781. input_event(data->input_keys, EV_MSC, MSC_SCAN, raw_data[i]);
  782. if (raw_data[i] < PICOLCD_KEYS)
  783. key_code = data->keycode[raw_data[i]];
  784. else
  785. key_code = KEY_UNKNOWN;
  786. if (key_code != KEY_UNKNOWN) {
  787. dbg_hid(PICOLCD_NAME " got key press for %u:%d",
  788. raw_data[i], key_code);
  789. input_report_key(data->input_keys, key_code, 1);
  790. }
  791. input_sync(data->input_keys);
  792. key_already_down:
  793. continue;
  794. }
  795. /* determine newly released keys */
  796. for (j = 0; j < sizeof(data->pressed_keys); j++) {
  797. unsigned int key_code;
  798. if (data->pressed_keys[j] == 0)
  799. continue;
  800. for (i = 0; i < size; i++)
  801. if (data->pressed_keys[j] == raw_data[i])
  802. goto key_still_down;
  803. input_event(data->input_keys, EV_MSC, MSC_SCAN, data->pressed_keys[j]);
  804. if (data->pressed_keys[j] < PICOLCD_KEYS)
  805. key_code = data->keycode[data->pressed_keys[j]];
  806. else
  807. key_code = KEY_UNKNOWN;
  808. if (key_code != KEY_UNKNOWN) {
  809. dbg_hid(PICOLCD_NAME " got key release for %u:%d",
  810. data->pressed_keys[j], key_code);
  811. input_report_key(data->input_keys, key_code, 0);
  812. }
  813. input_sync(data->input_keys);
  814. data->pressed_keys[j] = 0;
  815. key_still_down:
  816. continue;
  817. }
  818. return 1;
  819. }
  820. static int picolcd_raw_cir(struct picolcd_data *data,
  821. struct hid_report *report, u8 *raw_data, int size)
  822. {
  823. /* Need understanding of CIR data format to implement ... */
  824. return 1;
  825. }
  826. static int picolcd_check_version(struct hid_device *hdev)
  827. {
  828. struct picolcd_data *data = hid_get_drvdata(hdev);
  829. struct picolcd_pending *verinfo;
  830. int ret = 0;
  831. if (!data)
  832. return -ENODEV;
  833. verinfo = picolcd_send_and_wait(hdev, REPORT_VERSION, NULL, 0);
  834. if (!verinfo) {
  835. dev_err(&hdev->dev, "no version response from PicoLCD");
  836. return -ENODEV;
  837. }
  838. if (verinfo->raw_size == 2) {
  839. if (data->status & PICOLCD_BOOTLOADER) {
  840. dev_info(&hdev->dev, "PicoLCD, bootloader version %d.%d\n",
  841. verinfo->raw_data[0], verinfo->raw_data[1]);
  842. data->version[0] = verinfo->raw_data[0];
  843. data->version[1] = verinfo->raw_data[1];
  844. } else {
  845. dev_info(&hdev->dev, "PicoLCD, firmware version %d.%d\n",
  846. verinfo->raw_data[1], verinfo->raw_data[0]);
  847. data->version[0] = verinfo->raw_data[1];
  848. data->version[1] = verinfo->raw_data[0];
  849. }
  850. } else {
  851. dev_err(&hdev->dev, "confused, got unexpected version response from PicoLCD\n");
  852. ret = -EINVAL;
  853. }
  854. kfree(verinfo);
  855. return ret;
  856. }
  857. /*
  858. * Reset our device and wait for answer to VERSION request
  859. */
  860. static int picolcd_reset(struct hid_device *hdev)
  861. {
  862. struct picolcd_data *data = hid_get_drvdata(hdev);
  863. struct hid_report *report = picolcd_out_report(REPORT_RESET, hdev);
  864. unsigned long flags;
  865. int error;
  866. if (!data || !report || report->maxfield != 1)
  867. return -ENODEV;
  868. spin_lock_irqsave(&data->lock, flags);
  869. if (hdev->product == USB_DEVICE_ID_PICOLCD_BOOTLOADER)
  870. data->status |= PICOLCD_BOOTLOADER;
  871. /* perform the reset */
  872. hid_set_field(report->field[0], 0, 1);
  873. usbhid_submit_report(hdev, report, USB_DIR_OUT);
  874. spin_unlock_irqrestore(&data->lock, flags);
  875. error = picolcd_check_version(hdev);
  876. if (error)
  877. return error;
  878. picolcd_resume_backlight(data);
  879. #if defined(CONFIG_FB) || defined(CONFIG_FB_MODULE)
  880. if (data->fb_info)
  881. schedule_delayed_work(&data->fb_info->deferred_work, 0);
  882. #endif /* CONFIG_FB */
  883. return 0;
  884. }
  885. /*
  886. * The "operation_mode" sysfs attribute
  887. */
  888. static ssize_t picolcd_operation_mode_show(struct device *dev,
  889. struct device_attribute *attr, char *buf)
  890. {
  891. struct picolcd_data *data = dev_get_drvdata(dev);
  892. if (data->status & PICOLCD_BOOTLOADER)
  893. return snprintf(buf, PAGE_SIZE, "[bootloader] lcd\n");
  894. else
  895. return snprintf(buf, PAGE_SIZE, "bootloader [lcd]\n");
  896. }
  897. static ssize_t picolcd_operation_mode_store(struct device *dev,
  898. struct device_attribute *attr, const char *buf, size_t count)
  899. {
  900. struct picolcd_data *data = dev_get_drvdata(dev);
  901. struct hid_report *report = NULL;
  902. size_t cnt = count;
  903. int timeout = 5000;
  904. unsigned u;
  905. unsigned long flags;
  906. if (cnt >= 3 && strncmp("lcd", buf, 3) == 0) {
  907. if (data->status & PICOLCD_BOOTLOADER)
  908. report = picolcd_out_report(REPORT_EXIT_FLASHER, data->hdev);
  909. buf += 3;
  910. cnt -= 3;
  911. } else if (cnt >= 10 && strncmp("bootloader", buf, 10) == 0) {
  912. if (!(data->status & PICOLCD_BOOTLOADER))
  913. report = picolcd_out_report(REPORT_EXIT_KEYBOARD, data->hdev);
  914. buf += 10;
  915. cnt -= 10;
  916. }
  917. if (!report)
  918. return -EINVAL;
  919. while (cnt > 0 && (*buf == ' ' || *buf == '\t')) {
  920. buf++;
  921. cnt--;
  922. }
  923. while (cnt > 0 && (buf[cnt-1] == '\n' || buf[cnt-1] == '\r'))
  924. cnt--;
  925. if (cnt > 0) {
  926. if (sscanf(buf, "%u", &u) != 1)
  927. return -EINVAL;
  928. if (u > 30000)
  929. return -EINVAL;
  930. else
  931. timeout = u;
  932. }
  933. spin_lock_irqsave(&data->lock, flags);
  934. hid_set_field(report->field[0], 0, timeout & 0xff);
  935. hid_set_field(report->field[0], 1, (timeout >> 8) & 0xff);
  936. usbhid_submit_report(data->hdev, report, USB_DIR_OUT);
  937. spin_unlock_irqrestore(&data->lock, flags);
  938. return count;
  939. }
  940. static DEVICE_ATTR(operation_mode, 0644, picolcd_operation_mode_show,
  941. picolcd_operation_mode_store);
  942. #ifdef CONFIG_DEBUG_FS
  943. /*
  944. * Helper code for HID report level dumping/debugging
  945. */
  946. static const char *error_codes[] = {
  947. "success", "parameter missing", "data_missing", "block readonly",
  948. "block not erasable", "block too big", "section overflow",
  949. "invalid command length", "invalid data length",
  950. };
  951. static void dump_buff_as_hex(char *dst, size_t dst_sz, const u8 *data,
  952. const size_t data_len)
  953. {
  954. int i, j;
  955. for (i = j = 0; i < data_len && j + 3 < dst_sz; i++) {
  956. dst[j++] = hex_asc[(data[i] >> 4) & 0x0f];
  957. dst[j++] = hex_asc[data[i] & 0x0f];
  958. dst[j++] = ' ';
  959. }
  960. if (j < dst_sz) {
  961. dst[j--] = '\0';
  962. dst[j] = '\n';
  963. } else
  964. dst[j] = '\0';
  965. }
  966. static void picolcd_debug_out_report(struct picolcd_data *data,
  967. struct hid_device *hdev, struct hid_report *report)
  968. {
  969. u8 raw_data[70];
  970. int raw_size = (report->size >> 3) + 1;
  971. char *buff;
  972. #define BUFF_SZ 256
  973. /* Avoid unnecessary overhead if debugfs is disabled */
  974. if (!hdev->debug_events)
  975. return;
  976. buff = kmalloc(BUFF_SZ, GFP_ATOMIC);
  977. if (!buff)
  978. return;
  979. snprintf(buff, BUFF_SZ, "\nout report %d (size %d) = ",
  980. report->id, raw_size);
  981. hid_debug_event(hdev, buff);
  982. if (raw_size + 5 > sizeof(raw_data)) {
  983. hid_debug_event(hdev, " TOO BIG\n");
  984. return;
  985. } else {
  986. raw_data[0] = report->id;
  987. hid_output_report(report, raw_data);
  988. dump_buff_as_hex(buff, BUFF_SZ, raw_data, raw_size);
  989. hid_debug_event(hdev, buff);
  990. }
  991. switch (report->id) {
  992. case REPORT_LED_STATE:
  993. /* 1 data byte with GPO state */
  994. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  995. "REPORT_LED_STATE", report->id, raw_size-1);
  996. hid_debug_event(hdev, buff);
  997. snprintf(buff, BUFF_SZ, "\tGPO state: 0x%02x\n", raw_data[1]);
  998. hid_debug_event(hdev, buff);
  999. break;
  1000. case REPORT_BRIGHTNESS:
  1001. /* 1 data byte with brightness */
  1002. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1003. "REPORT_BRIGHTNESS", report->id, raw_size-1);
  1004. hid_debug_event(hdev, buff);
  1005. snprintf(buff, BUFF_SZ, "\tBrightness: 0x%02x\n", raw_data[1]);
  1006. hid_debug_event(hdev, buff);
  1007. break;
  1008. case REPORT_CONTRAST:
  1009. /* 1 data byte with contrast */
  1010. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1011. "REPORT_CONTRAST", report->id, raw_size-1);
  1012. hid_debug_event(hdev, buff);
  1013. snprintf(buff, BUFF_SZ, "\tContrast: 0x%02x\n", raw_data[1]);
  1014. hid_debug_event(hdev, buff);
  1015. break;
  1016. case REPORT_RESET:
  1017. /* 2 data bytes with reset duration in ms */
  1018. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1019. "REPORT_RESET", report->id, raw_size-1);
  1020. hid_debug_event(hdev, buff);
  1021. snprintf(buff, BUFF_SZ, "\tDuration: 0x%02x%02x (%dms)\n",
  1022. raw_data[2], raw_data[1], raw_data[2] << 8 | raw_data[1]);
  1023. hid_debug_event(hdev, buff);
  1024. break;
  1025. case REPORT_LCD_CMD:
  1026. /* 63 data bytes with LCD commands */
  1027. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1028. "REPORT_LCD_CMD", report->id, raw_size-1);
  1029. hid_debug_event(hdev, buff);
  1030. /* TODO: format decoding */
  1031. break;
  1032. case REPORT_LCD_DATA:
  1033. /* 63 data bytes with LCD data */
  1034. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1035. "REPORT_LCD_CMD", report->id, raw_size-1);
  1036. /* TODO: format decoding */
  1037. hid_debug_event(hdev, buff);
  1038. break;
  1039. case REPORT_LCD_CMD_DATA:
  1040. /* 63 data bytes with LCD commands and data */
  1041. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1042. "REPORT_LCD_CMD", report->id, raw_size-1);
  1043. /* TODO: format decoding */
  1044. hid_debug_event(hdev, buff);
  1045. break;
  1046. case REPORT_EE_READ:
  1047. /* 3 data bytes with read area description */
  1048. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1049. "REPORT_EE_READ", report->id, raw_size-1);
  1050. hid_debug_event(hdev, buff);
  1051. snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x\n",
  1052. raw_data[2], raw_data[1]);
  1053. hid_debug_event(hdev, buff);
  1054. snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[3]);
  1055. hid_debug_event(hdev, buff);
  1056. break;
  1057. case REPORT_EE_WRITE:
  1058. /* 3+1..20 data bytes with write area description */
  1059. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1060. "REPORT_EE_WRITE", report->id, raw_size-1);
  1061. hid_debug_event(hdev, buff);
  1062. snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x\n",
  1063. raw_data[2], raw_data[1]);
  1064. hid_debug_event(hdev, buff);
  1065. snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[3]);
  1066. hid_debug_event(hdev, buff);
  1067. if (raw_data[3] == 0) {
  1068. snprintf(buff, BUFF_SZ, "\tNo data\n");
  1069. } else if (raw_data[3] + 4 <= raw_size) {
  1070. snprintf(buff, BUFF_SZ, "\tData: ");
  1071. hid_debug_event(hdev, buff);
  1072. dump_buff_as_hex(buff, BUFF_SZ, raw_data+4, raw_data[3]);
  1073. } else {
  1074. snprintf(buff, BUFF_SZ, "\tData overflowed\n");
  1075. }
  1076. hid_debug_event(hdev, buff);
  1077. break;
  1078. case REPORT_ERASE_MEMORY:
  1079. case REPORT_BL_ERASE_MEMORY:
  1080. /* 3 data bytes with pointer inside erase block */
  1081. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1082. "REPORT_ERASE_MEMORY", report->id, raw_size-1);
  1083. hid_debug_event(hdev, buff);
  1084. switch (data->addr_sz) {
  1085. case 2:
  1086. snprintf(buff, BUFF_SZ, "\tAddress inside 64 byte block: 0x%02x%02x\n",
  1087. raw_data[2], raw_data[1]);
  1088. break;
  1089. case 3:
  1090. snprintf(buff, BUFF_SZ, "\tAddress inside 64 byte block: 0x%02x%02x%02x\n",
  1091. raw_data[3], raw_data[2], raw_data[1]);
  1092. break;
  1093. default:
  1094. snprintf(buff, BUFF_SZ, "\tNot supported\n");
  1095. }
  1096. hid_debug_event(hdev, buff);
  1097. break;
  1098. case REPORT_READ_MEMORY:
  1099. case REPORT_BL_READ_MEMORY:
  1100. /* 4 data bytes with read area description */
  1101. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1102. "REPORT_READ_MEMORY", report->id, raw_size-1);
  1103. hid_debug_event(hdev, buff);
  1104. switch (data->addr_sz) {
  1105. case 2:
  1106. snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x\n",
  1107. raw_data[2], raw_data[1]);
  1108. hid_debug_event(hdev, buff);
  1109. snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[3]);
  1110. break;
  1111. case 3:
  1112. snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x%02x\n",
  1113. raw_data[3], raw_data[2], raw_data[1]);
  1114. hid_debug_event(hdev, buff);
  1115. snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[4]);
  1116. break;
  1117. default:
  1118. snprintf(buff, BUFF_SZ, "\tNot supported\n");
  1119. }
  1120. hid_debug_event(hdev, buff);
  1121. break;
  1122. case REPORT_WRITE_MEMORY:
  1123. case REPORT_BL_WRITE_MEMORY:
  1124. /* 4+1..32 data bytes with write adrea description */
  1125. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1126. "REPORT_WRITE_MEMORY", report->id, raw_size-1);
  1127. hid_debug_event(hdev, buff);
  1128. switch (data->addr_sz) {
  1129. case 2:
  1130. snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x\n",
  1131. raw_data[2], raw_data[1]);
  1132. hid_debug_event(hdev, buff);
  1133. snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[3]);
  1134. hid_debug_event(hdev, buff);
  1135. if (raw_data[3] == 0) {
  1136. snprintf(buff, BUFF_SZ, "\tNo data\n");
  1137. } else if (raw_data[3] + 4 <= raw_size) {
  1138. snprintf(buff, BUFF_SZ, "\tData: ");
  1139. hid_debug_event(hdev, buff);
  1140. dump_buff_as_hex(buff, BUFF_SZ, raw_data+4, raw_data[3]);
  1141. } else {
  1142. snprintf(buff, BUFF_SZ, "\tData overflowed\n");
  1143. }
  1144. break;
  1145. case 3:
  1146. snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x%02x\n",
  1147. raw_data[3], raw_data[2], raw_data[1]);
  1148. hid_debug_event(hdev, buff);
  1149. snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[4]);
  1150. hid_debug_event(hdev, buff);
  1151. if (raw_data[4] == 0) {
  1152. snprintf(buff, BUFF_SZ, "\tNo data\n");
  1153. } else if (raw_data[4] + 5 <= raw_size) {
  1154. snprintf(buff, BUFF_SZ, "\tData: ");
  1155. hid_debug_event(hdev, buff);
  1156. dump_buff_as_hex(buff, BUFF_SZ, raw_data+5, raw_data[4]);
  1157. } else {
  1158. snprintf(buff, BUFF_SZ, "\tData overflowed\n");
  1159. }
  1160. break;
  1161. default:
  1162. snprintf(buff, BUFF_SZ, "\tNot supported\n");
  1163. }
  1164. hid_debug_event(hdev, buff);
  1165. break;
  1166. case REPORT_SPLASH_RESTART:
  1167. /* TODO */
  1168. break;
  1169. case REPORT_EXIT_KEYBOARD:
  1170. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1171. "REPORT_EXIT_KEYBOARD", report->id, raw_size-1);
  1172. hid_debug_event(hdev, buff);
  1173. snprintf(buff, BUFF_SZ, "\tRestart delay: %dms (0x%02x%02x)\n",
  1174. raw_data[1] | (raw_data[2] << 8),
  1175. raw_data[2], raw_data[1]);
  1176. hid_debug_event(hdev, buff);
  1177. break;
  1178. case REPORT_VERSION:
  1179. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1180. "REPORT_VERSION", report->id, raw_size-1);
  1181. hid_debug_event(hdev, buff);
  1182. break;
  1183. case REPORT_DEVID:
  1184. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1185. "REPORT_DEVID", report->id, raw_size-1);
  1186. hid_debug_event(hdev, buff);
  1187. break;
  1188. case REPORT_SPLASH_SIZE:
  1189. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1190. "REPORT_SPLASH_SIZE", report->id, raw_size-1);
  1191. hid_debug_event(hdev, buff);
  1192. break;
  1193. case REPORT_HOOK_VERSION:
  1194. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1195. "REPORT_HOOK_VERSION", report->id, raw_size-1);
  1196. hid_debug_event(hdev, buff);
  1197. break;
  1198. case REPORT_EXIT_FLASHER:
  1199. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1200. "REPORT_VERSION", report->id, raw_size-1);
  1201. hid_debug_event(hdev, buff);
  1202. snprintf(buff, BUFF_SZ, "\tRestart delay: %dms (0x%02x%02x)\n",
  1203. raw_data[1] | (raw_data[2] << 8),
  1204. raw_data[2], raw_data[1]);
  1205. hid_debug_event(hdev, buff);
  1206. break;
  1207. default:
  1208. snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
  1209. "<unknown>", report->id, raw_size-1);
  1210. hid_debug_event(hdev, buff);
  1211. break;
  1212. }
  1213. wake_up_interruptible(&hdev->debug_wait);
  1214. kfree(buff);
  1215. }
  1216. static void picolcd_debug_raw_event(struct picolcd_data *data,
  1217. struct hid_device *hdev, struct hid_report *report,
  1218. u8 *raw_data, int size)
  1219. {
  1220. char *buff;
  1221. #define BUFF_SZ 256
  1222. /* Avoid unnecessary overhead if debugfs is disabled */
  1223. if (!hdev->debug_events)
  1224. return;
  1225. buff = kmalloc(BUFF_SZ, GFP_ATOMIC);
  1226. if (!buff)
  1227. return;
  1228. switch (report->id) {
  1229. case REPORT_ERROR_CODE:
  1230. /* 2 data bytes with affected report and error code */
  1231. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1232. "REPORT_ERROR_CODE", report->id, size-1);
  1233. hid_debug_event(hdev, buff);
  1234. if (raw_data[2] < ARRAY_SIZE(error_codes))
  1235. snprintf(buff, BUFF_SZ, "\tError code 0x%02x (%s) in reply to report 0x%02x\n",
  1236. raw_data[2], error_codes[raw_data[2]], raw_data[1]);
  1237. else
  1238. snprintf(buff, BUFF_SZ, "\tError code 0x%02x in reply to report 0x%02x\n",
  1239. raw_data[2], raw_data[1]);
  1240. hid_debug_event(hdev, buff);
  1241. break;
  1242. case REPORT_KEY_STATE:
  1243. /* 2 data bytes with key state */
  1244. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1245. "REPORT_KEY_STATE", report->id, size-1);
  1246. hid_debug_event(hdev, buff);
  1247. if (raw_data[1] == 0)
  1248. snprintf(buff, BUFF_SZ, "\tNo key pressed\n");
  1249. else if (raw_data[2] == 0)
  1250. snprintf(buff, BUFF_SZ, "\tOne key pressed: 0x%02x (%d)\n",
  1251. raw_data[1], raw_data[1]);
  1252. else
  1253. snprintf(buff, BUFF_SZ, "\tTwo keys pressed: 0x%02x (%d), 0x%02x (%d)\n",
  1254. raw_data[1], raw_data[1], raw_data[2], raw_data[2]);
  1255. hid_debug_event(hdev, buff);
  1256. break;
  1257. case REPORT_IR_DATA:
  1258. /* Up to 20 byes of IR scancode data */
  1259. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1260. "REPORT_IR_DATA", report->id, size-1);
  1261. hid_debug_event(hdev, buff);
  1262. if (raw_data[1] == 0) {
  1263. snprintf(buff, BUFF_SZ, "\tUnexpectedly 0 data length\n");
  1264. hid_debug_event(hdev, buff);
  1265. } else if (raw_data[1] + 1 <= size) {
  1266. snprintf(buff, BUFF_SZ, "\tData length: %d\n\tIR Data: ",
  1267. raw_data[1]-1);
  1268. hid_debug_event(hdev, buff);
  1269. dump_buff_as_hex(buff, BUFF_SZ, raw_data+2, raw_data[1]-1);
  1270. hid_debug_event(hdev, buff);
  1271. } else {
  1272. snprintf(buff, BUFF_SZ, "\tOverflowing data length: %d\n",
  1273. raw_data[1]-1);
  1274. hid_debug_event(hdev, buff);
  1275. }
  1276. break;
  1277. case REPORT_EE_DATA:
  1278. /* Data buffer in response to REPORT_EE_READ or REPORT_EE_WRITE */
  1279. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1280. "REPORT_EE_DATA", report->id, size-1);
  1281. hid_debug_event(hdev, buff);
  1282. snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x\n",
  1283. raw_data[2], raw_data[1]);
  1284. hid_debug_event(hdev, buff);
  1285. snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[3]);
  1286. hid_debug_event(hdev, buff);
  1287. if (raw_data[3] == 0) {
  1288. snprintf(buff, BUFF_SZ, "\tNo data\n");
  1289. hid_debug_event(hdev, buff);
  1290. } else if (raw_data[3] + 4 <= size) {
  1291. snprintf(buff, BUFF_SZ, "\tData: ");
  1292. hid_debug_event(hdev, buff);
  1293. dump_buff_as_hex(buff, BUFF_SZ, raw_data+4, raw_data[3]);
  1294. hid_debug_event(hdev, buff);
  1295. } else {
  1296. snprintf(buff, BUFF_SZ, "\tData overflowed\n");
  1297. hid_debug_event(hdev, buff);
  1298. }
  1299. break;
  1300. case REPORT_MEMORY:
  1301. /* Data buffer in response to REPORT_READ_MEMORY or REPORT_WRTIE_MEMORY */
  1302. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1303. "REPORT_MEMORY", report->id, size-1);
  1304. hid_debug_event(hdev, buff);
  1305. switch (data->addr_sz) {
  1306. case 2:
  1307. snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x\n",
  1308. raw_data[2], raw_data[1]);
  1309. hid_debug_event(hdev, buff);
  1310. snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[3]);
  1311. hid_debug_event(hdev, buff);
  1312. if (raw_data[3] == 0) {
  1313. snprintf(buff, BUFF_SZ, "\tNo data\n");
  1314. } else if (raw_data[3] + 4 <= size) {
  1315. snprintf(buff, BUFF_SZ, "\tData: ");
  1316. hid_debug_event(hdev, buff);
  1317. dump_buff_as_hex(buff, BUFF_SZ, raw_data+4, raw_data[3]);
  1318. } else {
  1319. snprintf(buff, BUFF_SZ, "\tData overflowed\n");
  1320. }
  1321. break;
  1322. case 3:
  1323. snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x%02x\n",
  1324. raw_data[3], raw_data[2], raw_data[1]);
  1325. hid_debug_event(hdev, buff);
  1326. snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[4]);
  1327. hid_debug_event(hdev, buff);
  1328. if (raw_data[4] == 0) {
  1329. snprintf(buff, BUFF_SZ, "\tNo data\n");
  1330. } else if (raw_data[4] + 5 <= size) {
  1331. snprintf(buff, BUFF_SZ, "\tData: ");
  1332. hid_debug_event(hdev, buff);
  1333. dump_buff_as_hex(buff, BUFF_SZ, raw_data+5, raw_data[4]);
  1334. } else {
  1335. snprintf(buff, BUFF_SZ, "\tData overflowed\n");
  1336. }
  1337. break;
  1338. default:
  1339. snprintf(buff, BUFF_SZ, "\tNot supported\n");
  1340. }
  1341. hid_debug_event(hdev, buff);
  1342. break;
  1343. case REPORT_VERSION:
  1344. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1345. "REPORT_VERSION", report->id, size-1);
  1346. hid_debug_event(hdev, buff);
  1347. snprintf(buff, BUFF_SZ, "\tFirmware version: %d.%d\n",
  1348. raw_data[2], raw_data[1]);
  1349. hid_debug_event(hdev, buff);
  1350. break;
  1351. case REPORT_BL_ERASE_MEMORY:
  1352. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1353. "REPORT_BL_ERASE_MEMORY", report->id, size-1);
  1354. hid_debug_event(hdev, buff);
  1355. /* TODO */
  1356. break;
  1357. case REPORT_BL_READ_MEMORY:
  1358. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1359. "REPORT_BL_READ_MEMORY", report->id, size-1);
  1360. hid_debug_event(hdev, buff);
  1361. /* TODO */
  1362. break;
  1363. case REPORT_BL_WRITE_MEMORY:
  1364. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1365. "REPORT_BL_WRITE_MEMORY", report->id, size-1);
  1366. hid_debug_event(hdev, buff);
  1367. /* TODO */
  1368. break;
  1369. case REPORT_DEVID:
  1370. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1371. "REPORT_DEVID", report->id, size-1);
  1372. hid_debug_event(hdev, buff);
  1373. snprintf(buff, BUFF_SZ, "\tSerial: 0x%02x%02x%02x%02x\n",
  1374. raw_data[1], raw_data[2], raw_data[3], raw_data[4]);
  1375. hid_debug_event(hdev, buff);
  1376. snprintf(buff, BUFF_SZ, "\tType: 0x%02x\n",
  1377. raw_data[5]);
  1378. hid_debug_event(hdev, buff);
  1379. break;
  1380. case REPORT_SPLASH_SIZE:
  1381. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1382. "REPORT_SPLASH_SIZE", report->id, size-1);
  1383. hid_debug_event(hdev, buff);
  1384. snprintf(buff, BUFF_SZ, "\tTotal splash space: %d\n",
  1385. (raw_data[2] << 8) | raw_data[1]);
  1386. hid_debug_event(hdev, buff);
  1387. snprintf(buff, BUFF_SZ, "\tUsed splash space: %d\n",
  1388. (raw_data[4] << 8) | raw_data[3]);
  1389. hid_debug_event(hdev, buff);
  1390. break;
  1391. case REPORT_HOOK_VERSION:
  1392. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1393. "REPORT_HOOK_VERSION", report->id, size-1);
  1394. hid_debug_event(hdev, buff);
  1395. snprintf(buff, BUFF_SZ, "\tFirmware version: %d.%d\n",
  1396. raw_data[1], raw_data[2]);
  1397. hid_debug_event(hdev, buff);
  1398. break;
  1399. default:
  1400. snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
  1401. "<unknown>", report->id, size-1);
  1402. hid_debug_event(hdev, buff);
  1403. break;
  1404. }
  1405. wake_up_interruptible(&hdev->debug_wait);
  1406. kfree(buff);
  1407. }
  1408. #else
  1409. #define picolcd_debug_raw_event(data, hdev, report, raw_data, size)
  1410. #endif
  1411. /*
  1412. * Handle raw report as sent by device
  1413. */
  1414. static int picolcd_raw_event(struct hid_device *hdev,
  1415. struct hid_report *report, u8 *raw_data, int size)
  1416. {
  1417. struct picolcd_data *data = hid_get_drvdata(hdev);
  1418. unsigned long flags;
  1419. int ret = 0;
  1420. if (!data)
  1421. return 1;
  1422. if (report->id == REPORT_KEY_STATE) {
  1423. if (data->input_keys)
  1424. ret = picolcd_raw_keypad(data, report, raw_data+1, size-1);
  1425. } else if (report->id == REPORT_IR_DATA) {
  1426. if (data->input_cir)
  1427. ret = picolcd_raw_cir(data, report, raw_data+1, size-1);
  1428. } else {
  1429. spin_lock_irqsave(&data->lock, flags);
  1430. /*
  1431. * We let the caller of picolcd_send_and_wait() check if the
  1432. * report we got is one of the expected ones or not.
  1433. */
  1434. if (data->pending) {
  1435. memcpy(data->pending->raw_data, raw_data+1, size-1);
  1436. data->pending->raw_size = size-1;
  1437. data->pending->in_report = report;
  1438. complete(&data->pending->ready);
  1439. }
  1440. spin_unlock_irqrestore(&data->lock, flags);
  1441. }
  1442. picolcd_debug_raw_event(data, hdev, report, raw_data, size);
  1443. return 1;
  1444. }
  1445. /* initialize keypad input device */
  1446. static int picolcd_init_keys(struct picolcd_data *data,
  1447. struct hid_report *report)
  1448. {
  1449. struct hid_device *hdev = data->hdev;
  1450. struct input_dev *idev;
  1451. int error, i;
  1452. if (!report)
  1453. return -ENODEV;
  1454. if (report->maxfield != 1 || report->field[0]->report_count != 2 ||
  1455. report->field[0]->report_size != 8) {
  1456. dev_err(&hdev->dev, "unsupported KEY_STATE report");
  1457. return -EINVAL;
  1458. }
  1459. idev = input_allocate_device();
  1460. if (idev == NULL) {
  1461. dev_err(&hdev->dev, "failed to allocate input device");
  1462. return -ENOMEM;
  1463. }
  1464. input_set_drvdata(idev, hdev);
  1465. memcpy(data->keycode, def_keymap, sizeof(def_keymap));
  1466. idev->name = hdev->name;
  1467. idev->phys = hdev->phys;
  1468. idev->uniq = hdev->uniq;
  1469. idev->id.bustype = hdev->bus;
  1470. idev->id.vendor = hdev->vendor;
  1471. idev->id.product = hdev->product;
  1472. idev->id.version = hdev->version;
  1473. idev->dev.parent = hdev->dev.parent;
  1474. idev->keycode = &data->keycode;
  1475. idev->keycodemax = PICOLCD_KEYS;
  1476. idev->keycodesize = sizeof(data->keycode[0]);
  1477. input_set_capability(idev, EV_MSC, MSC_SCAN);
  1478. set_bit(EV_REP, idev->evbit);
  1479. for (i = 0; i < PICOLCD_KEYS; i++)
  1480. input_set_capability(idev, EV_KEY, data->keycode[i]);
  1481. error = input_register_device(idev);
  1482. if (error) {
  1483. dev_err(&hdev->dev, "error registering the input device");
  1484. input_free_device(idev);
  1485. return error;
  1486. }
  1487. data->input_keys = idev;
  1488. return 0;
  1489. }
  1490. static void picolcd_exit_keys(struct picolcd_data *data)
  1491. {
  1492. struct input_dev *idev = data->input_keys;
  1493. data->input_keys = NULL;
  1494. if (idev)
  1495. input_unregister_device(idev);
  1496. }
  1497. /* initialize CIR input device */
  1498. static inline int picolcd_init_cir(struct picolcd_data *data, struct hid_report *report)
  1499. {
  1500. /* support not implemented yet */
  1501. return 0;
  1502. }
  1503. static inline void picolcd_exit_cir(struct picolcd_data *data)
  1504. {
  1505. }
  1506. static int picolcd_probe_lcd(struct hid_device *hdev, struct picolcd_data *data)
  1507. {
  1508. struct hid_report *report;
  1509. int error;
  1510. error = picolcd_check_version(hdev);
  1511. if (error)
  1512. return error;
  1513. if (data->version[0] != 0 && data->version[1] != 3)
  1514. dev_info(&hdev->dev, "Device with untested firmware revision, "
  1515. "please submit /sys/kernel/debug/hid/%s/rdesc for this device.\n",
  1516. dev_name(&hdev->dev));
  1517. /* Setup keypad input device */
  1518. error = picolcd_init_keys(data, picolcd_in_report(REPORT_KEY_STATE, hdev));
  1519. if (error)
  1520. goto err;
  1521. /* Setup CIR input device */
  1522. error = picolcd_init_cir(data, picolcd_in_report(REPORT_IR_DATA, hdev));
  1523. if (error)
  1524. goto err;
  1525. /* Set up the framebuffer device */
  1526. error = picolcd_init_framebuffer(data);
  1527. if (error)
  1528. goto err;
  1529. /* Setup backlight class device */
  1530. error = picolcd_init_backlight(data, picolcd_out_report(REPORT_BRIGHTNESS, hdev));
  1531. if (error)
  1532. goto err;
  1533. #ifdef CONFIG_DEBUG_FS
  1534. report = picolcd_out_report(REPORT_READ_MEMORY, hdev);
  1535. if (report && report->maxfield == 1 && report->field[0]->report_size == 8)
  1536. data->addr_sz = report->field[0]->report_count - 1;
  1537. else
  1538. data->addr_sz = -1;
  1539. #endif
  1540. return 0;
  1541. err:
  1542. picolcd_exit_backlight(data);
  1543. picolcd_exit_framebuffer(data);
  1544. picolcd_exit_cir(data);
  1545. picolcd_exit_keys(data);
  1546. return error;
  1547. }
  1548. static int picolcd_probe_bootloader(struct hid_device *hdev, struct picolcd_data *data)
  1549. {
  1550. struct hid_report *report;
  1551. int error;
  1552. error = picolcd_check_version(hdev);
  1553. if (error)
  1554. return error;
  1555. if (data->version[0] != 1 && data->version[1] != 0)
  1556. dev_info(&hdev->dev, "Device with untested bootloader revision, "
  1557. "please submit /sys/kernel/debug/hid/%s/rdesc for this device.\n",
  1558. dev_name(&hdev->dev));
  1559. #ifdef CONFIG_DEBUG_FS
  1560. report = picolcd_out_report(REPORT_BL_READ_MEMORY, hdev);
  1561. if (report && report->maxfield == 1 && report->field[0]->report_size == 8)
  1562. data->addr_sz = report->field[0]->report_count - 1;
  1563. else
  1564. data->addr_sz = -1;
  1565. #endif
  1566. return 0;
  1567. }
  1568. static int picolcd_probe(struct hid_device *hdev,
  1569. const struct hid_device_id *id)
  1570. {
  1571. struct picolcd_data *data;
  1572. int error = -ENOMEM;
  1573. dbg_hid(PICOLCD_NAME " hardware probe...\n");
  1574. /*
  1575. * Let's allocate the picolcd data structure, set some reasonable
  1576. * defaults, and associate it with the device
  1577. */
  1578. data = kzalloc(sizeof(struct picolcd_data), GFP_KERNEL);
  1579. if (data == NULL) {
  1580. dev_err(&hdev->dev, "can't allocate space for Minibox PicoLCD device data\n");
  1581. error = -ENOMEM;
  1582. goto err_no_cleanup;
  1583. }
  1584. spin_lock_init(&data->lock);
  1585. mutex_init(&data->mutex);
  1586. data->hdev = hdev;
  1587. if (hdev->product == USB_DEVICE_ID_PICOLCD_BOOTLOADER)
  1588. data->status |= PICOLCD_BOOTLOADER;
  1589. hid_set_drvdata(hdev, data);
  1590. /* Parse the device reports and start it up */
  1591. error = hid_parse(hdev);
  1592. if (error) {
  1593. dev_err(&hdev->dev, "device report parse failed\n");
  1594. goto err_cleanup_data;
  1595. }
  1596. /* We don't use hidinput but hid_hw_start() fails if nothing is
  1597. * claimed. So spoof claimed input. */
  1598. hdev->claimed = HID_CLAIMED_INPUT;
  1599. error = hid_hw_start(hdev, 0);
  1600. hdev->claimed = 0;
  1601. if (error) {
  1602. dev_err(&hdev->dev, "hardware start failed\n");
  1603. goto err_cleanup_data;
  1604. }
  1605. error = hdev->ll_driver->open(hdev);
  1606. if (error) {
  1607. dev_err(&hdev->dev, "failed to open input interrupt pipe for key and IR events\n");
  1608. goto err_cleanup_hid_hw;
  1609. }
  1610. error = device_create_file(&hdev->dev, &dev_attr_operation_mode);
  1611. if (error) {
  1612. dev_err(&hdev->dev, "failed to create sysfs attributes\n");
  1613. goto err_cleanup_hid_ll;
  1614. }
  1615. if (data->status & PICOLCD_BOOTLOADER)
  1616. error = picolcd_probe_bootloader(hdev, data);
  1617. else
  1618. error = picolcd_probe_lcd(hdev, data);
  1619. if (error)
  1620. goto err_cleanup_sysfs;
  1621. dbg_hid(PICOLCD_NAME " activated and initialized\n");
  1622. return 0;
  1623. err_cleanup_sysfs:
  1624. device_remove_file(&hdev->dev, &dev_attr_operation_mode);
  1625. err_cleanup_hid_ll:
  1626. hdev->ll_driver->close(hdev);
  1627. err_cleanup_hid_hw:
  1628. hid_hw_stop(hdev);
  1629. err_cleanup_data:
  1630. kfree(data);
  1631. err_no_cleanup:
  1632. hid_set_drvdata(hdev, NULL);
  1633. return error;
  1634. }
  1635. static void picolcd_remove(struct hid_device *hdev)
  1636. {
  1637. struct picolcd_data *data = hid_get_drvdata(hdev);
  1638. unsigned long flags;
  1639. dbg_hid(PICOLCD_NAME " hardware remove...\n");
  1640. spin_lock_irqsave(&data->lock, flags);
  1641. data->status |= PICOLCD_FAILED;
  1642. spin_unlock_irqrestore(&data->lock, flags);
  1643. device_remove_file(&hdev->dev, &dev_attr_operation_mode);
  1644. hdev->ll_driver->close(hdev);
  1645. hid_hw_stop(hdev);
  1646. hid_set_drvdata(hdev, NULL);
  1647. /* Shortcut potential pending reply that will never arrive */
  1648. spin_lock_irqsave(&data->lock, flags);
  1649. if (data->pending)
  1650. complete(&data->pending->ready);
  1651. spin_unlock_irqrestore(&data->lock, flags);
  1652. /* Clean up the framebuffer */
  1653. picolcd_exit_backlight(data);
  1654. picolcd_exit_framebuffer(data);
  1655. /* Cleanup input */
  1656. picolcd_exit_cir(data);
  1657. picolcd_exit_keys(data);
  1658. mutex_destroy(&data->mutex);
  1659. /* Finally, clean up the picolcd data itself */
  1660. kfree(data);
  1661. }
  1662. static const struct hid_device_id picolcd_devices[] = {
  1663. { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) },
  1664. { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) },
  1665. { }
  1666. };
  1667. MODULE_DEVICE_TABLE(hid, picolcd_devices);
  1668. static struct hid_driver picolcd_driver = {
  1669. .name = "hid-picolcd",
  1670. .id_table = picolcd_devices,
  1671. .probe = picolcd_probe,
  1672. .remove = picolcd_remove,
  1673. .raw_event = picolcd_raw_event,
  1674. };
  1675. static int __init picolcd_init(void)
  1676. {
  1677. return hid_register_driver(&picolcd_driver);
  1678. }
  1679. static void __exit picolcd_exit(void)
  1680. {
  1681. hid_unregister_driver(&picolcd_driver);
  1682. }
  1683. module_init(picolcd_init);
  1684. module_exit(picolcd_exit);
  1685. MODULE_DESCRIPTION("Minibox graphics PicoLCD Driver");
  1686. MODULE_LICENSE("GPL v2");