• Home
  • Raw
  • Download

Lines Matching +full:40 +full:- +full:bit

1 // SPDX-License-Identifier: GPL-2.0+
4 * Copyright (C) 2000-2008, Willy Tarreau <w@1wt.eu>
5 * Copyright (C) 2016-2017 Glider bvba
10 * The LCD module may either be an HD44780-like 8-bit parallel LCD, or a 1-bit
15 * data output pins or to the ground. The combinations have to be hard-coded
22 * - the initialization/deinitialization process is very dirty and should
26 * - document 24 keys keyboard (3 rows of 8 cols, 32 diodes + 2 inputs)
27 * - make the LCD a part of a virtual screen of Vx*Vy
28 * - make the inputs list smp-safe
29 * - change the keyboard to a double mapping : signals -> key_id -> values
82 #define PNL_PBIDIR 0x20 /* bi-directional ports */
83 /* high to read data in or-ed with data out */
114 #define NOT_SET -1
117 #define r_ctr(x) (parport_read_control((x)->port))
118 #define r_dtr(x) (parport_read_data((x)->port))
119 #define r_str(x) (parport_read_status((x)->port))
120 #define w_ctr(x, y) (parport_write_control((x)->port, (y)))
121 #define w_dtr(x, y) (parport_write_data((x)->port, (y)))
158 /* strings can be non null-terminated */
176 * <-----unused------><gnd><d07><d06><d05><d04><d03><d02><d01><d00>
201 /* lcd-specific variables */
226 * Bit masks to convert LCD signals to parallel port outputs.
235 * one entry for each bit on the LCD
246 * each bit can be either connected to a DATA or CTRL port
303 #define DEFAULT_LCD_WIDTH 40
304 #define DEFAULT_LCD_BWIDTH 40
401 /* Device single-open policy control */
421 "4=16x2 nexcom; default=40x2, old kp");
431 "LCD type: 0=none, 1=compiled-in, 2=old, 3=serial ks0074, 4=hantronix, 5=nexcom");
441 static int lcd_bwidth = NOT_SET; /* internal buffer width (usually 40) */
443 MODULE_PARM_DESC(lcd_bwidth, "Internal LCD line width (40)");
461 * (negative) if the signal is negated. -MAXINT is used to indicate that the
470 "# of the // port pin connected to LCD 'E' signal, with polarity (-17..17)");
475 "# of the // port pin connected to LCD 'RS' signal, with polarity (-17..17)");
480 "# of the // port pin connected to LCD 'RW' signal, with polarity (-17..17)");
485 "# of the // port pin connected to serial LCD 'SCL' signal, with polarity (-17..17)");
490 "# of the // port pin connected to serial LCD 'SDA' signal, with polarity (-17..17)");
495 "# of the // port pin connected to LCD backlight, with polarity (-17..17)");
497 /* Deprecated module parameters - consider not using them anymore */
569 {"a-p-e-", "Down\n", "Down\n", ""},
570 {"a-p-E-", "Ret\n", "Ret\n", ""},
571 {"a-P-E-", "Esc\n", "Esc\n", ""},
572 {"a-P-e-", "Up\n", "Up\n", ""},
583 unsigned int bit, state; in lcd_get_bits() local
585 for (bit = 0; bit < LCD_BITS; bit++) { in lcd_get_bits()
586 state = test_bit(bit, bits) ? BIT_SET : BIT_CLR; in lcd_get_bits()
587 *val &= lcd_bits[port][bit][BIT_MSK]; in lcd_get_bits()
588 *val |= lcd_bits[port][bit][state]; in lcd_get_bits()
622 * Converts a parallel port pin (from -25 to 25) to data and control ports
624 * unconnected if it's on pin 0 or an invalid pin (<-25 or >25).
646 pin = -pin; in pin_to_bits()
656 case PIN_D0...PIN_D7: /* D0 - D7 = 2 - 9 */ in pin_to_bits()
657 d_bit = 1 << (pin - 2); in pin_to_bits()
689 int bit; in lcd_send_serial() local
692 * the data bit is set on D0, and the clock on STROBE. in lcd_send_serial()
695 for (bit = 0; bit < 8; bit++) { in lcd_send_serial()
736 udelay(40); /* the shortest command takes at least 40 us */ in lcd_write_cmd_s()
747 udelay(40); /* the shortest data takes at least 40 us */ in lcd_write_data_s()
764 udelay(40); /* maintain the strobe during 40 us */ in lcd_write_cmd_p8()
786 udelay(40); /* maintain the strobe during 40 us */ in lcd_write_data_p8()
821 for (pos = 0; pos < charlcd->height * charlcd->hwidth; pos++) { in lcd_clear_fast_s()
825 /* the shortest data takes at least 40 us */ in lcd_clear_fast_s()
826 udelay(40); in lcd_clear_fast_s()
837 for (pos = 0; pos < charlcd->height * charlcd->hwidth; pos++) { in lcd_clear_fast_p8()
849 /* maintain the strobe during 40 us */ in lcd_clear_fast_p8()
850 udelay(40); in lcd_clear_fast_p8()
867 for (pos = 0; pos < charlcd->height * charlcd->hwidth; pos++) { in lcd_clear_fast_tilcd()
907 * Init lcd struct with load-time values to preserve exact in lcd_init()
910 charlcd->height = lcd_height; in lcd_init()
911 charlcd->width = lcd_width; in lcd_init()
912 charlcd->bwidth = lcd_bwidth; in lcd_init()
913 charlcd->hwidth = lcd_hwidth; in lcd_init()
923 charlcd->width = 40; in lcd_init()
924 charlcd->bwidth = 40; in lcd_init()
925 charlcd->hwidth = 64; in lcd_init()
926 charlcd->height = 2; in lcd_init()
936 charlcd->width = 16; in lcd_init()
937 charlcd->bwidth = 40; in lcd_init()
938 charlcd->hwidth = 16; in lcd_init()
939 charlcd->height = 2; in lcd_init()
949 charlcd->width = 16; in lcd_init()
950 charlcd->bwidth = 40; in lcd_init()
951 charlcd->hwidth = 64; in lcd_init()
952 charlcd->height = 2; in lcd_init()
955 /* customer-defined */ in lcd_init()
961 /* parallel mode, 8 bits, hantronix-like */ in lcd_init()
968 charlcd->width = 16; in lcd_init()
969 charlcd->bwidth = 40; in lcd_init()
970 charlcd->hwidth = 64; in lcd_init()
971 charlcd->height = 2; in lcd_init()
977 charlcd->height = lcd_height; in lcd_init()
979 charlcd->width = lcd_width; in lcd_init()
981 charlcd->bwidth = lcd_bwidth; in lcd_init()
983 charlcd->hwidth = lcd_hwidth; in lcd_init()
1002 if (charlcd->width <= 0) in lcd_init()
1003 charlcd->width = DEFAULT_LCD_WIDTH; in lcd_init()
1004 if (charlcd->bwidth <= 0) in lcd_init()
1005 charlcd->bwidth = DEFAULT_LCD_BWIDTH; in lcd_init()
1006 if (charlcd->hwidth <= 0) in lcd_init()
1007 charlcd->hwidth = DEFAULT_LCD_HWIDTH; in lcd_init()
1008 if (charlcd->height <= 0) in lcd_init()
1009 charlcd->height = DEFAULT_LCD_HEIGHT; in lcd_init()
1012 charlcd->ops = &charlcd_serial_ops; in lcd_init()
1020 charlcd->ops = &charlcd_parallel_ops; in lcd_init()
1029 charlcd->ops = &charlcd_tilcd_ops; in lcd_init()
1052 charlcd->char_conv = lcd_char_conv_ks0074; in lcd_init()
1054 charlcd->char_conv = NULL; in lcd_init()
1084 if (file->f_flags & O_NONBLOCK) in keypad_read()
1085 return -EAGAIN; in keypad_read()
1089 return -EINTR; in keypad_read()
1092 for (; count-- > 0 && (keypad_buflen > 0); in keypad_read()
1093 ++i, ++tmp, --keypad_buflen) { in keypad_read()
1099 return tmp - buf; in keypad_read()
1106 ret = -EBUSY; in keypad_open()
1110 ret = -EPERM; in keypad_open()
1111 if (file->f_mode & FMODE_WRITE) /* device is read-only */ in keypad_open()
1144 while (max_len-- && keypad_buflen < KEYPAD_BUFFER && *string) { in keypad_send_key()
1153 * and puts the results in the bitfield "phys_read" (one bit per established
1164 int bit, bitval; in phys_scan_contacts() local
1178 /* will have a 1 for each bit set to gnd */ in phys_scan_contacts()
1190 /* grounded inputs are signals 40-44 */ in phys_scan_contacts()
1191 phys_read |= (__u64)gndmask << 40; in phys_scan_contacts()
1199 for (bit = 0; bit < 8; bit++) { in phys_scan_contacts()
1200 bitval = BIT(bit); in phys_scan_contacts()
1207 phys_read |= (__u64)bitmask << (5 * bit); in phys_scan_contacts()
1224 * transitions from single-key to multiple-key, but in input_state_high()
1233 * someone adds a bit, so this signal was a false in input_state_high()
1237 * eg: 0 -(press A)-> A -(press B)-> AB : don't match A's release. in input_state_high()
1239 if (((phys_prev & input->mask) == input->value) && in input_state_high()
1240 ((phys_curr & input->mask) > input->value)) { in input_state_high()
1241 input->state = INPUT_ST_LOW; /* invalidate */ in input_state_high()
1246 if ((phys_curr & input->mask) == input->value) { in input_state_high()
1247 if ((input->type == INPUT_TYPE_STD) && in input_state_high()
1248 (input->high_timer == 0)) { in input_state_high()
1249 input->high_timer++; in input_state_high()
1250 if (input->u.std.press_fct) in input_state_high()
1251 input->u.std.press_fct(input->u.std.press_data); in input_state_high()
1252 } else if (input->type == INPUT_TYPE_KBD) { in input_state_high()
1256 if (input->high_timer == 0) { in input_state_high()
1257 char *press_str = input->u.kbd.press_str; in input_state_high()
1260 int s = sizeof(input->u.kbd.press_str); in input_state_high()
1266 if (input->u.kbd.repeat_str[0]) { in input_state_high()
1267 char *repeat_str = input->u.kbd.repeat_str; in input_state_high()
1269 if (input->high_timer >= KEYPAD_REP_START) { in input_state_high()
1270 int s = sizeof(input->u.kbd.repeat_str); in input_state_high()
1272 input->high_timer -= KEYPAD_REP_DELAY; in input_state_high()
1279 if (input->high_timer < 255) in input_state_high()
1280 input->high_timer++; in input_state_high()
1286 input->state = INPUT_ST_FALLING; in input_state_high()
1287 input->fall_timer = 0; in input_state_high()
1296 if (((phys_prev & input->mask) == input->value) && in input_state_falling()
1297 ((phys_curr & input->mask) > input->value)) { in input_state_falling()
1298 input->state = INPUT_ST_LOW; /* invalidate */ in input_state_falling()
1303 if ((phys_curr & input->mask) == input->value) { in input_state_falling()
1304 if (input->type == INPUT_TYPE_KBD) { in input_state_falling()
1308 if (input->u.kbd.repeat_str[0]) { in input_state_falling()
1309 char *repeat_str = input->u.kbd.repeat_str; in input_state_falling()
1311 if (input->high_timer >= KEYPAD_REP_START) { in input_state_falling()
1312 int s = sizeof(input->u.kbd.repeat_str); in input_state_falling()
1314 input->high_timer -= KEYPAD_REP_DELAY; in input_state_falling()
1321 if (input->high_timer < 255) in input_state_falling()
1322 input->high_timer++; in input_state_falling()
1324 input->state = INPUT_ST_HIGH; in input_state_falling()
1325 } else if (input->fall_timer >= input->fall_time) { in input_state_falling()
1327 if (input->type == INPUT_TYPE_STD) { in input_state_falling()
1328 void (*release_fct)(int) = input->u.std.release_fct; in input_state_falling()
1331 release_fct(input->u.std.release_data); in input_state_falling()
1332 } else if (input->type == INPUT_TYPE_KBD) { in input_state_falling()
1333 char *release_str = input->u.kbd.release_str; in input_state_falling()
1336 int s = sizeof(input->u.kbd.release_str); in input_state_falling()
1342 input->state = INPUT_ST_LOW; in input_state_falling()
1344 input->fall_timer++; in input_state_falling()
1356 switch (input->state) { in panel_process_inputs()
1358 if ((phys_curr & input->mask) != input->value) in panel_process_inputs()
1364 * eg: AB -(release B)-> A -(release A)-> 0 : in panel_process_inputs()
1367 if ((phys_prev & input->mask) == input->value) in panel_process_inputs()
1369 input->rise_timer = 0; in panel_process_inputs()
1370 input->state = INPUT_ST_RISING; in panel_process_inputs()
1373 if ((phys_curr & input->mask) != input->value) { in panel_process_inputs()
1374 input->state = INPUT_ST_LOW; in panel_process_inputs()
1377 if (input->rise_timer < input->rise_time) { in panel_process_inputs()
1379 input->rise_timer++; in panel_process_inputs()
1382 input->high_timer = 0; in panel_process_inputs()
1383 input->state = INPUT_ST_HIGH; in panel_process_inputs()
1425 /* converts a name of the form "({BbAaPpSsEe}{01234567-})*" to a series of bits.
1426 * if <omask> or <imask> are non-null, they will be or'ed with the bits
1442 int in, out, bit, neg; in input_name2mask() local
1449 in = idx - sigtab; in input_name2mask()
1452 im |= BIT(in); in input_name2mask()
1456 out = *name - '0'; in input_name2mask()
1457 om |= BIT(out); in input_name2mask()
1458 } else if (*name == '-') { in input_name2mask()
1461 return 0; /* unknown bit name */ in input_name2mask()
1464 bit = (out * 5) + in; in input_name2mask()
1466 m |= 1ULL << bit; in input_name2mask()
1468 v |= 1ULL << bit; in input_name2mask()
1494 if (!input_name2mask(name, &key->mask, &key->value, &scan_mask_i, in panel_bind_key()
1500 key->type = INPUT_TYPE_KBD; in panel_bind_key()
1501 key->state = INPUT_ST_LOW; in panel_bind_key()
1502 key->rise_time = 1; in panel_bind_key()
1503 key->fall_time = 1; in panel_bind_key()
1505 strncpy(key->u.kbd.press_str, press, sizeof(key->u.kbd.press_str)); in panel_bind_key()
1506 strncpy(key->u.kbd.repeat_str, repeat, sizeof(key->u.kbd.repeat_str)); in panel_bind_key()
1507 strncpy(key->u.kbd.release_str, release, in panel_bind_key()
1508 sizeof(key->u.kbd.release_str)); in panel_bind_key()
1509 list_add(&key->list, &logical_inputs); in panel_bind_key()
1533 if (!input_name2mask(name, &callback->mask, &callback->value,
1537 callback->type = INPUT_TYPE_STD;
1538 callback->state = INPUT_ST_LOW;
1539 callback->rise_time = 1;
1540 callback->fall_time = 1;
1541 callback->u.std.press_fct = press_fct;
1542 callback->u.std.press_data = press_data;
1543 callback->u.std.release_fct = release_fct;
1544 callback->u.std.release_data = release_data;
1545 list_add(&callback->list, &logical_inputs);
1578 if (port->number != parport) in panel_attach()
1582 pr_err("%s: port->number=%d parport=%d, already registered!\n", in panel_attach()
1583 __func__, port->number, parport); in panel_attach()
1593 pr_err("%s: port->number=%d parport=%d, parport_register_device() failed\n", in panel_attach()
1594 __func__, port->number, parport); in panel_attach()
1634 if (port->number != parport) in panel_detach()
1638 pr_err("%s: port->number=%d parport=%d, nothing to unregister.\n", in panel_detach()
1639 __func__, port->number, parport); in panel_detach()
1699 /* 8 bits, 2*16 hantronix-like, no keypad */ in panel_init_module()
1709 /* 8 bits, 2*40, old keypad */ in panel_init_module()
1735 * Init lcd struct with load-time values to preserve exact in panel_init_module()
1766 return -ENODEV; in panel_init_module()
1777 parport, pprt->port->base); in panel_init_module()
1795 * c-indent-level: 4
1796 * tab-width: 8