Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v4.11 2439 lines 63 kB view raw
1/* 2 * Front panel driver for Linux 3 * Copyright (C) 2000-2008, Willy Tarreau <w@1wt.eu> 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License 7 * as published by the Free Software Foundation; either version 8 * 2 of the License, or (at your option) any later version. 9 * 10 * This code drives an LCD module (/dev/lcd), and a keypad (/dev/keypad) 11 * connected to a parallel printer port. 12 * 13 * The LCD module may either be an HD44780-like 8-bit parallel LCD, or a 1-bit 14 * serial module compatible with Samsung's KS0074. The pins may be connected in 15 * any combination, everything is programmable. 16 * 17 * The keypad consists in a matrix of push buttons connecting input pins to 18 * data output pins or to the ground. The combinations have to be hard-coded 19 * in the driver, though several profiles exist and adding new ones is easy. 20 * 21 * Several profiles are provided for commonly found LCD+keypad modules on the 22 * market, such as those found in Nexcom's appliances. 23 * 24 * FIXME: 25 * - the initialization/deinitialization process is very dirty and should 26 * be rewritten. It may even be buggy. 27 * 28 * TODO: 29 * - document 24 keys keyboard (3 rows of 8 cols, 32 diodes + 2 inputs) 30 * - make the LCD a part of a virtual screen of Vx*Vy 31 * - make the inputs list smp-safe 32 * - change the keyboard to a double mapping : signals -> key_id -> values 33 * so that applications can change values without knowing signals 34 * 35 */ 36 37#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 38 39#include <linux/module.h> 40 41#include <linux/types.h> 42#include <linux/errno.h> 43#include <linux/signal.h> 44#include <linux/sched.h> 45#include <linux/spinlock.h> 46#include <linux/interrupt.h> 47#include <linux/miscdevice.h> 48#include <linux/slab.h> 49#include <linux/ioport.h> 50#include <linux/fcntl.h> 51#include <linux/init.h> 52#include <linux/delay.h> 53#include <linux/kernel.h> 54#include <linux/ctype.h> 55#include <linux/parport.h> 56#include <linux/list.h> 57#include <linux/notifier.h> 58#include <linux/reboot.h> 59#include <linux/workqueue.h> 60#include <generated/utsrelease.h> 61 62#include <linux/io.h> 63#include <linux/uaccess.h> 64 65#define LCD_MINOR 156 66#define KEYPAD_MINOR 185 67 68#define LCD_MAXBYTES 256 /* max burst write */ 69 70#define KEYPAD_BUFFER 64 71 72/* poll the keyboard this every second */ 73#define INPUT_POLL_TIME (HZ / 50) 74/* a key starts to repeat after this times INPUT_POLL_TIME */ 75#define KEYPAD_REP_START (10) 76/* a key repeats this times INPUT_POLL_TIME */ 77#define KEYPAD_REP_DELAY (2) 78 79/* keep the light on this many seconds for each flash */ 80#define FLASH_LIGHT_TEMPO (4) 81 82/* converts an r_str() input to an active high, bits string : 000BAOSE */ 83#define PNL_PINPUT(a) ((((unsigned char)(a)) ^ 0x7F) >> 3) 84 85#define PNL_PBUSY 0x80 /* inverted input, active low */ 86#define PNL_PACK 0x40 /* direct input, active low */ 87#define PNL_POUTPA 0x20 /* direct input, active high */ 88#define PNL_PSELECD 0x10 /* direct input, active high */ 89#define PNL_PERRORP 0x08 /* direct input, active low */ 90 91#define PNL_PBIDIR 0x20 /* bi-directional ports */ 92/* high to read data in or-ed with data out */ 93#define PNL_PINTEN 0x10 94#define PNL_PSELECP 0x08 /* inverted output, active low */ 95#define PNL_PINITP 0x04 /* direct output, active low */ 96#define PNL_PAUTOLF 0x02 /* inverted output, active low */ 97#define PNL_PSTROBE 0x01 /* inverted output */ 98 99#define PNL_PD0 0x01 100#define PNL_PD1 0x02 101#define PNL_PD2 0x04 102#define PNL_PD3 0x08 103#define PNL_PD4 0x10 104#define PNL_PD5 0x20 105#define PNL_PD6 0x40 106#define PNL_PD7 0x80 107 108#define PIN_NONE 0 109#define PIN_STROBE 1 110#define PIN_D0 2 111#define PIN_D1 3 112#define PIN_D2 4 113#define PIN_D3 5 114#define PIN_D4 6 115#define PIN_D5 7 116#define PIN_D6 8 117#define PIN_D7 9 118#define PIN_AUTOLF 14 119#define PIN_INITP 16 120#define PIN_SELECP 17 121#define PIN_NOT_SET 127 122 123#define LCD_FLAG_B 0x0004 /* blink on */ 124#define LCD_FLAG_C 0x0008 /* cursor on */ 125#define LCD_FLAG_D 0x0010 /* display on */ 126#define LCD_FLAG_F 0x0020 /* large font mode */ 127#define LCD_FLAG_N 0x0040 /* 2-rows mode */ 128#define LCD_FLAG_L 0x0080 /* backlight enabled */ 129 130/* LCD commands */ 131#define LCD_CMD_DISPLAY_CLEAR 0x01 /* Clear entire display */ 132 133#define LCD_CMD_ENTRY_MODE 0x04 /* Set entry mode */ 134#define LCD_CMD_CURSOR_INC 0x02 /* Increment cursor */ 135 136#define LCD_CMD_DISPLAY_CTRL 0x08 /* Display control */ 137#define LCD_CMD_DISPLAY_ON 0x04 /* Set display on */ 138#define LCD_CMD_CURSOR_ON 0x02 /* Set cursor on */ 139#define LCD_CMD_BLINK_ON 0x01 /* Set blink on */ 140 141#define LCD_CMD_SHIFT 0x10 /* Shift cursor/display */ 142#define LCD_CMD_DISPLAY_SHIFT 0x08 /* Shift display instead of cursor */ 143#define LCD_CMD_SHIFT_RIGHT 0x04 /* Shift display/cursor to the right */ 144 145#define LCD_CMD_FUNCTION_SET 0x20 /* Set function */ 146#define LCD_CMD_DATA_LEN_8BITS 0x10 /* Set data length to 8 bits */ 147#define LCD_CMD_TWO_LINES 0x08 /* Set to two display lines */ 148#define LCD_CMD_FONT_5X10_DOTS 0x04 /* Set char font to 5x10 dots */ 149 150#define LCD_CMD_SET_CGRAM_ADDR 0x40 /* Set char generator RAM address */ 151 152#define LCD_CMD_SET_DDRAM_ADDR 0x80 /* Set display data RAM address */ 153 154#define LCD_ESCAPE_LEN 24 /* max chars for LCD escape command */ 155#define LCD_ESCAPE_CHAR 27 /* use char 27 for escape command */ 156 157#define NOT_SET -1 158 159/* macros to simplify use of the parallel port */ 160#define r_ctr(x) (parport_read_control((x)->port)) 161#define r_dtr(x) (parport_read_data((x)->port)) 162#define r_str(x) (parport_read_status((x)->port)) 163#define w_ctr(x, y) (parport_write_control((x)->port, (y))) 164#define w_dtr(x, y) (parport_write_data((x)->port, (y))) 165 166/* this defines which bits are to be used and which ones to be ignored */ 167/* logical or of the output bits involved in the scan matrix */ 168static __u8 scan_mask_o; 169/* logical or of the input bits involved in the scan matrix */ 170static __u8 scan_mask_i; 171 172enum input_type { 173 INPUT_TYPE_STD, 174 INPUT_TYPE_KBD, 175}; 176 177enum input_state { 178 INPUT_ST_LOW, 179 INPUT_ST_RISING, 180 INPUT_ST_HIGH, 181 INPUT_ST_FALLING, 182}; 183 184struct logical_input { 185 struct list_head list; 186 __u64 mask; 187 __u64 value; 188 enum input_type type; 189 enum input_state state; 190 __u8 rise_time, fall_time; 191 __u8 rise_timer, fall_timer, high_timer; 192 193 union { 194 struct { /* valid when type == INPUT_TYPE_STD */ 195 void (*press_fct)(int); 196 void (*release_fct)(int); 197 int press_data; 198 int release_data; 199 } std; 200 struct { /* valid when type == INPUT_TYPE_KBD */ 201 /* strings can be non null-terminated */ 202 char press_str[sizeof(void *) + sizeof(int)]; 203 char repeat_str[sizeof(void *) + sizeof(int)]; 204 char release_str[sizeof(void *) + sizeof(int)]; 205 } kbd; 206 } u; 207}; 208 209static LIST_HEAD(logical_inputs); /* list of all defined logical inputs */ 210 211/* physical contacts history 212 * Physical contacts are a 45 bits string of 9 groups of 5 bits each. 213 * The 8 lower groups correspond to output bits 0 to 7, and the 9th group 214 * corresponds to the ground. 215 * Within each group, bits are stored in the same order as read on the port : 216 * BAPSE (busy=4, ack=3, paper empty=2, select=1, error=0). 217 * So, each __u64 is represented like this : 218 * 0000000000000000000BAPSEBAPSEBAPSEBAPSEBAPSEBAPSEBAPSEBAPSEBAPSE 219 * <-----unused------><gnd><d07><d06><d05><d04><d03><d02><d01><d00> 220 */ 221 222/* what has just been read from the I/O ports */ 223static __u64 phys_read; 224/* previous phys_read */ 225static __u64 phys_read_prev; 226/* stabilized phys_read (phys_read|phys_read_prev) */ 227static __u64 phys_curr; 228/* previous phys_curr */ 229static __u64 phys_prev; 230/* 0 means that at least one logical signal needs be computed */ 231static char inputs_stable; 232 233/* these variables are specific to the keypad */ 234static struct { 235 bool enabled; 236} keypad; 237 238static char keypad_buffer[KEYPAD_BUFFER]; 239static int keypad_buflen; 240static int keypad_start; 241static char keypressed; 242static wait_queue_head_t keypad_read_wait; 243 244/* lcd-specific variables */ 245static struct { 246 bool enabled; 247 bool initialized; 248 bool must_clear; 249 250 int height; 251 int width; 252 int bwidth; 253 int hwidth; 254 int charset; 255 int proto; 256 257 struct delayed_work bl_work; 258 struct mutex bl_tempo_lock; /* Protects access to bl_tempo */ 259 bool bl_tempo; 260 261 /* TODO: use union here? */ 262 struct { 263 int e; 264 int rs; 265 int rw; 266 int cl; 267 int da; 268 int bl; 269 } pins; 270 271 /* contains the LCD config state */ 272 unsigned long int flags; 273 274 /* Contains the LCD X and Y offset */ 275 struct { 276 unsigned long int x; 277 unsigned long int y; 278 } addr; 279 280 /* Current escape sequence and it's length or -1 if outside */ 281 struct { 282 char buf[LCD_ESCAPE_LEN + 1]; 283 int len; 284 } esc_seq; 285} lcd; 286 287/* Needed only for init */ 288static int selected_lcd_type = NOT_SET; 289 290/* 291 * Bit masks to convert LCD signals to parallel port outputs. 292 * _d_ are values for data port, _c_ are for control port. 293 * [0] = signal OFF, [1] = signal ON, [2] = mask 294 */ 295#define BIT_CLR 0 296#define BIT_SET 1 297#define BIT_MSK 2 298#define BIT_STATES 3 299/* 300 * one entry for each bit on the LCD 301 */ 302#define LCD_BIT_E 0 303#define LCD_BIT_RS 1 304#define LCD_BIT_RW 2 305#define LCD_BIT_BL 3 306#define LCD_BIT_CL 4 307#define LCD_BIT_DA 5 308#define LCD_BITS 6 309 310/* 311 * each bit can be either connected to a DATA or CTRL port 312 */ 313#define LCD_PORT_C 0 314#define LCD_PORT_D 1 315#define LCD_PORTS 2 316 317static unsigned char lcd_bits[LCD_PORTS][LCD_BITS][BIT_STATES]; 318 319/* 320 * LCD protocols 321 */ 322#define LCD_PROTO_PARALLEL 0 323#define LCD_PROTO_SERIAL 1 324#define LCD_PROTO_TI_DA8XX_LCD 2 325 326/* 327 * LCD character sets 328 */ 329#define LCD_CHARSET_NORMAL 0 330#define LCD_CHARSET_KS0074 1 331 332/* 333 * LCD types 334 */ 335#define LCD_TYPE_NONE 0 336#define LCD_TYPE_CUSTOM 1 337#define LCD_TYPE_OLD 2 338#define LCD_TYPE_KS0074 3 339#define LCD_TYPE_HANTRONIX 4 340#define LCD_TYPE_NEXCOM 5 341 342/* 343 * keypad types 344 */ 345#define KEYPAD_TYPE_NONE 0 346#define KEYPAD_TYPE_OLD 1 347#define KEYPAD_TYPE_NEW 2 348#define KEYPAD_TYPE_NEXCOM 3 349 350/* 351 * panel profiles 352 */ 353#define PANEL_PROFILE_CUSTOM 0 354#define PANEL_PROFILE_OLD 1 355#define PANEL_PROFILE_NEW 2 356#define PANEL_PROFILE_HANTRONIX 3 357#define PANEL_PROFILE_NEXCOM 4 358#define PANEL_PROFILE_LARGE 5 359 360/* 361 * Construct custom config from the kernel's configuration 362 */ 363#define DEFAULT_PARPORT 0 364#define DEFAULT_PROFILE PANEL_PROFILE_LARGE 365#define DEFAULT_KEYPAD_TYPE KEYPAD_TYPE_OLD 366#define DEFAULT_LCD_TYPE LCD_TYPE_OLD 367#define DEFAULT_LCD_HEIGHT 2 368#define DEFAULT_LCD_WIDTH 40 369#define DEFAULT_LCD_BWIDTH 40 370#define DEFAULT_LCD_HWIDTH 64 371#define DEFAULT_LCD_CHARSET LCD_CHARSET_NORMAL 372#define DEFAULT_LCD_PROTO LCD_PROTO_PARALLEL 373 374#define DEFAULT_LCD_PIN_E PIN_AUTOLF 375#define DEFAULT_LCD_PIN_RS PIN_SELECP 376#define DEFAULT_LCD_PIN_RW PIN_INITP 377#define DEFAULT_LCD_PIN_SCL PIN_STROBE 378#define DEFAULT_LCD_PIN_SDA PIN_D0 379#define DEFAULT_LCD_PIN_BL PIN_NOT_SET 380 381#ifdef CONFIG_PANEL_PARPORT 382#undef DEFAULT_PARPORT 383#define DEFAULT_PARPORT CONFIG_PANEL_PARPORT 384#endif 385 386#ifdef CONFIG_PANEL_PROFILE 387#undef DEFAULT_PROFILE 388#define DEFAULT_PROFILE CONFIG_PANEL_PROFILE 389#endif 390 391#if DEFAULT_PROFILE == 0 /* custom */ 392#ifdef CONFIG_PANEL_KEYPAD 393#undef DEFAULT_KEYPAD_TYPE 394#define DEFAULT_KEYPAD_TYPE CONFIG_PANEL_KEYPAD 395#endif 396 397#ifdef CONFIG_PANEL_LCD 398#undef DEFAULT_LCD_TYPE 399#define DEFAULT_LCD_TYPE CONFIG_PANEL_LCD 400#endif 401 402#ifdef CONFIG_PANEL_LCD_HEIGHT 403#undef DEFAULT_LCD_HEIGHT 404#define DEFAULT_LCD_HEIGHT CONFIG_PANEL_LCD_HEIGHT 405#endif 406 407#ifdef CONFIG_PANEL_LCD_WIDTH 408#undef DEFAULT_LCD_WIDTH 409#define DEFAULT_LCD_WIDTH CONFIG_PANEL_LCD_WIDTH 410#endif 411 412#ifdef CONFIG_PANEL_LCD_BWIDTH 413#undef DEFAULT_LCD_BWIDTH 414#define DEFAULT_LCD_BWIDTH CONFIG_PANEL_LCD_BWIDTH 415#endif 416 417#ifdef CONFIG_PANEL_LCD_HWIDTH 418#undef DEFAULT_LCD_HWIDTH 419#define DEFAULT_LCD_HWIDTH CONFIG_PANEL_LCD_HWIDTH 420#endif 421 422#ifdef CONFIG_PANEL_LCD_CHARSET 423#undef DEFAULT_LCD_CHARSET 424#define DEFAULT_LCD_CHARSET CONFIG_PANEL_LCD_CHARSET 425#endif 426 427#ifdef CONFIG_PANEL_LCD_PROTO 428#undef DEFAULT_LCD_PROTO 429#define DEFAULT_LCD_PROTO CONFIG_PANEL_LCD_PROTO 430#endif 431 432#ifdef CONFIG_PANEL_LCD_PIN_E 433#undef DEFAULT_LCD_PIN_E 434#define DEFAULT_LCD_PIN_E CONFIG_PANEL_LCD_PIN_E 435#endif 436 437#ifdef CONFIG_PANEL_LCD_PIN_RS 438#undef DEFAULT_LCD_PIN_RS 439#define DEFAULT_LCD_PIN_RS CONFIG_PANEL_LCD_PIN_RS 440#endif 441 442#ifdef CONFIG_PANEL_LCD_PIN_RW 443#undef DEFAULT_LCD_PIN_RW 444#define DEFAULT_LCD_PIN_RW CONFIG_PANEL_LCD_PIN_RW 445#endif 446 447#ifdef CONFIG_PANEL_LCD_PIN_SCL 448#undef DEFAULT_LCD_PIN_SCL 449#define DEFAULT_LCD_PIN_SCL CONFIG_PANEL_LCD_PIN_SCL 450#endif 451 452#ifdef CONFIG_PANEL_LCD_PIN_SDA 453#undef DEFAULT_LCD_PIN_SDA 454#define DEFAULT_LCD_PIN_SDA CONFIG_PANEL_LCD_PIN_SDA 455#endif 456 457#ifdef CONFIG_PANEL_LCD_PIN_BL 458#undef DEFAULT_LCD_PIN_BL 459#define DEFAULT_LCD_PIN_BL CONFIG_PANEL_LCD_PIN_BL 460#endif 461 462#endif /* DEFAULT_PROFILE == 0 */ 463 464/* global variables */ 465 466/* Device single-open policy control */ 467static atomic_t lcd_available = ATOMIC_INIT(1); 468static atomic_t keypad_available = ATOMIC_INIT(1); 469 470static struct pardevice *pprt; 471 472static int keypad_initialized; 473 474static void (*lcd_write_cmd)(int); 475static void (*lcd_write_data)(int); 476static void (*lcd_clear_fast)(void); 477 478static DEFINE_SPINLOCK(pprt_lock); 479static struct timer_list scan_timer; 480 481MODULE_DESCRIPTION("Generic parallel port LCD/Keypad driver"); 482 483static int parport = DEFAULT_PARPORT; 484module_param(parport, int, 0000); 485MODULE_PARM_DESC(parport, "Parallel port index (0=lpt1, 1=lpt2, ...)"); 486 487static int profile = DEFAULT_PROFILE; 488module_param(profile, int, 0000); 489MODULE_PARM_DESC(profile, 490 "1=16x2 old kp; 2=serial 16x2, new kp; 3=16x2 hantronix; " 491 "4=16x2 nexcom; default=40x2, old kp"); 492 493static int keypad_type = NOT_SET; 494module_param(keypad_type, int, 0000); 495MODULE_PARM_DESC(keypad_type, 496 "Keypad type: 0=none, 1=old 6 keys, 2=new 6+1 keys, 3=nexcom 4 keys"); 497 498static int lcd_type = NOT_SET; 499module_param(lcd_type, int, 0000); 500MODULE_PARM_DESC(lcd_type, 501 "LCD type: 0=none, 1=compiled-in, 2=old, 3=serial ks0074, 4=hantronix, 5=nexcom"); 502 503static int lcd_height = NOT_SET; 504module_param(lcd_height, int, 0000); 505MODULE_PARM_DESC(lcd_height, "Number of lines on the LCD"); 506 507static int lcd_width = NOT_SET; 508module_param(lcd_width, int, 0000); 509MODULE_PARM_DESC(lcd_width, "Number of columns on the LCD"); 510 511static int lcd_bwidth = NOT_SET; /* internal buffer width (usually 40) */ 512module_param(lcd_bwidth, int, 0000); 513MODULE_PARM_DESC(lcd_bwidth, "Internal LCD line width (40)"); 514 515static int lcd_hwidth = NOT_SET; /* hardware buffer width (usually 64) */ 516module_param(lcd_hwidth, int, 0000); 517MODULE_PARM_DESC(lcd_hwidth, "LCD line hardware address (64)"); 518 519static int lcd_charset = NOT_SET; 520module_param(lcd_charset, int, 0000); 521MODULE_PARM_DESC(lcd_charset, "LCD character set: 0=standard, 1=KS0074"); 522 523static int lcd_proto = NOT_SET; 524module_param(lcd_proto, int, 0000); 525MODULE_PARM_DESC(lcd_proto, 526 "LCD communication: 0=parallel (//), 1=serial, 2=TI LCD Interface"); 527 528/* 529 * These are the parallel port pins the LCD control signals are connected to. 530 * Set this to 0 if the signal is not used. Set it to its opposite value 531 * (negative) if the signal is negated. -MAXINT is used to indicate that the 532 * pin has not been explicitly specified. 533 * 534 * WARNING! no check will be performed about collisions with keypad ! 535 */ 536 537static int lcd_e_pin = PIN_NOT_SET; 538module_param(lcd_e_pin, int, 0000); 539MODULE_PARM_DESC(lcd_e_pin, 540 "# of the // port pin connected to LCD 'E' signal, with polarity (-17..17)"); 541 542static int lcd_rs_pin = PIN_NOT_SET; 543module_param(lcd_rs_pin, int, 0000); 544MODULE_PARM_DESC(lcd_rs_pin, 545 "# of the // port pin connected to LCD 'RS' signal, with polarity (-17..17)"); 546 547static int lcd_rw_pin = PIN_NOT_SET; 548module_param(lcd_rw_pin, int, 0000); 549MODULE_PARM_DESC(lcd_rw_pin, 550 "# of the // port pin connected to LCD 'RW' signal, with polarity (-17..17)"); 551 552static int lcd_cl_pin = PIN_NOT_SET; 553module_param(lcd_cl_pin, int, 0000); 554MODULE_PARM_DESC(lcd_cl_pin, 555 "# of the // port pin connected to serial LCD 'SCL' signal, with polarity (-17..17)"); 556 557static int lcd_da_pin = PIN_NOT_SET; 558module_param(lcd_da_pin, int, 0000); 559MODULE_PARM_DESC(lcd_da_pin, 560 "# of the // port pin connected to serial LCD 'SDA' signal, with polarity (-17..17)"); 561 562static int lcd_bl_pin = PIN_NOT_SET; 563module_param(lcd_bl_pin, int, 0000); 564MODULE_PARM_DESC(lcd_bl_pin, 565 "# of the // port pin connected to LCD backlight, with polarity (-17..17)"); 566 567/* Deprecated module parameters - consider not using them anymore */ 568 569static int lcd_enabled = NOT_SET; 570module_param(lcd_enabled, int, 0000); 571MODULE_PARM_DESC(lcd_enabled, "Deprecated option, use lcd_type instead"); 572 573static int keypad_enabled = NOT_SET; 574module_param(keypad_enabled, int, 0000); 575MODULE_PARM_DESC(keypad_enabled, "Deprecated option, use keypad_type instead"); 576 577static const unsigned char *lcd_char_conv; 578 579/* for some LCD drivers (ks0074) we need a charset conversion table. */ 580static const unsigned char lcd_char_conv_ks0074[256] = { 581 /* 0|8 1|9 2|A 3|B 4|C 5|D 6|E 7|F */ 582 /* 0x00 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 583 /* 0x08 */ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 584 /* 0x10 */ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 585 /* 0x18 */ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 586 /* 0x20 */ 0x20, 0x21, 0x22, 0x23, 0xa2, 0x25, 0x26, 0x27, 587 /* 0x28 */ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 588 /* 0x30 */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 589 /* 0x38 */ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 590 /* 0x40 */ 0xa0, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 591 /* 0x48 */ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 592 /* 0x50 */ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 593 /* 0x58 */ 0x58, 0x59, 0x5a, 0xfa, 0xfb, 0xfc, 0x1d, 0xc4, 594 /* 0x60 */ 0x96, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 595 /* 0x68 */ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 596 /* 0x70 */ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 597 /* 0x78 */ 0x78, 0x79, 0x7a, 0xfd, 0xfe, 0xff, 0xce, 0x20, 598 /* 0x80 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 599 /* 0x88 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 600 /* 0x90 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 601 /* 0x98 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 602 /* 0xA0 */ 0x20, 0x40, 0xb1, 0xa1, 0x24, 0xa3, 0xfe, 0x5f, 603 /* 0xA8 */ 0x22, 0xc8, 0x61, 0x14, 0x97, 0x2d, 0xad, 0x96, 604 /* 0xB0 */ 0x80, 0x8c, 0x82, 0x83, 0x27, 0x8f, 0x86, 0xdd, 605 /* 0xB8 */ 0x2c, 0x81, 0x6f, 0x15, 0x8b, 0x8a, 0x84, 0x60, 606 /* 0xC0 */ 0xe2, 0xe2, 0xe2, 0x5b, 0x5b, 0xae, 0xbc, 0xa9, 607 /* 0xC8 */ 0xc5, 0xbf, 0xc6, 0xf1, 0xe3, 0xe3, 0xe3, 0xe3, 608 /* 0xD0 */ 0x44, 0x5d, 0xa8, 0xe4, 0xec, 0xec, 0x5c, 0x78, 609 /* 0xD8 */ 0xab, 0xa6, 0xe5, 0x5e, 0x5e, 0xe6, 0xaa, 0xbe, 610 /* 0xE0 */ 0x7f, 0xe7, 0xaf, 0x7b, 0x7b, 0xaf, 0xbd, 0xc8, 611 /* 0xE8 */ 0xa4, 0xa5, 0xc7, 0xf6, 0xa7, 0xe8, 0x69, 0x69, 612 /* 0xF0 */ 0xed, 0x7d, 0xa8, 0xe4, 0xec, 0x5c, 0x5c, 0x25, 613 /* 0xF8 */ 0xac, 0xa6, 0xea, 0xef, 0x7e, 0xeb, 0xb2, 0x79, 614}; 615 616static const char old_keypad_profile[][4][9] = { 617 {"S0", "Left\n", "Left\n", ""}, 618 {"S1", "Down\n", "Down\n", ""}, 619 {"S2", "Up\n", "Up\n", ""}, 620 {"S3", "Right\n", "Right\n", ""}, 621 {"S4", "Esc\n", "Esc\n", ""}, 622 {"S5", "Ret\n", "Ret\n", ""}, 623 {"", "", "", ""} 624}; 625 626/* signals, press, repeat, release */ 627static const char new_keypad_profile[][4][9] = { 628 {"S0", "Left\n", "Left\n", ""}, 629 {"S1", "Down\n", "Down\n", ""}, 630 {"S2", "Up\n", "Up\n", ""}, 631 {"S3", "Right\n", "Right\n", ""}, 632 {"S4s5", "", "Esc\n", "Esc\n"}, 633 {"s4S5", "", "Ret\n", "Ret\n"}, 634 {"S4S5", "Help\n", "", ""}, 635 /* add new signals above this line */ 636 {"", "", "", ""} 637}; 638 639/* signals, press, repeat, release */ 640static const char nexcom_keypad_profile[][4][9] = { 641 {"a-p-e-", "Down\n", "Down\n", ""}, 642 {"a-p-E-", "Ret\n", "Ret\n", ""}, 643 {"a-P-E-", "Esc\n", "Esc\n", ""}, 644 {"a-P-e-", "Up\n", "Up\n", ""}, 645 /* add new signals above this line */ 646 {"", "", "", ""} 647}; 648 649static const char (*keypad_profile)[4][9] = old_keypad_profile; 650 651static DECLARE_BITMAP(bits, LCD_BITS); 652 653static void lcd_get_bits(unsigned int port, int *val) 654{ 655 unsigned int bit, state; 656 657 for (bit = 0; bit < LCD_BITS; bit++) { 658 state = test_bit(bit, bits) ? BIT_SET : BIT_CLR; 659 *val &= lcd_bits[port][bit][BIT_MSK]; 660 *val |= lcd_bits[port][bit][state]; 661 } 662} 663 664/* sets data port bits according to current signals values */ 665static int set_data_bits(void) 666{ 667 int val; 668 669 val = r_dtr(pprt); 670 lcd_get_bits(LCD_PORT_D, &val); 671 w_dtr(pprt, val); 672 return val; 673} 674 675/* sets ctrl port bits according to current signals values */ 676static int set_ctrl_bits(void) 677{ 678 int val; 679 680 val = r_ctr(pprt); 681 lcd_get_bits(LCD_PORT_C, &val); 682 w_ctr(pprt, val); 683 return val; 684} 685 686/* sets ctrl & data port bits according to current signals values */ 687static void panel_set_bits(void) 688{ 689 set_data_bits(); 690 set_ctrl_bits(); 691} 692 693/* 694 * Converts a parallel port pin (from -25 to 25) to data and control ports 695 * masks, and data and control port bits. The signal will be considered 696 * unconnected if it's on pin 0 or an invalid pin (<-25 or >25). 697 * 698 * Result will be used this way : 699 * out(dport, in(dport) & d_val[2] | d_val[signal_state]) 700 * out(cport, in(cport) & c_val[2] | c_val[signal_state]) 701 */ 702static void pin_to_bits(int pin, unsigned char *d_val, unsigned char *c_val) 703{ 704 int d_bit, c_bit, inv; 705 706 d_val[0] = 0; 707 c_val[0] = 0; 708 d_val[1] = 0; 709 c_val[1] = 0; 710 d_val[2] = 0xFF; 711 c_val[2] = 0xFF; 712 713 if (pin == 0) 714 return; 715 716 inv = (pin < 0); 717 if (inv) 718 pin = -pin; 719 720 d_bit = 0; 721 c_bit = 0; 722 723 switch (pin) { 724 case PIN_STROBE: /* strobe, inverted */ 725 c_bit = PNL_PSTROBE; 726 inv = !inv; 727 break; 728 case PIN_D0...PIN_D7: /* D0 - D7 = 2 - 9 */ 729 d_bit = 1 << (pin - 2); 730 break; 731 case PIN_AUTOLF: /* autofeed, inverted */ 732 c_bit = PNL_PAUTOLF; 733 inv = !inv; 734 break; 735 case PIN_INITP: /* init, direct */ 736 c_bit = PNL_PINITP; 737 break; 738 case PIN_SELECP: /* select_in, inverted */ 739 c_bit = PNL_PSELECP; 740 inv = !inv; 741 break; 742 default: /* unknown pin, ignore */ 743 break; 744 } 745 746 if (c_bit) { 747 c_val[2] &= ~c_bit; 748 c_val[!inv] = c_bit; 749 } else if (d_bit) { 750 d_val[2] &= ~d_bit; 751 d_val[!inv] = d_bit; 752 } 753} 754 755/* sleeps that many milliseconds with a reschedule */ 756static void long_sleep(int ms) 757{ 758 if (in_interrupt()) 759 mdelay(ms); 760 else 761 schedule_timeout_interruptible(msecs_to_jiffies(ms)); 762} 763 764/* 765 * send a serial byte to the LCD panel. The caller is responsible for locking 766 * if needed. 767 */ 768static void lcd_send_serial(int byte) 769{ 770 int bit; 771 772 /* 773 * the data bit is set on D0, and the clock on STROBE. 774 * LCD reads D0 on STROBE's rising edge. 775 */ 776 for (bit = 0; bit < 8; bit++) { 777 clear_bit(LCD_BIT_CL, bits); /* CLK low */ 778 panel_set_bits(); 779 if (byte & 1) { 780 set_bit(LCD_BIT_DA, bits); 781 } else { 782 clear_bit(LCD_BIT_DA, bits); 783 } 784 785 panel_set_bits(); 786 udelay(2); /* maintain the data during 2 us before CLK up */ 787 set_bit(LCD_BIT_CL, bits); /* CLK high */ 788 panel_set_bits(); 789 udelay(1); /* maintain the strobe during 1 us */ 790 byte >>= 1; 791 } 792} 793 794/* turn the backlight on or off */ 795static void __lcd_backlight(int on) 796{ 797 /* The backlight is activated by setting the AUTOFEED line to +5V */ 798 spin_lock_irq(&pprt_lock); 799 if (on) 800 set_bit(LCD_BIT_BL, bits); 801 else 802 clear_bit(LCD_BIT_BL, bits); 803 panel_set_bits(); 804 spin_unlock_irq(&pprt_lock); 805} 806 807static void lcd_backlight(int on) 808{ 809 if (lcd.pins.bl == PIN_NONE) 810 return; 811 812 mutex_lock(&lcd.bl_tempo_lock); 813 if (!lcd.bl_tempo) 814 __lcd_backlight(on); 815 mutex_unlock(&lcd.bl_tempo_lock); 816} 817 818static void lcd_bl_off(struct work_struct *work) 819{ 820 mutex_lock(&lcd.bl_tempo_lock); 821 if (lcd.bl_tempo) { 822 lcd.bl_tempo = false; 823 if (!(lcd.flags & LCD_FLAG_L)) 824 __lcd_backlight(0); 825 } 826 mutex_unlock(&lcd.bl_tempo_lock); 827} 828 829/* turn the backlight on for a little while */ 830static void lcd_poke(void) 831{ 832 if (lcd.pins.bl == PIN_NONE) 833 return; 834 835 cancel_delayed_work_sync(&lcd.bl_work); 836 837 mutex_lock(&lcd.bl_tempo_lock); 838 if (!lcd.bl_tempo && !(lcd.flags & LCD_FLAG_L)) 839 __lcd_backlight(1); 840 lcd.bl_tempo = true; 841 schedule_delayed_work(&lcd.bl_work, FLASH_LIGHT_TEMPO * HZ); 842 mutex_unlock(&lcd.bl_tempo_lock); 843} 844 845/* send a command to the LCD panel in serial mode */ 846static void lcd_write_cmd_s(int cmd) 847{ 848 spin_lock_irq(&pprt_lock); 849 lcd_send_serial(0x1F); /* R/W=W, RS=0 */ 850 lcd_send_serial(cmd & 0x0F); 851 lcd_send_serial((cmd >> 4) & 0x0F); 852 udelay(40); /* the shortest command takes at least 40 us */ 853 spin_unlock_irq(&pprt_lock); 854} 855 856/* send data to the LCD panel in serial mode */ 857static void lcd_write_data_s(int data) 858{ 859 spin_lock_irq(&pprt_lock); 860 lcd_send_serial(0x5F); /* R/W=W, RS=1 */ 861 lcd_send_serial(data & 0x0F); 862 lcd_send_serial((data >> 4) & 0x0F); 863 udelay(40); /* the shortest data takes at least 40 us */ 864 spin_unlock_irq(&pprt_lock); 865} 866 867/* send a command to the LCD panel in 8 bits parallel mode */ 868static void lcd_write_cmd_p8(int cmd) 869{ 870 spin_lock_irq(&pprt_lock); 871 /* present the data to the data port */ 872 w_dtr(pprt, cmd); 873 udelay(20); /* maintain the data during 20 us before the strobe */ 874 875 set_bit(LCD_BIT_E, bits); 876 clear_bit(LCD_BIT_RS, bits); 877 clear_bit(LCD_BIT_RW, bits); 878 set_ctrl_bits(); 879 880 udelay(40); /* maintain the strobe during 40 us */ 881 882 clear_bit(LCD_BIT_E, bits); 883 set_ctrl_bits(); 884 885 udelay(120); /* the shortest command takes at least 120 us */ 886 spin_unlock_irq(&pprt_lock); 887} 888 889/* send data to the LCD panel in 8 bits parallel mode */ 890static void lcd_write_data_p8(int data) 891{ 892 spin_lock_irq(&pprt_lock); 893 /* present the data to the data port */ 894 w_dtr(pprt, data); 895 udelay(20); /* maintain the data during 20 us before the strobe */ 896 897 set_bit(LCD_BIT_E, bits); 898 set_bit(LCD_BIT_RS, bits); 899 clear_bit(LCD_BIT_RW, bits); 900 set_ctrl_bits(); 901 902 udelay(40); /* maintain the strobe during 40 us */ 903 904 clear_bit(LCD_BIT_E, bits); 905 set_ctrl_bits(); 906 907 udelay(45); /* the shortest data takes at least 45 us */ 908 spin_unlock_irq(&pprt_lock); 909} 910 911/* send a command to the TI LCD panel */ 912static void lcd_write_cmd_tilcd(int cmd) 913{ 914 spin_lock_irq(&pprt_lock); 915 /* present the data to the control port */ 916 w_ctr(pprt, cmd); 917 udelay(60); 918 spin_unlock_irq(&pprt_lock); 919} 920 921/* send data to the TI LCD panel */ 922static void lcd_write_data_tilcd(int data) 923{ 924 spin_lock_irq(&pprt_lock); 925 /* present the data to the data port */ 926 w_dtr(pprt, data); 927 udelay(60); 928 spin_unlock_irq(&pprt_lock); 929} 930 931static void lcd_gotoxy(void) 932{ 933 lcd_write_cmd(LCD_CMD_SET_DDRAM_ADDR 934 | (lcd.addr.y ? lcd.hwidth : 0) 935 /* 936 * we force the cursor to stay at the end of the 937 * line if it wants to go farther 938 */ 939 | ((lcd.addr.x < lcd.bwidth) ? lcd.addr.x & 940 (lcd.hwidth - 1) : lcd.bwidth - 1)); 941} 942 943static void lcd_home(void) 944{ 945 lcd.addr.x = 0; 946 lcd.addr.y = 0; 947 lcd_gotoxy(); 948} 949 950static void lcd_print(char c) 951{ 952 if (lcd.addr.x < lcd.bwidth) { 953 if (lcd_char_conv) 954 c = lcd_char_conv[(unsigned char)c]; 955 lcd_write_data(c); 956 lcd.addr.x++; 957 } 958 /* prevents the cursor from wrapping onto the next line */ 959 if (lcd.addr.x == lcd.bwidth) 960 lcd_gotoxy(); 961} 962 963/* fills the display with spaces and resets X/Y */ 964static void lcd_clear_fast_s(void) 965{ 966 int pos; 967 968 lcd_home(); 969 970 spin_lock_irq(&pprt_lock); 971 for (pos = 0; pos < lcd.height * lcd.hwidth; pos++) { 972 lcd_send_serial(0x5F); /* R/W=W, RS=1 */ 973 lcd_send_serial(' ' & 0x0F); 974 lcd_send_serial((' ' >> 4) & 0x0F); 975 /* the shortest data takes at least 40 us */ 976 udelay(40); 977 } 978 spin_unlock_irq(&pprt_lock); 979 980 lcd_home(); 981} 982 983/* fills the display with spaces and resets X/Y */ 984static void lcd_clear_fast_p8(void) 985{ 986 int pos; 987 988 lcd_home(); 989 990 spin_lock_irq(&pprt_lock); 991 for (pos = 0; pos < lcd.height * lcd.hwidth; pos++) { 992 /* present the data to the data port */ 993 w_dtr(pprt, ' '); 994 995 /* maintain the data during 20 us before the strobe */ 996 udelay(20); 997 998 set_bit(LCD_BIT_E, bits); 999 set_bit(LCD_BIT_RS, bits); 1000 clear_bit(LCD_BIT_RW, bits); 1001 set_ctrl_bits(); 1002 1003 /* maintain the strobe during 40 us */ 1004 udelay(40); 1005 1006 clear_bit(LCD_BIT_E, bits); 1007 set_ctrl_bits(); 1008 1009 /* the shortest data takes at least 45 us */ 1010 udelay(45); 1011 } 1012 spin_unlock_irq(&pprt_lock); 1013 1014 lcd_home(); 1015} 1016 1017/* fills the display with spaces and resets X/Y */ 1018static void lcd_clear_fast_tilcd(void) 1019{ 1020 int pos; 1021 1022 lcd_home(); 1023 1024 spin_lock_irq(&pprt_lock); 1025 for (pos = 0; pos < lcd.height * lcd.hwidth; pos++) { 1026 /* present the data to the data port */ 1027 w_dtr(pprt, ' '); 1028 udelay(60); 1029 } 1030 1031 spin_unlock_irq(&pprt_lock); 1032 1033 lcd_home(); 1034} 1035 1036/* clears the display and resets X/Y */ 1037static void lcd_clear_display(void) 1038{ 1039 lcd_write_cmd(LCD_CMD_DISPLAY_CLEAR); 1040 lcd.addr.x = 0; 1041 lcd.addr.y = 0; 1042 /* we must wait a few milliseconds (15) */ 1043 long_sleep(15); 1044} 1045 1046static void lcd_init_display(void) 1047{ 1048 lcd.flags = ((lcd.height > 1) ? LCD_FLAG_N : 0) 1049 | LCD_FLAG_D | LCD_FLAG_C | LCD_FLAG_B; 1050 1051 long_sleep(20); /* wait 20 ms after power-up for the paranoid */ 1052 1053 /* 8bits, 1 line, small fonts; let's do it 3 times */ 1054 lcd_write_cmd(LCD_CMD_FUNCTION_SET | LCD_CMD_DATA_LEN_8BITS); 1055 long_sleep(10); 1056 lcd_write_cmd(LCD_CMD_FUNCTION_SET | LCD_CMD_DATA_LEN_8BITS); 1057 long_sleep(10); 1058 lcd_write_cmd(LCD_CMD_FUNCTION_SET | LCD_CMD_DATA_LEN_8BITS); 1059 long_sleep(10); 1060 1061 /* set font height and lines number */ 1062 lcd_write_cmd(LCD_CMD_FUNCTION_SET | LCD_CMD_DATA_LEN_8BITS 1063 | ((lcd.flags & LCD_FLAG_F) ? LCD_CMD_FONT_5X10_DOTS : 0) 1064 | ((lcd.flags & LCD_FLAG_N) ? LCD_CMD_TWO_LINES : 0) 1065 ); 1066 long_sleep(10); 1067 1068 /* display off, cursor off, blink off */ 1069 lcd_write_cmd(LCD_CMD_DISPLAY_CTRL); 1070 long_sleep(10); 1071 1072 lcd_write_cmd(LCD_CMD_DISPLAY_CTRL /* set display mode */ 1073 | ((lcd.flags & LCD_FLAG_D) ? LCD_CMD_DISPLAY_ON : 0) 1074 | ((lcd.flags & LCD_FLAG_C) ? LCD_CMD_CURSOR_ON : 0) 1075 | ((lcd.flags & LCD_FLAG_B) ? LCD_CMD_BLINK_ON : 0) 1076 ); 1077 1078 lcd_backlight((lcd.flags & LCD_FLAG_L) ? 1 : 0); 1079 1080 long_sleep(10); 1081 1082 /* entry mode set : increment, cursor shifting */ 1083 lcd_write_cmd(LCD_CMD_ENTRY_MODE | LCD_CMD_CURSOR_INC); 1084 1085 lcd_clear_display(); 1086} 1087 1088/* 1089 * These are the file operation function for user access to /dev/lcd 1090 * This function can also be called from inside the kernel, by 1091 * setting file and ppos to NULL. 1092 * 1093 */ 1094 1095static inline int handle_lcd_special_code(void) 1096{ 1097 /* LCD special codes */ 1098 1099 int processed = 0; 1100 1101 char *esc = lcd.esc_seq.buf + 2; 1102 int oldflags = lcd.flags; 1103 1104 /* check for display mode flags */ 1105 switch (*esc) { 1106 case 'D': /* Display ON */ 1107 lcd.flags |= LCD_FLAG_D; 1108 processed = 1; 1109 break; 1110 case 'd': /* Display OFF */ 1111 lcd.flags &= ~LCD_FLAG_D; 1112 processed = 1; 1113 break; 1114 case 'C': /* Cursor ON */ 1115 lcd.flags |= LCD_FLAG_C; 1116 processed = 1; 1117 break; 1118 case 'c': /* Cursor OFF */ 1119 lcd.flags &= ~LCD_FLAG_C; 1120 processed = 1; 1121 break; 1122 case 'B': /* Blink ON */ 1123 lcd.flags |= LCD_FLAG_B; 1124 processed = 1; 1125 break; 1126 case 'b': /* Blink OFF */ 1127 lcd.flags &= ~LCD_FLAG_B; 1128 processed = 1; 1129 break; 1130 case '+': /* Back light ON */ 1131 lcd.flags |= LCD_FLAG_L; 1132 processed = 1; 1133 break; 1134 case '-': /* Back light OFF */ 1135 lcd.flags &= ~LCD_FLAG_L; 1136 processed = 1; 1137 break; 1138 case '*': 1139 /* flash back light */ 1140 lcd_poke(); 1141 processed = 1; 1142 break; 1143 case 'f': /* Small Font */ 1144 lcd.flags &= ~LCD_FLAG_F; 1145 processed = 1; 1146 break; 1147 case 'F': /* Large Font */ 1148 lcd.flags |= LCD_FLAG_F; 1149 processed = 1; 1150 break; 1151 case 'n': /* One Line */ 1152 lcd.flags &= ~LCD_FLAG_N; 1153 processed = 1; 1154 break; 1155 case 'N': /* Two Lines */ 1156 lcd.flags |= LCD_FLAG_N; 1157 break; 1158 case 'l': /* Shift Cursor Left */ 1159 if (lcd.addr.x > 0) { 1160 /* back one char if not at end of line */ 1161 if (lcd.addr.x < lcd.bwidth) 1162 lcd_write_cmd(LCD_CMD_SHIFT); 1163 lcd.addr.x--; 1164 } 1165 processed = 1; 1166 break; 1167 case 'r': /* shift cursor right */ 1168 if (lcd.addr.x < lcd.width) { 1169 /* allow the cursor to pass the end of the line */ 1170 if (lcd.addr.x < (lcd.bwidth - 1)) 1171 lcd_write_cmd(LCD_CMD_SHIFT | 1172 LCD_CMD_SHIFT_RIGHT); 1173 lcd.addr.x++; 1174 } 1175 processed = 1; 1176 break; 1177 case 'L': /* shift display left */ 1178 lcd_write_cmd(LCD_CMD_SHIFT | LCD_CMD_DISPLAY_SHIFT); 1179 processed = 1; 1180 break; 1181 case 'R': /* shift display right */ 1182 lcd_write_cmd(LCD_CMD_SHIFT | LCD_CMD_DISPLAY_SHIFT | 1183 LCD_CMD_SHIFT_RIGHT); 1184 processed = 1; 1185 break; 1186 case 'k': { /* kill end of line */ 1187 int x; 1188 1189 for (x = lcd.addr.x; x < lcd.bwidth; x++) 1190 lcd_write_data(' '); 1191 1192 /* restore cursor position */ 1193 lcd_gotoxy(); 1194 processed = 1; 1195 break; 1196 } 1197 case 'I': /* reinitialize display */ 1198 lcd_init_display(); 1199 processed = 1; 1200 break; 1201 case 'G': { 1202 /* Generator : LGcxxxxx...xx; must have <c> between '0' 1203 * and '7', representing the numerical ASCII code of the 1204 * redefined character, and <xx...xx> a sequence of 16 1205 * hex digits representing 8 bytes for each character. 1206 * Most LCDs will only use 5 lower bits of the 7 first 1207 * bytes. 1208 */ 1209 1210 unsigned char cgbytes[8]; 1211 unsigned char cgaddr; 1212 int cgoffset; 1213 int shift; 1214 char value; 1215 int addr; 1216 1217 if (!strchr(esc, ';')) 1218 break; 1219 1220 esc++; 1221 1222 cgaddr = *(esc++) - '0'; 1223 if (cgaddr > 7) { 1224 processed = 1; 1225 break; 1226 } 1227 1228 cgoffset = 0; 1229 shift = 0; 1230 value = 0; 1231 while (*esc && cgoffset < 8) { 1232 shift ^= 4; 1233 if (*esc >= '0' && *esc <= '9') { 1234 value |= (*esc - '0') << shift; 1235 } else if (*esc >= 'A' && *esc <= 'Z') { 1236 value |= (*esc - 'A' + 10) << shift; 1237 } else if (*esc >= 'a' && *esc <= 'z') { 1238 value |= (*esc - 'a' + 10) << shift; 1239 } else { 1240 esc++; 1241 continue; 1242 } 1243 1244 if (shift == 0) { 1245 cgbytes[cgoffset++] = value; 1246 value = 0; 1247 } 1248 1249 esc++; 1250 } 1251 1252 lcd_write_cmd(LCD_CMD_SET_CGRAM_ADDR | (cgaddr * 8)); 1253 for (addr = 0; addr < cgoffset; addr++) 1254 lcd_write_data(cgbytes[addr]); 1255 1256 /* ensures that we stop writing to CGRAM */ 1257 lcd_gotoxy(); 1258 processed = 1; 1259 break; 1260 } 1261 case 'x': /* gotoxy : LxXXX[yYYY]; */ 1262 case 'y': /* gotoxy : LyYYY[xXXX]; */ 1263 if (!strchr(esc, ';')) 1264 break; 1265 1266 while (*esc) { 1267 if (*esc == 'x') { 1268 esc++; 1269 if (kstrtoul(esc, 10, &lcd.addr.x) < 0) 1270 break; 1271 } else if (*esc == 'y') { 1272 esc++; 1273 if (kstrtoul(esc, 10, &lcd.addr.y) < 0) 1274 break; 1275 } else { 1276 break; 1277 } 1278 } 1279 1280 lcd_gotoxy(); 1281 processed = 1; 1282 break; 1283 } 1284 1285 /* TODO: This indent party here got ugly, clean it! */ 1286 /* Check whether one flag was changed */ 1287 if (oldflags != lcd.flags) { 1288 /* check whether one of B,C,D flags were changed */ 1289 if ((oldflags ^ lcd.flags) & 1290 (LCD_FLAG_B | LCD_FLAG_C | LCD_FLAG_D)) 1291 /* set display mode */ 1292 lcd_write_cmd(LCD_CMD_DISPLAY_CTRL 1293 | ((lcd.flags & LCD_FLAG_D) 1294 ? LCD_CMD_DISPLAY_ON : 0) 1295 | ((lcd.flags & LCD_FLAG_C) 1296 ? LCD_CMD_CURSOR_ON : 0) 1297 | ((lcd.flags & LCD_FLAG_B) 1298 ? LCD_CMD_BLINK_ON : 0)); 1299 /* check whether one of F,N flags was changed */ 1300 else if ((oldflags ^ lcd.flags) & (LCD_FLAG_F | LCD_FLAG_N)) 1301 lcd_write_cmd(LCD_CMD_FUNCTION_SET 1302 | LCD_CMD_DATA_LEN_8BITS 1303 | ((lcd.flags & LCD_FLAG_F) 1304 ? LCD_CMD_FONT_5X10_DOTS 1305 : 0) 1306 | ((lcd.flags & LCD_FLAG_N) 1307 ? LCD_CMD_TWO_LINES 1308 : 0)); 1309 /* check whether L flag was changed */ 1310 else if ((oldflags ^ lcd.flags) & (LCD_FLAG_L)) 1311 lcd_backlight(!!(lcd.flags & LCD_FLAG_L)); 1312 } 1313 1314 return processed; 1315} 1316 1317static void lcd_write_char(char c) 1318{ 1319 /* first, we'll test if we're in escape mode */ 1320 if ((c != '\n') && lcd.esc_seq.len >= 0) { 1321 /* yes, let's add this char to the buffer */ 1322 lcd.esc_seq.buf[lcd.esc_seq.len++] = c; 1323 lcd.esc_seq.buf[lcd.esc_seq.len] = 0; 1324 } else { 1325 /* aborts any previous escape sequence */ 1326 lcd.esc_seq.len = -1; 1327 1328 switch (c) { 1329 case LCD_ESCAPE_CHAR: 1330 /* start of an escape sequence */ 1331 lcd.esc_seq.len = 0; 1332 lcd.esc_seq.buf[lcd.esc_seq.len] = 0; 1333 break; 1334 case '\b': 1335 /* go back one char and clear it */ 1336 if (lcd.addr.x > 0) { 1337 /* 1338 * check if we're not at the 1339 * end of the line 1340 */ 1341 if (lcd.addr.x < lcd.bwidth) 1342 /* back one char */ 1343 lcd_write_cmd(LCD_CMD_SHIFT); 1344 lcd.addr.x--; 1345 } 1346 /* replace with a space */ 1347 lcd_write_data(' '); 1348 /* back one char again */ 1349 lcd_write_cmd(LCD_CMD_SHIFT); 1350 break; 1351 case '\014': 1352 /* quickly clear the display */ 1353 lcd_clear_fast(); 1354 break; 1355 case '\n': 1356 /* 1357 * flush the remainder of the current line and 1358 * go to the beginning of the next line 1359 */ 1360 for (; lcd.addr.x < lcd.bwidth; lcd.addr.x++) 1361 lcd_write_data(' '); 1362 lcd.addr.x = 0; 1363 lcd.addr.y = (lcd.addr.y + 1) % lcd.height; 1364 lcd_gotoxy(); 1365 break; 1366 case '\r': 1367 /* go to the beginning of the same line */ 1368 lcd.addr.x = 0; 1369 lcd_gotoxy(); 1370 break; 1371 case '\t': 1372 /* print a space instead of the tab */ 1373 lcd_print(' '); 1374 break; 1375 default: 1376 /* simply print this char */ 1377 lcd_print(c); 1378 break; 1379 } 1380 } 1381 1382 /* 1383 * now we'll see if we're in an escape mode and if the current 1384 * escape sequence can be understood. 1385 */ 1386 if (lcd.esc_seq.len >= 2) { 1387 int processed = 0; 1388 1389 if (!strcmp(lcd.esc_seq.buf, "[2J")) { 1390 /* clear the display */ 1391 lcd_clear_fast(); 1392 processed = 1; 1393 } else if (!strcmp(lcd.esc_seq.buf, "[H")) { 1394 /* cursor to home */ 1395 lcd_home(); 1396 processed = 1; 1397 } 1398 /* codes starting with ^[[L */ 1399 else if ((lcd.esc_seq.len >= 3) && 1400 (lcd.esc_seq.buf[0] == '[') && 1401 (lcd.esc_seq.buf[1] == 'L')) { 1402 processed = handle_lcd_special_code(); 1403 } 1404 1405 /* LCD special escape codes */ 1406 /* 1407 * flush the escape sequence if it's been processed 1408 * or if it is getting too long. 1409 */ 1410 if (processed || (lcd.esc_seq.len >= LCD_ESCAPE_LEN)) 1411 lcd.esc_seq.len = -1; 1412 } /* escape codes */ 1413} 1414 1415static ssize_t lcd_write(struct file *file, 1416 const char __user *buf, size_t count, loff_t *ppos) 1417{ 1418 const char __user *tmp = buf; 1419 char c; 1420 1421 for (; count-- > 0; (*ppos)++, tmp++) { 1422 if (!in_interrupt() && (((count + 1) & 0x1f) == 0)) 1423 /* 1424 * let's be a little nice with other processes 1425 * that need some CPU 1426 */ 1427 schedule(); 1428 1429 if (get_user(c, tmp)) 1430 return -EFAULT; 1431 1432 lcd_write_char(c); 1433 } 1434 1435 return tmp - buf; 1436} 1437 1438static int lcd_open(struct inode *inode, struct file *file) 1439{ 1440 if (!atomic_dec_and_test(&lcd_available)) 1441 return -EBUSY; /* open only once at a time */ 1442 1443 if (file->f_mode & FMODE_READ) /* device is write-only */ 1444 return -EPERM; 1445 1446 if (lcd.must_clear) { 1447 lcd_clear_display(); 1448 lcd.must_clear = false; 1449 } 1450 return nonseekable_open(inode, file); 1451} 1452 1453static int lcd_release(struct inode *inode, struct file *file) 1454{ 1455 atomic_inc(&lcd_available); 1456 return 0; 1457} 1458 1459static const struct file_operations lcd_fops = { 1460 .write = lcd_write, 1461 .open = lcd_open, 1462 .release = lcd_release, 1463 .llseek = no_llseek, 1464}; 1465 1466static struct miscdevice lcd_dev = { 1467 .minor = LCD_MINOR, 1468 .name = "lcd", 1469 .fops = &lcd_fops, 1470}; 1471 1472/* public function usable from the kernel for any purpose */ 1473static void panel_lcd_print(const char *s) 1474{ 1475 const char *tmp = s; 1476 int count = strlen(s); 1477 1478 if (lcd.enabled && lcd.initialized) { 1479 for (; count-- > 0; tmp++) { 1480 if (!in_interrupt() && (((count + 1) & 0x1f) == 0)) 1481 /* 1482 * let's be a little nice with other processes 1483 * that need some CPU 1484 */ 1485 schedule(); 1486 1487 lcd_write_char(*tmp); 1488 } 1489 } 1490} 1491 1492/* initialize the LCD driver */ 1493static void lcd_init(void) 1494{ 1495 switch (selected_lcd_type) { 1496 case LCD_TYPE_OLD: 1497 /* parallel mode, 8 bits */ 1498 lcd.proto = LCD_PROTO_PARALLEL; 1499 lcd.charset = LCD_CHARSET_NORMAL; 1500 lcd.pins.e = PIN_STROBE; 1501 lcd.pins.rs = PIN_AUTOLF; 1502 1503 lcd.width = 40; 1504 lcd.bwidth = 40; 1505 lcd.hwidth = 64; 1506 lcd.height = 2; 1507 break; 1508 case LCD_TYPE_KS0074: 1509 /* serial mode, ks0074 */ 1510 lcd.proto = LCD_PROTO_SERIAL; 1511 lcd.charset = LCD_CHARSET_KS0074; 1512 lcd.pins.bl = PIN_AUTOLF; 1513 lcd.pins.cl = PIN_STROBE; 1514 lcd.pins.da = PIN_D0; 1515 1516 lcd.width = 16; 1517 lcd.bwidth = 40; 1518 lcd.hwidth = 16; 1519 lcd.height = 2; 1520 break; 1521 case LCD_TYPE_NEXCOM: 1522 /* parallel mode, 8 bits, generic */ 1523 lcd.proto = LCD_PROTO_PARALLEL; 1524 lcd.charset = LCD_CHARSET_NORMAL; 1525 lcd.pins.e = PIN_AUTOLF; 1526 lcd.pins.rs = PIN_SELECP; 1527 lcd.pins.rw = PIN_INITP; 1528 1529 lcd.width = 16; 1530 lcd.bwidth = 40; 1531 lcd.hwidth = 64; 1532 lcd.height = 2; 1533 break; 1534 case LCD_TYPE_CUSTOM: 1535 /* customer-defined */ 1536 lcd.proto = DEFAULT_LCD_PROTO; 1537 lcd.charset = DEFAULT_LCD_CHARSET; 1538 /* default geometry will be set later */ 1539 break; 1540 case LCD_TYPE_HANTRONIX: 1541 /* parallel mode, 8 bits, hantronix-like */ 1542 default: 1543 lcd.proto = LCD_PROTO_PARALLEL; 1544 lcd.charset = LCD_CHARSET_NORMAL; 1545 lcd.pins.e = PIN_STROBE; 1546 lcd.pins.rs = PIN_SELECP; 1547 1548 lcd.width = 16; 1549 lcd.bwidth = 40; 1550 lcd.hwidth = 64; 1551 lcd.height = 2; 1552 break; 1553 } 1554 1555 /* Overwrite with module params set on loading */ 1556 if (lcd_height != NOT_SET) 1557 lcd.height = lcd_height; 1558 if (lcd_width != NOT_SET) 1559 lcd.width = lcd_width; 1560 if (lcd_bwidth != NOT_SET) 1561 lcd.bwidth = lcd_bwidth; 1562 if (lcd_hwidth != NOT_SET) 1563 lcd.hwidth = lcd_hwidth; 1564 if (lcd_charset != NOT_SET) 1565 lcd.charset = lcd_charset; 1566 if (lcd_proto != NOT_SET) 1567 lcd.proto = lcd_proto; 1568 if (lcd_e_pin != PIN_NOT_SET) 1569 lcd.pins.e = lcd_e_pin; 1570 if (lcd_rs_pin != PIN_NOT_SET) 1571 lcd.pins.rs = lcd_rs_pin; 1572 if (lcd_rw_pin != PIN_NOT_SET) 1573 lcd.pins.rw = lcd_rw_pin; 1574 if (lcd_cl_pin != PIN_NOT_SET) 1575 lcd.pins.cl = lcd_cl_pin; 1576 if (lcd_da_pin != PIN_NOT_SET) 1577 lcd.pins.da = lcd_da_pin; 1578 if (lcd_bl_pin != PIN_NOT_SET) 1579 lcd.pins.bl = lcd_bl_pin; 1580 1581 /* this is used to catch wrong and default values */ 1582 if (lcd.width <= 0) 1583 lcd.width = DEFAULT_LCD_WIDTH; 1584 if (lcd.bwidth <= 0) 1585 lcd.bwidth = DEFAULT_LCD_BWIDTH; 1586 if (lcd.hwidth <= 0) 1587 lcd.hwidth = DEFAULT_LCD_HWIDTH; 1588 if (lcd.height <= 0) 1589 lcd.height = DEFAULT_LCD_HEIGHT; 1590 1591 if (lcd.proto == LCD_PROTO_SERIAL) { /* SERIAL */ 1592 lcd_write_cmd = lcd_write_cmd_s; 1593 lcd_write_data = lcd_write_data_s; 1594 lcd_clear_fast = lcd_clear_fast_s; 1595 1596 if (lcd.pins.cl == PIN_NOT_SET) 1597 lcd.pins.cl = DEFAULT_LCD_PIN_SCL; 1598 if (lcd.pins.da == PIN_NOT_SET) 1599 lcd.pins.da = DEFAULT_LCD_PIN_SDA; 1600 1601 } else if (lcd.proto == LCD_PROTO_PARALLEL) { /* PARALLEL */ 1602 lcd_write_cmd = lcd_write_cmd_p8; 1603 lcd_write_data = lcd_write_data_p8; 1604 lcd_clear_fast = lcd_clear_fast_p8; 1605 1606 if (lcd.pins.e == PIN_NOT_SET) 1607 lcd.pins.e = DEFAULT_LCD_PIN_E; 1608 if (lcd.pins.rs == PIN_NOT_SET) 1609 lcd.pins.rs = DEFAULT_LCD_PIN_RS; 1610 if (lcd.pins.rw == PIN_NOT_SET) 1611 lcd.pins.rw = DEFAULT_LCD_PIN_RW; 1612 } else { 1613 lcd_write_cmd = lcd_write_cmd_tilcd; 1614 lcd_write_data = lcd_write_data_tilcd; 1615 lcd_clear_fast = lcd_clear_fast_tilcd; 1616 } 1617 1618 if (lcd.pins.bl == PIN_NOT_SET) 1619 lcd.pins.bl = DEFAULT_LCD_PIN_BL; 1620 1621 if (lcd.pins.e == PIN_NOT_SET) 1622 lcd.pins.e = PIN_NONE; 1623 if (lcd.pins.rs == PIN_NOT_SET) 1624 lcd.pins.rs = PIN_NONE; 1625 if (lcd.pins.rw == PIN_NOT_SET) 1626 lcd.pins.rw = PIN_NONE; 1627 if (lcd.pins.bl == PIN_NOT_SET) 1628 lcd.pins.bl = PIN_NONE; 1629 if (lcd.pins.cl == PIN_NOT_SET) 1630 lcd.pins.cl = PIN_NONE; 1631 if (lcd.pins.da == PIN_NOT_SET) 1632 lcd.pins.da = PIN_NONE; 1633 1634 if (lcd.charset == NOT_SET) 1635 lcd.charset = DEFAULT_LCD_CHARSET; 1636 1637 if (lcd.charset == LCD_CHARSET_KS0074) 1638 lcd_char_conv = lcd_char_conv_ks0074; 1639 else 1640 lcd_char_conv = NULL; 1641 1642 if (lcd.pins.bl != PIN_NONE) { 1643 mutex_init(&lcd.bl_tempo_lock); 1644 INIT_DELAYED_WORK(&lcd.bl_work, lcd_bl_off); 1645 } 1646 1647 pin_to_bits(lcd.pins.e, lcd_bits[LCD_PORT_D][LCD_BIT_E], 1648 lcd_bits[LCD_PORT_C][LCD_BIT_E]); 1649 pin_to_bits(lcd.pins.rs, lcd_bits[LCD_PORT_D][LCD_BIT_RS], 1650 lcd_bits[LCD_PORT_C][LCD_BIT_RS]); 1651 pin_to_bits(lcd.pins.rw, lcd_bits[LCD_PORT_D][LCD_BIT_RW], 1652 lcd_bits[LCD_PORT_C][LCD_BIT_RW]); 1653 pin_to_bits(lcd.pins.bl, lcd_bits[LCD_PORT_D][LCD_BIT_BL], 1654 lcd_bits[LCD_PORT_C][LCD_BIT_BL]); 1655 pin_to_bits(lcd.pins.cl, lcd_bits[LCD_PORT_D][LCD_BIT_CL], 1656 lcd_bits[LCD_PORT_C][LCD_BIT_CL]); 1657 pin_to_bits(lcd.pins.da, lcd_bits[LCD_PORT_D][LCD_BIT_DA], 1658 lcd_bits[LCD_PORT_C][LCD_BIT_DA]); 1659 1660 /* 1661 * before this line, we must NOT send anything to the display. 1662 * Since lcd_init_display() needs to write data, we have to 1663 * enable mark the LCD initialized just before. 1664 */ 1665 lcd.initialized = true; 1666 lcd_init_display(); 1667 1668 /* display a short message */ 1669#ifdef CONFIG_PANEL_CHANGE_MESSAGE 1670#ifdef CONFIG_PANEL_BOOT_MESSAGE 1671 panel_lcd_print("\x1b[Lc\x1b[Lb\x1b[L*" CONFIG_PANEL_BOOT_MESSAGE); 1672#endif 1673#else 1674 panel_lcd_print("\x1b[Lc\x1b[Lb\x1b[L*Linux-" UTS_RELEASE); 1675#endif 1676 /* clear the display on the next device opening */ 1677 lcd.must_clear = true; 1678 lcd_home(); 1679} 1680 1681/* 1682 * These are the file operation function for user access to /dev/keypad 1683 */ 1684 1685static ssize_t keypad_read(struct file *file, 1686 char __user *buf, size_t count, loff_t *ppos) 1687{ 1688 unsigned i = *ppos; 1689 char __user *tmp = buf; 1690 1691 if (keypad_buflen == 0) { 1692 if (file->f_flags & O_NONBLOCK) 1693 return -EAGAIN; 1694 1695 if (wait_event_interruptible(keypad_read_wait, 1696 keypad_buflen != 0)) 1697 return -EINTR; 1698 } 1699 1700 for (; count-- > 0 && (keypad_buflen > 0); 1701 ++i, ++tmp, --keypad_buflen) { 1702 put_user(keypad_buffer[keypad_start], tmp); 1703 keypad_start = (keypad_start + 1) % KEYPAD_BUFFER; 1704 } 1705 *ppos = i; 1706 1707 return tmp - buf; 1708} 1709 1710static int keypad_open(struct inode *inode, struct file *file) 1711{ 1712 if (!atomic_dec_and_test(&keypad_available)) 1713 return -EBUSY; /* open only once at a time */ 1714 1715 if (file->f_mode & FMODE_WRITE) /* device is read-only */ 1716 return -EPERM; 1717 1718 keypad_buflen = 0; /* flush the buffer on opening */ 1719 return 0; 1720} 1721 1722static int keypad_release(struct inode *inode, struct file *file) 1723{ 1724 atomic_inc(&keypad_available); 1725 return 0; 1726} 1727 1728static const struct file_operations keypad_fops = { 1729 .read = keypad_read, /* read */ 1730 .open = keypad_open, /* open */ 1731 .release = keypad_release, /* close */ 1732 .llseek = default_llseek, 1733}; 1734 1735static struct miscdevice keypad_dev = { 1736 .minor = KEYPAD_MINOR, 1737 .name = "keypad", 1738 .fops = &keypad_fops, 1739}; 1740 1741static void keypad_send_key(const char *string, int max_len) 1742{ 1743 /* send the key to the device only if a process is attached to it. */ 1744 if (!atomic_read(&keypad_available)) { 1745 while (max_len-- && keypad_buflen < KEYPAD_BUFFER && *string) { 1746 keypad_buffer[(keypad_start + keypad_buflen++) % 1747 KEYPAD_BUFFER] = *string++; 1748 } 1749 wake_up_interruptible(&keypad_read_wait); 1750 } 1751} 1752 1753/* this function scans all the bits involving at least one logical signal, 1754 * and puts the results in the bitfield "phys_read" (one bit per established 1755 * contact), and sets "phys_read_prev" to "phys_read". 1756 * 1757 * Note: to debounce input signals, we will only consider as switched a signal 1758 * which is stable across 2 measures. Signals which are different between two 1759 * reads will be kept as they previously were in their logical form (phys_prev). 1760 * A signal which has just switched will have a 1 in 1761 * (phys_read ^ phys_read_prev). 1762 */ 1763static void phys_scan_contacts(void) 1764{ 1765 int bit, bitval; 1766 char oldval; 1767 char bitmask; 1768 char gndmask; 1769 1770 phys_prev = phys_curr; 1771 phys_read_prev = phys_read; 1772 phys_read = 0; /* flush all signals */ 1773 1774 /* keep track of old value, with all outputs disabled */ 1775 oldval = r_dtr(pprt) | scan_mask_o; 1776 /* activate all keyboard outputs (active low) */ 1777 w_dtr(pprt, oldval & ~scan_mask_o); 1778 1779 /* will have a 1 for each bit set to gnd */ 1780 bitmask = PNL_PINPUT(r_str(pprt)) & scan_mask_i; 1781 /* disable all matrix signals */ 1782 w_dtr(pprt, oldval); 1783 1784 /* now that all outputs are cleared, the only active input bits are 1785 * directly connected to the ground 1786 */ 1787 1788 /* 1 for each grounded input */ 1789 gndmask = PNL_PINPUT(r_str(pprt)) & scan_mask_i; 1790 1791 /* grounded inputs are signals 40-44 */ 1792 phys_read |= (__u64)gndmask << 40; 1793 1794 if (bitmask != gndmask) { 1795 /* 1796 * since clearing the outputs changed some inputs, we know 1797 * that some input signals are currently tied to some outputs. 1798 * So we'll scan them. 1799 */ 1800 for (bit = 0; bit < 8; bit++) { 1801 bitval = BIT(bit); 1802 1803 if (!(scan_mask_o & bitval)) /* skip unused bits */ 1804 continue; 1805 1806 w_dtr(pprt, oldval & ~bitval); /* enable this output */ 1807 bitmask = PNL_PINPUT(r_str(pprt)) & ~gndmask; 1808 phys_read |= (__u64)bitmask << (5 * bit); 1809 } 1810 w_dtr(pprt, oldval); /* disable all outputs */ 1811 } 1812 /* 1813 * this is easy: use old bits when they are flapping, 1814 * use new ones when stable 1815 */ 1816 phys_curr = (phys_prev & (phys_read ^ phys_read_prev)) | 1817 (phys_read & ~(phys_read ^ phys_read_prev)); 1818} 1819 1820static inline int input_state_high(struct logical_input *input) 1821{ 1822#if 0 1823 /* FIXME: 1824 * this is an invalid test. It tries to catch 1825 * transitions from single-key to multiple-key, but 1826 * doesn't take into account the contacts polarity. 1827 * The only solution to the problem is to parse keys 1828 * from the most complex to the simplest combinations, 1829 * and mark them as 'caught' once a combination 1830 * matches, then unmatch it for all other ones. 1831 */ 1832 1833 /* try to catch dangerous transitions cases : 1834 * someone adds a bit, so this signal was a false 1835 * positive resulting from a transition. We should 1836 * invalidate the signal immediately and not call the 1837 * release function. 1838 * eg: 0 -(press A)-> A -(press B)-> AB : don't match A's release. 1839 */ 1840 if (((phys_prev & input->mask) == input->value) && 1841 ((phys_curr & input->mask) > input->value)) { 1842 input->state = INPUT_ST_LOW; /* invalidate */ 1843 return 1; 1844 } 1845#endif 1846 1847 if ((phys_curr & input->mask) == input->value) { 1848 if ((input->type == INPUT_TYPE_STD) && 1849 (input->high_timer == 0)) { 1850 input->high_timer++; 1851 if (input->u.std.press_fct) 1852 input->u.std.press_fct(input->u.std.press_data); 1853 } else if (input->type == INPUT_TYPE_KBD) { 1854 /* will turn on the light */ 1855 keypressed = 1; 1856 1857 if (input->high_timer == 0) { 1858 char *press_str = input->u.kbd.press_str; 1859 1860 if (press_str[0]) { 1861 int s = sizeof(input->u.kbd.press_str); 1862 1863 keypad_send_key(press_str, s); 1864 } 1865 } 1866 1867 if (input->u.kbd.repeat_str[0]) { 1868 char *repeat_str = input->u.kbd.repeat_str; 1869 1870 if (input->high_timer >= KEYPAD_REP_START) { 1871 int s = sizeof(input->u.kbd.repeat_str); 1872 1873 input->high_timer -= KEYPAD_REP_DELAY; 1874 keypad_send_key(repeat_str, s); 1875 } 1876 /* we will need to come back here soon */ 1877 inputs_stable = 0; 1878 } 1879 1880 if (input->high_timer < 255) 1881 input->high_timer++; 1882 } 1883 return 1; 1884 } 1885 1886 /* else signal falling down. Let's fall through. */ 1887 input->state = INPUT_ST_FALLING; 1888 input->fall_timer = 0; 1889 1890 return 0; 1891} 1892 1893static inline void input_state_falling(struct logical_input *input) 1894{ 1895#if 0 1896 /* FIXME !!! same comment as in input_state_high */ 1897 if (((phys_prev & input->mask) == input->value) && 1898 ((phys_curr & input->mask) > input->value)) { 1899 input->state = INPUT_ST_LOW; /* invalidate */ 1900 return; 1901 } 1902#endif 1903 1904 if ((phys_curr & input->mask) == input->value) { 1905 if (input->type == INPUT_TYPE_KBD) { 1906 /* will turn on the light */ 1907 keypressed = 1; 1908 1909 if (input->u.kbd.repeat_str[0]) { 1910 char *repeat_str = input->u.kbd.repeat_str; 1911 1912 if (input->high_timer >= KEYPAD_REP_START) { 1913 int s = sizeof(input->u.kbd.repeat_str); 1914 1915 input->high_timer -= KEYPAD_REP_DELAY; 1916 keypad_send_key(repeat_str, s); 1917 } 1918 /* we will need to come back here soon */ 1919 inputs_stable = 0; 1920 } 1921 1922 if (input->high_timer < 255) 1923 input->high_timer++; 1924 } 1925 input->state = INPUT_ST_HIGH; 1926 } else if (input->fall_timer >= input->fall_time) { 1927 /* call release event */ 1928 if (input->type == INPUT_TYPE_STD) { 1929 void (*release_fct)(int) = input->u.std.release_fct; 1930 1931 if (release_fct) 1932 release_fct(input->u.std.release_data); 1933 } else if (input->type == INPUT_TYPE_KBD) { 1934 char *release_str = input->u.kbd.release_str; 1935 1936 if (release_str[0]) { 1937 int s = sizeof(input->u.kbd.release_str); 1938 1939 keypad_send_key(release_str, s); 1940 } 1941 } 1942 1943 input->state = INPUT_ST_LOW; 1944 } else { 1945 input->fall_timer++; 1946 inputs_stable = 0; 1947 } 1948} 1949 1950static void panel_process_inputs(void) 1951{ 1952 struct list_head *item; 1953 struct logical_input *input; 1954 1955 keypressed = 0; 1956 inputs_stable = 1; 1957 list_for_each(item, &logical_inputs) { 1958 input = list_entry(item, struct logical_input, list); 1959 1960 switch (input->state) { 1961 case INPUT_ST_LOW: 1962 if ((phys_curr & input->mask) != input->value) 1963 break; 1964 /* if all needed ones were already set previously, 1965 * this means that this logical signal has been 1966 * activated by the releasing of another combined 1967 * signal, so we don't want to match. 1968 * eg: AB -(release B)-> A -(release A)-> 0 : 1969 * don't match A. 1970 */ 1971 if ((phys_prev & input->mask) == input->value) 1972 break; 1973 input->rise_timer = 0; 1974 input->state = INPUT_ST_RISING; 1975 /* no break here, fall through */ 1976 case INPUT_ST_RISING: 1977 if ((phys_curr & input->mask) != input->value) { 1978 input->state = INPUT_ST_LOW; 1979 break; 1980 } 1981 if (input->rise_timer < input->rise_time) { 1982 inputs_stable = 0; 1983 input->rise_timer++; 1984 break; 1985 } 1986 input->high_timer = 0; 1987 input->state = INPUT_ST_HIGH; 1988 /* no break here, fall through */ 1989 case INPUT_ST_HIGH: 1990 if (input_state_high(input)) 1991 break; 1992 /* no break here, fall through */ 1993 case INPUT_ST_FALLING: 1994 input_state_falling(input); 1995 } 1996 } 1997} 1998 1999static void panel_scan_timer(void) 2000{ 2001 if (keypad.enabled && keypad_initialized) { 2002 if (spin_trylock_irq(&pprt_lock)) { 2003 phys_scan_contacts(); 2004 2005 /* no need for the parport anymore */ 2006 spin_unlock_irq(&pprt_lock); 2007 } 2008 2009 if (!inputs_stable || phys_curr != phys_prev) 2010 panel_process_inputs(); 2011 } 2012 2013 if (keypressed && lcd.enabled && lcd.initialized) 2014 lcd_poke(); 2015 2016 mod_timer(&scan_timer, jiffies + INPUT_POLL_TIME); 2017} 2018 2019static void init_scan_timer(void) 2020{ 2021 if (scan_timer.function) 2022 return; /* already started */ 2023 2024 setup_timer(&scan_timer, (void *)&panel_scan_timer, 0); 2025 scan_timer.expires = jiffies + INPUT_POLL_TIME; 2026 add_timer(&scan_timer); 2027} 2028 2029/* converts a name of the form "({BbAaPpSsEe}{01234567-})*" to a series of bits. 2030 * if <omask> or <imask> are non-null, they will be or'ed with the bits 2031 * corresponding to out and in bits respectively. 2032 * returns 1 if ok, 0 if error (in which case, nothing is written). 2033 */ 2034static u8 input_name2mask(const char *name, __u64 *mask, __u64 *value, 2035 u8 *imask, u8 *omask) 2036{ 2037 const char sigtab[] = "EeSsPpAaBb"; 2038 u8 im, om; 2039 __u64 m, v; 2040 2041 om = 0; 2042 im = 0; 2043 m = 0ULL; 2044 v = 0ULL; 2045 while (*name) { 2046 int in, out, bit, neg; 2047 const char *idx; 2048 2049 idx = strchr(sigtab, *name); 2050 if (!idx) 2051 return 0; /* input name not found */ 2052 2053 in = idx - sigtab; 2054 neg = (in & 1); /* odd (lower) names are negated */ 2055 in >>= 1; 2056 im |= BIT(in); 2057 2058 name++; 2059 if (*name >= '0' && *name <= '7') { 2060 out = *name - '0'; 2061 om |= BIT(out); 2062 } else if (*name == '-') { 2063 out = 8; 2064 } else { 2065 return 0; /* unknown bit name */ 2066 } 2067 2068 bit = (out * 5) + in; 2069 2070 m |= 1ULL << bit; 2071 if (!neg) 2072 v |= 1ULL << bit; 2073 name++; 2074 } 2075 *mask = m; 2076 *value = v; 2077 if (imask) 2078 *imask |= im; 2079 if (omask) 2080 *omask |= om; 2081 return 1; 2082} 2083 2084/* tries to bind a key to the signal name <name>. The key will send the 2085 * strings <press>, <repeat>, <release> for these respective events. 2086 * Returns the pointer to the new key if ok, NULL if the key could not be bound. 2087 */ 2088static struct logical_input *panel_bind_key(const char *name, const char *press, 2089 const char *repeat, 2090 const char *release) 2091{ 2092 struct logical_input *key; 2093 2094 key = kzalloc(sizeof(*key), GFP_KERNEL); 2095 if (!key) 2096 return NULL; 2097 2098 if (!input_name2mask(name, &key->mask, &key->value, &scan_mask_i, 2099 &scan_mask_o)) { 2100 kfree(key); 2101 return NULL; 2102 } 2103 2104 key->type = INPUT_TYPE_KBD; 2105 key->state = INPUT_ST_LOW; 2106 key->rise_time = 1; 2107 key->fall_time = 1; 2108 2109 strncpy(key->u.kbd.press_str, press, sizeof(key->u.kbd.press_str)); 2110 strncpy(key->u.kbd.repeat_str, repeat, sizeof(key->u.kbd.repeat_str)); 2111 strncpy(key->u.kbd.release_str, release, 2112 sizeof(key->u.kbd.release_str)); 2113 list_add(&key->list, &logical_inputs); 2114 return key; 2115} 2116 2117#if 0 2118/* tries to bind a callback function to the signal name <name>. The function 2119 * <press_fct> will be called with the <press_data> arg when the signal is 2120 * activated, and so on for <release_fct>/<release_data> 2121 * Returns the pointer to the new signal if ok, NULL if the signal could not 2122 * be bound. 2123 */ 2124static struct logical_input *panel_bind_callback(char *name, 2125 void (*press_fct)(int), 2126 int press_data, 2127 void (*release_fct)(int), 2128 int release_data) 2129{ 2130 struct logical_input *callback; 2131 2132 callback = kmalloc(sizeof(*callback), GFP_KERNEL); 2133 if (!callback) 2134 return NULL; 2135 2136 memset(callback, 0, sizeof(struct logical_input)); 2137 if (!input_name2mask(name, &callback->mask, &callback->value, 2138 &scan_mask_i, &scan_mask_o)) 2139 return NULL; 2140 2141 callback->type = INPUT_TYPE_STD; 2142 callback->state = INPUT_ST_LOW; 2143 callback->rise_time = 1; 2144 callback->fall_time = 1; 2145 callback->u.std.press_fct = press_fct; 2146 callback->u.std.press_data = press_data; 2147 callback->u.std.release_fct = release_fct; 2148 callback->u.std.release_data = release_data; 2149 list_add(&callback->list, &logical_inputs); 2150 return callback; 2151} 2152#endif 2153 2154static void keypad_init(void) 2155{ 2156 int keynum; 2157 2158 init_waitqueue_head(&keypad_read_wait); 2159 keypad_buflen = 0; /* flushes any eventual noisy keystroke */ 2160 2161 /* Let's create all known keys */ 2162 2163 for (keynum = 0; keypad_profile[keynum][0][0]; keynum++) { 2164 panel_bind_key(keypad_profile[keynum][0], 2165 keypad_profile[keynum][1], 2166 keypad_profile[keynum][2], 2167 keypad_profile[keynum][3]); 2168 } 2169 2170 init_scan_timer(); 2171 keypad_initialized = 1; 2172} 2173 2174/**************************************************/ 2175/* device initialization */ 2176/**************************************************/ 2177 2178static int panel_notify_sys(struct notifier_block *this, unsigned long code, 2179 void *unused) 2180{ 2181 if (lcd.enabled && lcd.initialized) { 2182 switch (code) { 2183 case SYS_DOWN: 2184 panel_lcd_print 2185 ("\x0cReloading\nSystem...\x1b[Lc\x1b[Lb\x1b[L+"); 2186 break; 2187 case SYS_HALT: 2188 panel_lcd_print 2189 ("\x0cSystem Halted.\x1b[Lc\x1b[Lb\x1b[L+"); 2190 break; 2191 case SYS_POWER_OFF: 2192 panel_lcd_print("\x0cPower off.\x1b[Lc\x1b[Lb\x1b[L+"); 2193 break; 2194 default: 2195 break; 2196 } 2197 } 2198 return NOTIFY_DONE; 2199} 2200 2201static struct notifier_block panel_notifier = { 2202 panel_notify_sys, 2203 NULL, 2204 0 2205}; 2206 2207static void panel_attach(struct parport *port) 2208{ 2209 struct pardev_cb panel_cb; 2210 2211 if (port->number != parport) 2212 return; 2213 2214 if (pprt) { 2215 pr_err("%s: port->number=%d parport=%d, already registered!\n", 2216 __func__, port->number, parport); 2217 return; 2218 } 2219 2220 memset(&panel_cb, 0, sizeof(panel_cb)); 2221 panel_cb.private = &pprt; 2222 /* panel_cb.flags = 0 should be PARPORT_DEV_EXCL? */ 2223 2224 pprt = parport_register_dev_model(port, "panel", &panel_cb, 0); 2225 if (!pprt) { 2226 pr_err("%s: port->number=%d parport=%d, parport_register_device() failed\n", 2227 __func__, port->number, parport); 2228 return; 2229 } 2230 2231 if (parport_claim(pprt)) { 2232 pr_err("could not claim access to parport%d. Aborting.\n", 2233 parport); 2234 goto err_unreg_device; 2235 } 2236 2237 /* must init LCD first, just in case an IRQ from the keypad is 2238 * generated at keypad init 2239 */ 2240 if (lcd.enabled) { 2241 lcd_init(); 2242 if (misc_register(&lcd_dev)) 2243 goto err_unreg_device; 2244 } 2245 2246 if (keypad.enabled) { 2247 keypad_init(); 2248 if (misc_register(&keypad_dev)) 2249 goto err_lcd_unreg; 2250 } 2251 register_reboot_notifier(&panel_notifier); 2252 return; 2253 2254err_lcd_unreg: 2255 if (lcd.enabled) 2256 misc_deregister(&lcd_dev); 2257err_unreg_device: 2258 parport_unregister_device(pprt); 2259 pprt = NULL; 2260} 2261 2262static void panel_detach(struct parport *port) 2263{ 2264 if (port->number != parport) 2265 return; 2266 2267 if (!pprt) { 2268 pr_err("%s: port->number=%d parport=%d, nothing to unregister.\n", 2269 __func__, port->number, parport); 2270 return; 2271 } 2272 if (scan_timer.function) 2273 del_timer_sync(&scan_timer); 2274 2275 if (keypad.enabled) { 2276 misc_deregister(&keypad_dev); 2277 keypad_initialized = 0; 2278 } 2279 2280 if (lcd.enabled) { 2281 panel_lcd_print("\x0cLCD driver unloaded.\x1b[Lc\x1b[Lb\x1b[L-"); 2282 misc_deregister(&lcd_dev); 2283 if (lcd.pins.bl != PIN_NONE) { 2284 cancel_delayed_work_sync(&lcd.bl_work); 2285 __lcd_backlight(0); 2286 } 2287 lcd.initialized = false; 2288 } 2289 2290 /* TODO: free all input signals */ 2291 parport_release(pprt); 2292 parport_unregister_device(pprt); 2293 pprt = NULL; 2294 unregister_reboot_notifier(&panel_notifier); 2295} 2296 2297static struct parport_driver panel_driver = { 2298 .name = "panel", 2299 .match_port = panel_attach, 2300 .detach = panel_detach, 2301 .devmodel = true, 2302}; 2303 2304/* init function */ 2305static int __init panel_init_module(void) 2306{ 2307 int selected_keypad_type = NOT_SET, err; 2308 2309 /* take care of an eventual profile */ 2310 switch (profile) { 2311 case PANEL_PROFILE_CUSTOM: 2312 /* custom profile */ 2313 selected_keypad_type = DEFAULT_KEYPAD_TYPE; 2314 selected_lcd_type = DEFAULT_LCD_TYPE; 2315 break; 2316 case PANEL_PROFILE_OLD: 2317 /* 8 bits, 2*16, old keypad */ 2318 selected_keypad_type = KEYPAD_TYPE_OLD; 2319 selected_lcd_type = LCD_TYPE_OLD; 2320 2321 /* TODO: This two are a little hacky, sort it out later */ 2322 if (lcd_width == NOT_SET) 2323 lcd_width = 16; 2324 if (lcd_hwidth == NOT_SET) 2325 lcd_hwidth = 16; 2326 break; 2327 case PANEL_PROFILE_NEW: 2328 /* serial, 2*16, new keypad */ 2329 selected_keypad_type = KEYPAD_TYPE_NEW; 2330 selected_lcd_type = LCD_TYPE_KS0074; 2331 break; 2332 case PANEL_PROFILE_HANTRONIX: 2333 /* 8 bits, 2*16 hantronix-like, no keypad */ 2334 selected_keypad_type = KEYPAD_TYPE_NONE; 2335 selected_lcd_type = LCD_TYPE_HANTRONIX; 2336 break; 2337 case PANEL_PROFILE_NEXCOM: 2338 /* generic 8 bits, 2*16, nexcom keypad, eg. Nexcom. */ 2339 selected_keypad_type = KEYPAD_TYPE_NEXCOM; 2340 selected_lcd_type = LCD_TYPE_NEXCOM; 2341 break; 2342 case PANEL_PROFILE_LARGE: 2343 /* 8 bits, 2*40, old keypad */ 2344 selected_keypad_type = KEYPAD_TYPE_OLD; 2345 selected_lcd_type = LCD_TYPE_OLD; 2346 break; 2347 } 2348 2349 /* 2350 * Overwrite selection with module param values (both keypad and lcd), 2351 * where the deprecated params have lower prio. 2352 */ 2353 if (keypad_enabled != NOT_SET) 2354 selected_keypad_type = keypad_enabled; 2355 if (keypad_type != NOT_SET) 2356 selected_keypad_type = keypad_type; 2357 2358 keypad.enabled = (selected_keypad_type > 0); 2359 2360 if (lcd_enabled != NOT_SET) 2361 selected_lcd_type = lcd_enabled; 2362 if (lcd_type != NOT_SET) 2363 selected_lcd_type = lcd_type; 2364 2365 lcd.enabled = (selected_lcd_type > 0); 2366 2367 if (lcd.enabled) { 2368 /* 2369 * Init lcd struct with load-time values to preserve exact 2370 * current functionality (at least for now). 2371 */ 2372 lcd.height = lcd_height; 2373 lcd.width = lcd_width; 2374 lcd.bwidth = lcd_bwidth; 2375 lcd.hwidth = lcd_hwidth; 2376 lcd.charset = lcd_charset; 2377 lcd.proto = lcd_proto; 2378 lcd.pins.e = lcd_e_pin; 2379 lcd.pins.rs = lcd_rs_pin; 2380 lcd.pins.rw = lcd_rw_pin; 2381 lcd.pins.cl = lcd_cl_pin; 2382 lcd.pins.da = lcd_da_pin; 2383 lcd.pins.bl = lcd_bl_pin; 2384 2385 /* Leave it for now, just in case */ 2386 lcd.esc_seq.len = -1; 2387 } 2388 2389 switch (selected_keypad_type) { 2390 case KEYPAD_TYPE_OLD: 2391 keypad_profile = old_keypad_profile; 2392 break; 2393 case KEYPAD_TYPE_NEW: 2394 keypad_profile = new_keypad_profile; 2395 break; 2396 case KEYPAD_TYPE_NEXCOM: 2397 keypad_profile = nexcom_keypad_profile; 2398 break; 2399 default: 2400 keypad_profile = NULL; 2401 break; 2402 } 2403 2404 if (!lcd.enabled && !keypad.enabled) { 2405 /* no device enabled, let's exit */ 2406 pr_err("panel driver disabled.\n"); 2407 return -ENODEV; 2408 } 2409 2410 err = parport_register_driver(&panel_driver); 2411 if (err) { 2412 pr_err("could not register with parport. Aborting.\n"); 2413 return err; 2414 } 2415 2416 if (pprt) 2417 pr_info("panel driver registered on parport%d (io=0x%lx).\n", 2418 parport, pprt->port->base); 2419 else 2420 pr_info("panel driver not yet registered\n"); 2421 return 0; 2422} 2423 2424static void __exit panel_cleanup_module(void) 2425{ 2426 parport_unregister_driver(&panel_driver); 2427} 2428 2429module_init(panel_init_module); 2430module_exit(panel_cleanup_module); 2431MODULE_AUTHOR("Willy Tarreau"); 2432MODULE_LICENSE("GPL"); 2433 2434/* 2435 * Local variables: 2436 * c-indent-level: 4 2437 * tab-width: 8 2438 * End: 2439 */