hid-picolcd.c 51 KB

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