hid-picolcd.h (9136B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/*************************************************************************** 3 * Copyright (C) 2010-2012 by Bruno Prémont <bonbons@linux-vserver.org> * 4 * * 5 * Based on Logitech G13 driver (v0.4) * 6 * Copyright (C) 2009 by Rick L. Vinyard, Jr. <rvinyard@cs.nmsu.edu> * 7 * * 8 ***************************************************************************/ 9 10#define PICOLCD_NAME "PicoLCD (graphic)" 11 12/* Report numbers */ 13#define REPORT_ERROR_CODE 0x10 /* LCD: IN[16] */ 14#define ERR_SUCCESS 0x00 15#define ERR_PARAMETER_MISSING 0x01 16#define ERR_DATA_MISSING 0x02 17#define ERR_BLOCK_READ_ONLY 0x03 18#define ERR_BLOCK_NOT_ERASABLE 0x04 19#define ERR_BLOCK_TOO_BIG 0x05 20#define ERR_SECTION_OVERFLOW 0x06 21#define ERR_INVALID_CMD_LEN 0x07 22#define ERR_INVALID_DATA_LEN 0x08 23#define REPORT_KEY_STATE 0x11 /* LCD: IN[2] */ 24#define REPORT_IR_DATA 0x21 /* LCD: IN[63] */ 25#define REPORT_EE_DATA 0x32 /* LCD: IN[63] */ 26#define REPORT_MEMORY 0x41 /* LCD: IN[63] */ 27#define REPORT_LED_STATE 0x81 /* LCD: OUT[1] */ 28#define REPORT_BRIGHTNESS 0x91 /* LCD: OUT[1] */ 29#define REPORT_CONTRAST 0x92 /* LCD: OUT[1] */ 30#define REPORT_RESET 0x93 /* LCD: OUT[2] */ 31#define REPORT_LCD_CMD 0x94 /* LCD: OUT[63] */ 32#define REPORT_LCD_DATA 0x95 /* LCD: OUT[63] */ 33#define REPORT_LCD_CMD_DATA 0x96 /* LCD: OUT[63] */ 34#define REPORT_EE_READ 0xa3 /* LCD: OUT[63] */ 35#define REPORT_EE_WRITE 0xa4 /* LCD: OUT[63] */ 36#define REPORT_ERASE_MEMORY 0xb2 /* LCD: OUT[2] */ 37#define REPORT_READ_MEMORY 0xb3 /* LCD: OUT[3] */ 38#define REPORT_WRITE_MEMORY 0xb4 /* LCD: OUT[63] */ 39#define REPORT_SPLASH_RESTART 0xc1 /* LCD: OUT[1] */ 40#define REPORT_EXIT_KEYBOARD 0xef /* LCD: OUT[2] */ 41#define REPORT_VERSION 0xf1 /* LCD: IN[2],OUT[1] Bootloader: IN[2],OUT[1] */ 42#define REPORT_BL_ERASE_MEMORY 0xf2 /* Bootloader: IN[36],OUT[4] */ 43#define REPORT_BL_READ_MEMORY 0xf3 /* Bootloader: IN[36],OUT[4] */ 44#define REPORT_BL_WRITE_MEMORY 0xf4 /* Bootloader: IN[36],OUT[36] */ 45#define REPORT_DEVID 0xf5 /* LCD: IN[5], OUT[1] Bootloader: IN[5],OUT[1] */ 46#define REPORT_SPLASH_SIZE 0xf6 /* LCD: IN[4], OUT[1] */ 47#define REPORT_HOOK_VERSION 0xf7 /* LCD: IN[2], OUT[1] */ 48#define REPORT_EXIT_FLASHER 0xff /* Bootloader: OUT[2] */ 49 50/* Description of in-progress IO operation, used for operations 51 * that trigger response from device */ 52struct picolcd_pending { 53 struct hid_report *out_report; 54 struct hid_report *in_report; 55 struct completion ready; 56 int raw_size; 57 u8 raw_data[64]; 58}; 59 60 61#define PICOLCD_KEYS 17 62 63/* Per device data structure */ 64struct picolcd_data { 65 struct hid_device *hdev; 66#ifdef CONFIG_DEBUG_FS 67 struct dentry *debug_reset; 68 struct dentry *debug_eeprom; 69 struct dentry *debug_flash; 70 struct mutex mutex_flash; 71 int addr_sz; 72#endif 73 u8 version[2]; 74 unsigned short opmode_delay; 75 /* input stuff */ 76 u8 pressed_keys[2]; 77 struct input_dev *input_keys; 78#ifdef CONFIG_HID_PICOLCD_CIR 79 struct rc_dev *rc_dev; 80#endif 81 unsigned short keycode[PICOLCD_KEYS]; 82 83#ifdef CONFIG_HID_PICOLCD_FB 84 /* Framebuffer stuff */ 85 struct fb_info *fb_info; 86#endif /* CONFIG_HID_PICOLCD_FB */ 87#ifdef CONFIG_HID_PICOLCD_LCD 88 struct lcd_device *lcd; 89 u8 lcd_contrast; 90#endif /* CONFIG_HID_PICOLCD_LCD */ 91#ifdef CONFIG_HID_PICOLCD_BACKLIGHT 92 struct backlight_device *backlight; 93 u8 lcd_brightness; 94 u8 lcd_power; 95#endif /* CONFIG_HID_PICOLCD_BACKLIGHT */ 96#ifdef CONFIG_HID_PICOLCD_LEDS 97 /* LED stuff */ 98 u8 led_state; 99 struct led_classdev *led[8]; 100#endif /* CONFIG_HID_PICOLCD_LEDS */ 101 102 /* Housekeeping stuff */ 103 spinlock_t lock; 104 struct mutex mutex; 105 struct picolcd_pending *pending; 106 int status; 107#define PICOLCD_BOOTLOADER 1 108#define PICOLCD_FAILED 2 109#define PICOLCD_CIR_SHUN 4 110}; 111 112#ifdef CONFIG_HID_PICOLCD_FB 113struct picolcd_fb_data { 114 /* Framebuffer stuff */ 115 spinlock_t lock; 116 struct picolcd_data *picolcd; 117 u8 update_rate; 118 u8 bpp; 119 u8 force; 120 u8 ready; 121 u8 *vbitmap; /* local copy of what was sent to PicoLCD */ 122 u8 *bitmap; /* framebuffer */ 123}; 124#endif /* CONFIG_HID_PICOLCD_FB */ 125 126/* Find a given report */ 127#define picolcd_in_report(id, dev) picolcd_report(id, dev, HID_INPUT_REPORT) 128#define picolcd_out_report(id, dev) picolcd_report(id, dev, HID_OUTPUT_REPORT) 129 130struct hid_report *picolcd_report(int id, struct hid_device *hdev, int dir); 131 132#ifdef CONFIG_DEBUG_FS 133void picolcd_debug_out_report(struct picolcd_data *data, 134 struct hid_device *hdev, struct hid_report *report); 135#define hid_hw_request(a, b, c) \ 136 do { \ 137 picolcd_debug_out_report(hid_get_drvdata(a), a, b); \ 138 hid_hw_request(a, b, c); \ 139 } while (0) 140 141void picolcd_debug_raw_event(struct picolcd_data *data, 142 struct hid_device *hdev, struct hid_report *report, 143 u8 *raw_data, int size); 144 145void picolcd_init_devfs(struct picolcd_data *data, 146 struct hid_report *eeprom_r, struct hid_report *eeprom_w, 147 struct hid_report *flash_r, struct hid_report *flash_w, 148 struct hid_report *reset); 149 150void picolcd_exit_devfs(struct picolcd_data *data); 151#else 152static inline void picolcd_debug_out_report(struct picolcd_data *data, 153 struct hid_device *hdev, struct hid_report *report) 154{ 155} 156static inline void picolcd_debug_raw_event(struct picolcd_data *data, 157 struct hid_device *hdev, struct hid_report *report, 158 u8 *raw_data, int size) 159{ 160} 161static inline void picolcd_init_devfs(struct picolcd_data *data, 162 struct hid_report *eeprom_r, struct hid_report *eeprom_w, 163 struct hid_report *flash_r, struct hid_report *flash_w, 164 struct hid_report *reset) 165{ 166} 167static inline void picolcd_exit_devfs(struct picolcd_data *data) 168{ 169} 170#endif /* CONFIG_DEBUG_FS */ 171 172 173#ifdef CONFIG_HID_PICOLCD_FB 174int picolcd_fb_reset(struct picolcd_data *data, int clear); 175 176int picolcd_init_framebuffer(struct picolcd_data *data); 177 178void picolcd_exit_framebuffer(struct picolcd_data *data); 179 180void picolcd_fb_refresh(struct picolcd_data *data); 181#define picolcd_fbinfo(d) ((d)->fb_info) 182#else 183static inline int picolcd_fb_reset(struct picolcd_data *data, int clear) 184{ 185 return 0; 186} 187static inline int picolcd_init_framebuffer(struct picolcd_data *data) 188{ 189 return 0; 190} 191static inline void picolcd_exit_framebuffer(struct picolcd_data *data) 192{ 193} 194static inline void picolcd_fb_refresh(struct picolcd_data *data) 195{ 196} 197#define picolcd_fbinfo(d) NULL 198#endif /* CONFIG_HID_PICOLCD_FB */ 199 200 201#ifdef CONFIG_HID_PICOLCD_BACKLIGHT 202int picolcd_init_backlight(struct picolcd_data *data, 203 struct hid_report *report); 204 205void picolcd_exit_backlight(struct picolcd_data *data); 206 207int picolcd_resume_backlight(struct picolcd_data *data); 208 209void picolcd_suspend_backlight(struct picolcd_data *data); 210#else 211static inline int picolcd_init_backlight(struct picolcd_data *data, 212 struct hid_report *report) 213{ 214 return 0; 215} 216static inline void picolcd_exit_backlight(struct picolcd_data *data) 217{ 218} 219static inline int picolcd_resume_backlight(struct picolcd_data *data) 220{ 221 return 0; 222} 223static inline void picolcd_suspend_backlight(struct picolcd_data *data) 224{ 225} 226 227#endif /* CONFIG_HID_PICOLCD_BACKLIGHT */ 228 229 230#ifdef CONFIG_HID_PICOLCD_LCD 231int picolcd_init_lcd(struct picolcd_data *data, 232 struct hid_report *report); 233 234void picolcd_exit_lcd(struct picolcd_data *data); 235 236int picolcd_resume_lcd(struct picolcd_data *data); 237#else 238static inline int picolcd_init_lcd(struct picolcd_data *data, 239 struct hid_report *report) 240{ 241 return 0; 242} 243static inline void picolcd_exit_lcd(struct picolcd_data *data) 244{ 245} 246static inline int picolcd_resume_lcd(struct picolcd_data *data) 247{ 248 return 0; 249} 250#endif /* CONFIG_HID_PICOLCD_LCD */ 251 252 253#ifdef CONFIG_HID_PICOLCD_LEDS 254int picolcd_init_leds(struct picolcd_data *data, 255 struct hid_report *report); 256 257void picolcd_exit_leds(struct picolcd_data *data); 258 259void picolcd_leds_set(struct picolcd_data *data); 260#else 261static inline int picolcd_init_leds(struct picolcd_data *data, 262 struct hid_report *report) 263{ 264 return 0; 265} 266static inline void picolcd_exit_leds(struct picolcd_data *data) 267{ 268} 269static inline void picolcd_leds_set(struct picolcd_data *data) 270{ 271} 272#endif /* CONFIG_HID_PICOLCD_LEDS */ 273 274 275#ifdef CONFIG_HID_PICOLCD_CIR 276int picolcd_raw_cir(struct picolcd_data *data, 277 struct hid_report *report, u8 *raw_data, int size); 278 279int picolcd_init_cir(struct picolcd_data *data, struct hid_report *report); 280 281void picolcd_exit_cir(struct picolcd_data *data); 282#else 283static inline int picolcd_raw_cir(struct picolcd_data *data, 284 struct hid_report *report, u8 *raw_data, int size) 285{ 286 return 1; 287} 288static inline int picolcd_init_cir(struct picolcd_data *data, struct hid_report *report) 289{ 290 return 0; 291} 292static inline void picolcd_exit_cir(struct picolcd_data *data) 293{ 294} 295#endif /* CONFIG_HID_PICOLCD_CIR */ 296 297int picolcd_reset(struct hid_device *hdev); 298struct picolcd_pending *picolcd_send_and_wait(struct hid_device *hdev, 299 int report_id, const u8 *raw_data, int size);