hd44780: Add keystring array boundary check. Have all subdrivers close
previously opened devices.
This commit is contained in:
@@ -75,6 +75,7 @@
|
|||||||
|
|
||||||
void i2c_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch);
|
void i2c_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch);
|
||||||
void i2c_HD44780_backlight(PrivateData *p, unsigned char state);
|
void i2c_HD44780_backlight(PrivateData *p, unsigned char state);
|
||||||
|
void i2c_HD44780_close(PrivateData *p);
|
||||||
|
|
||||||
#define RS 0x10
|
#define RS 0x10
|
||||||
#define RW 0x20
|
#define RW 0x20
|
||||||
@@ -163,6 +164,7 @@ hd_init_i2c(Driver *drvthis)
|
|||||||
|
|
||||||
hd44780_functions->senddata = i2c_HD44780_senddata;
|
hd44780_functions->senddata = i2c_HD44780_senddata;
|
||||||
hd44780_functions->backlight = i2c_HD44780_backlight;
|
hd44780_functions->backlight = i2c_HD44780_backlight;
|
||||||
|
hd44780_functions->close = i2c_HD44780_close;
|
||||||
|
|
||||||
// powerup the lcd now
|
// powerup the lcd now
|
||||||
/* We'll now send 0x03 a couple of times,
|
/* We'll now send 0x03 a couple of times,
|
||||||
@@ -216,6 +218,18 @@ hd_init_i2c(Driver *drvthis)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the device.
|
||||||
|
* \param p Pointer to driver's private data structure.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
i2c_HD44780_close(PrivateData *p) {
|
||||||
|
if (p->fd >= 0) {
|
||||||
|
close(p->fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send data or commands to the display.
|
* Send data or commands to the display.
|
||||||
* \param p Pointer to driver's private data structure.
|
* \param p Pointer to driver's private data structure.
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ extern unsigned int **bitrate_conversion;
|
|||||||
extern int convert_bitrate(unsigned int conf_bitrate, size_t *bitrate);
|
extern int convert_bitrate(unsigned int conf_bitrate, size_t *bitrate);
|
||||||
|
|
||||||
void lis2_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch);
|
void lis2_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch);
|
||||||
|
void lis2_HD44780_close(PrivateData *p);
|
||||||
|
|
||||||
static void clearScreen(int fd);
|
static void clearScreen(int fd);
|
||||||
static void gotoXY(int fd, unsigned char x, unsigned char y);
|
static void gotoXY(int fd, unsigned char x, unsigned char y);
|
||||||
@@ -131,6 +132,7 @@ int hd_init_lis2(Driver *drvthis)
|
|||||||
tcsetattr(p->fd, TCSANOW, &portset);
|
tcsetattr(p->fd, TCSANOW, &portset);
|
||||||
|
|
||||||
p->hd44780_functions->senddata = lis2_HD44780_senddata;
|
p->hd44780_functions->senddata = lis2_HD44780_senddata;
|
||||||
|
p->hd44780_functions->close = lis2_HD44780_close;
|
||||||
|
|
||||||
common_init(p, IF_8BIT);
|
common_init(p, IF_8BIT);
|
||||||
|
|
||||||
@@ -138,6 +140,18 @@ int hd_init_lis2(Driver *drvthis)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the device.
|
||||||
|
* \param p Pointer to driver's private data structure.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
lis2_HD44780_close(PrivateData *p) {
|
||||||
|
if (p->fd >= 0) {
|
||||||
|
close(p->fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send data or commands to the display.
|
* Send data or commands to the display.
|
||||||
* \param p Pointer to driver's private data structure.
|
* \param p Pointer to driver's private data structure.
|
||||||
|
|||||||
@@ -334,7 +334,9 @@ serial_HD44780_scankeypad(PrivateData *p)
|
|||||||
void
|
void
|
||||||
serial_HD44780_close(PrivateData *p)
|
serial_HD44780_close(PrivateData *p)
|
||||||
{
|
{
|
||||||
if (SERIAL_IF.end_code)
|
if (p->fd >= 0) {
|
||||||
write(p->fd, &SERIAL_IF.end_code, 1);
|
if (SERIAL_IF.end_code)
|
||||||
close(p->fd);
|
write(p->fd, &SERIAL_IF.end_code, 1);
|
||||||
|
close(p->fd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -168,7 +168,8 @@ usblcd_HD44780_backlight(PrivateData *p, unsigned char state)
|
|||||||
void
|
void
|
||||||
usblcd_HD44780_close(PrivateData *p)
|
usblcd_HD44780_close(PrivateData *p)
|
||||||
{
|
{
|
||||||
close(p->fd);
|
if (p->fd >= 0)
|
||||||
|
close(p->fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|||||||
@@ -164,6 +164,7 @@ HD44780_init(Driver *drvthis)
|
|||||||
p->cellwidth = 5;
|
p->cellwidth = 5;
|
||||||
p->ccmode = standard;
|
p->ccmode = standard;
|
||||||
p->backlightstate = -1; // Init to invalid value
|
p->backlightstate = -1; // Init to invalid value
|
||||||
|
p->fd = -1;
|
||||||
|
|
||||||
|
|
||||||
//// READ THE CONFIG FILE
|
//// READ THE CONFIG FILE
|
||||||
@@ -1250,7 +1251,13 @@ HD44780_get_key(Driver *drvthis)
|
|||||||
|
|
||||||
scancode = p->hd44780_functions->scankeypad(p);
|
scancode = p->hd44780_functions->scankeypad(p);
|
||||||
if (scancode != '\0') {
|
if (scancode != '\0') {
|
||||||
// TODO: check if arrays are large enough
|
// Check if arrays are large enough
|
||||||
|
if ((scancode&0x0F) > KEYPAD_MAXX || ((scancode&0xF0)>>4) > KEYPAD_MAXY) {
|
||||||
|
report(RPT_WARNING, "HD44780_get_key: Scancode out of range: %d",
|
||||||
|
scancode);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
keystr = (scancode & 0xF0)
|
keystr = (scancode & 0xF0)
|
||||||
? p->keyMapMatrix[((scancode&0xF0)>>4)-1][(scancode&0x0F)-1]
|
? p->keyMapMatrix[((scancode&0xF0)>>4)-1][(scancode&0x0F)-1]
|
||||||
: p->keyMapDirect[scancode - 1];
|
: p->keyMapDirect[scancode - 1];
|
||||||
|
|||||||
Reference in New Issue
Block a user