Hot-pluggable parallel port debugging

This commit is contained in:
Jeremy Soller
2020-07-02 09:09:58 -06:00
committed by Jeremy Soller
parent 47aed0733e
commit 834aaf97e4
15 changed files with 127 additions and 306 deletions

View File

@ -4,18 +4,6 @@ EC=it5570e
KEYMAP?=default
SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c
# Set log level
# 0 - NONE
# 1 - ERROR
# 2 - WARN
# 3 - INFO
# 4 - DEBUG
# 5 - TRACE
CFLAGS+=-DLEVEL=4
# Enable I2C debug on 0x76
#CFLAGS+=-DI2C_DEBUGGER=0x76
# Set discrete GPU I2C bus
CFLAGS+=-DI2C_DGPU=I2C_1
@ -25,6 +13,17 @@ CFLAGS+=-DI2C_SMBUS=I2C_4
# Set touchpad PS2 bus
CFLAGS+=-DPS2_TOUCHPAD=PS2_3
# Set smart charger parameters
CFLAGS+=\
-DCHARGER_CHARGE_CURRENT=1536 \
-DCHARGER_CHARGE_VOLTAGE=12600 \
-DCHARGER_INPUT_CURRENT=11800
# Set CPU power limits in watts
CFLAGS+=\
-DPOWER_LIMIT_AC=180 \
-DPOWER_LIMIT_DC=28
# Custom fan curve
CLFAGS+=-DBOARD_HEATUP=5
CFLAGS+=-DBOARD_COOLDOWN=20
@ -36,12 +35,6 @@ CFLAGS+=-DBOARD_FAN_POINTS="\
FAN_POINT(80, 100) \
"
# Set smart charger parameters
CFLAGS+=\
-DCHARGER_CHARGE_CURRENT=1536 \
-DCHARGER_CHARGE_VOLTAGE=12600 \
-DCHARGER_INPUT_CURRENT=11800
# Enable DGPU support
CFLAGS+=-DHAVE_DGPU=1
CLFAGS+=-DBOARD_DGPU_HEATUP=5
@ -54,13 +47,5 @@ CFLAGS+=-DBOARD_DGPU_FAN_POINTS="\
FAN_POINT(80, 100) \
"
# Set CPU power limits in watts
CFLAGS+=\
-DPOWER_LIMIT_AC=180 \
-DPOWER_LIMIT_DC=28
# Enable debug logging over keyboard parallel port
#CFLAGS+=-DPARPORT_DEBUG
# Add system76 common code
include src/board/system76/common/common.mk

View File

@ -1,11 +1,27 @@
# Set log level
# 0 - NONE
# 1 - ERROR
# 2 - WARN
# 3 - INFO
# 4 - DEBUG
# 5 - TRACE
CFLAGS+=-DLEVEL=4
# Uncomment to enable debug logging over keyboard parallel port
#CFLAGS+=-DPARALLEL_DEBUG
# Uncomment to enable I2C debug on 0x76
#CFLAGS+=-DI2C_DEBUGGER=0x76
# Set external programmer
PROGRAMMER=$(wildcard /dev/serial/by-id/usb-Arduino*)
# Include system76 common source
SYSTEM76_COMMON_DIR=src/board/system76/common
SRC+=$(wildcard $(SYSTEM76_COMMON_DIR)/*.c)
INCLUDE+=$(wildcard $(SYSTEM76_COMMON_DIR)/include/common/*.h) $(SYSTEM76_COMMON_DIR)/common.mk
CFLAGS+=-I$(SYSTEM76_COMMON_DIR)/include
PROGRAMMER=$(wildcard /dev/serial/by-id/usb-Arduino*)
# Add scratch ROM
include $(SYSTEM76_COMMON_DIR)/scratch/scratch.mk

View File

@ -0,0 +1,11 @@
#ifndef _BOARD_PARALLEL_H
#define _BOARD_PARALLEL_H
#include <stdbool.h>
#include <stdint.h>
extern bool parallel_debug;
bool parallel_init(void);
int parallel_write(uint8_t * data, int length);
#endif // _BOARD_PARALLEL_H

View File

@ -27,6 +27,11 @@ void kbscan_init(void) {
KSOHGCTRL = 0xFF;
KSOHGOEN = 0;
KSOH2 = 0;
// Set all inputs to KBS mode, low, and inputs
KSIGCTRL = 0;
KSIGOEN = 0;
KSIGDAT = 0;
}
// Debounce time in milliseconds

View File

@ -27,9 +27,9 @@
#include <common/version.h>
#include <ec/ec.h>
#ifdef PARPORT_DEBUG
#include <ec/parallel.h>
#endif
#ifdef PARALLEL_DEBUG
#include <board/parallel.h>
#endif // PARALLEL_DEBUG
void external_0(void) __interrupt(0) {}
// timer_0 is in time.c
@ -55,11 +55,15 @@ void init(void) {
ecpm_init();
kbc_init();
kbled_init();
#ifdef PARPORT_DEBUG
parport_init();
#else
#ifdef PARALLEL_DEBUG
parallel_debug = false;
if (parallel_init()) {
parallel_debug = true;
} else
#endif // PARALLEL_DEBUG
{
kbscan_init();
#endif
}
peci_init();
pmc_init();
pwm_init();
@ -91,10 +95,13 @@ void main(void) {
power_event();
break;
case 1:
#ifndef PARPORT_DEBUG
#if PARALLEL_DEBUG
if (!parallel_debug)
#endif // PARALLEL_DEBUG
{
// Scans keyboard and sends keyboard packets
kbscan_event();
#endif
}
break;
case 2:
// Passes through touchpad packets

View File

@ -1,7 +1,7 @@
#include <arch/delay.h>
#include <arch/time.h>
#include <board/parallel.h>
#include <ec/kbscan.h>
#include <ec/parallel.h>
#include <stdbool.h>
@ -24,9 +24,23 @@
#define STS_WAIT (1 << 1)
// Maximum peripheral response time in ms
#define PARPORT_TIMEOUT 35
#define PARALLEL_TIMEOUT 10
void parport_init(void) {
bool parallel_debug = false;
static bool parallel_wait_peripheral(uint8_t mask, uint8_t value) {
uint32_t start = time_get();
while (time_get() < start + PARALLEL_TIMEOUT) {
if ((KSOHGDMRR & mask) == value) {
return true;
}
}
return false;
}
bool parallel_init(void) {
// XXX: Needed? Pull-ups, open-drain are always disabled in GPIO mode
KSOCTRL = 0;
// XXX: Needed? OVRPPK is for KBS mode, pull-ups are always disabled in GPIO mode
@ -52,7 +66,7 @@ void parport_init(void) {
// Deassert nWRITE, nDATASTB, nADDRSTB
KSIGDAT |= CTL_WRITE | CTL_DATA | CTL_ADDR;
// Set nWAIT high
// PUll up nWAIT
KSOH1 |= STS_WAIT;
// Pull up data lines
@ -60,21 +74,12 @@ void parport_init(void) {
// Deassert nRESET
KSIGDAT |= CTL_RESET;
// Check if there is a peripheral waiting
return parallel_wait_peripheral(STS_WAIT, 0);
}
bool parport_wait_peripheral(uint8_t mask, uint8_t value) {
uint32_t start = time_get();
while (time_get() < start + PARPORT_TIMEOUT) {
if ((KSOHGDMRR & mask) == value) {
return true;
}
}
return false;
}
int parport_write(uint8_t * data, int length) {
int parallel_write(uint8_t * data, int length) {
// Assert nWRITE
KSIGDAT &= ~CTL_WRITE;
@ -84,7 +89,7 @@ int parport_write(uint8_t * data, int length) {
int i;
for (i = 0; i < length; i++) {
// Wait for peripheral to indicate it's ready for next cycle
if (!parport_wait_peripheral(STS_WAIT, 0)) {
if (!parallel_wait_peripheral(STS_WAIT, 0)) {
break;
}
@ -95,7 +100,7 @@ int parport_write(uint8_t * data, int length) {
KSIGDAT &= ~CTL_DATA;
// Wait for peripheral to indicate it's processing
if (!parport_wait_peripheral(STS_WAIT, STS_WAIT)) {
if (!parallel_wait_peripheral(STS_WAIT, STS_WAIT)) {
KSIGDAT |= CTL_DATA;
break;
}
@ -104,7 +109,7 @@ int parport_write(uint8_t * data, int length) {
KSIGDAT |= CTL_DATA;
// Wait for peripheral to indicate it's ready for next cycle
if (!parport_wait_peripheral(STS_WAIT, 0)) {
if (!parallel_wait_peripheral(STS_WAIT, 0)) {
break;
}

View File

@ -10,21 +10,28 @@
#include <ec/i2c.h>
#endif
#ifdef PARPORT_DEBUG
#include <ec/parallel.h>
#endif
#ifdef PARALLEL_DEBUG
#include <board/parallel.h>
#endif // PARALLEL_DEBUG
int putchar(int c) {
unsigned char byte = (unsigned char)c;
smfi_debug(byte);
#ifdef SERIAL_DEBUGGER
SBUF = byte;
#endif
#ifdef I2C_DEBUGGER
i2c_send(&I2C_SMBUS, I2C_DEBUGGER, &byte, 1);
#endif
#ifdef PARPORT_DEBUG
parport_write(&byte, 1);
#endif
#ifdef PARALLEL_DEBUG
if (parallel_debug) {
parallel_write(&byte, 1);
}
#endif // PARALLEL_DEBUG
return (int)byte;
}

View File

@ -4,21 +4,12 @@ EC=it8587e
KEYMAP?=default
SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c
# Set log level
# 0 - NONE
# 1 - ERROR
# 2 - WARN
# 3 - INFO
# 4 - DEBUG
# 5 - TRACE
CFLAGS+=-DLEVEL=4
# Enable I2C debug on 0x76
#CFLAGS+=-DI2C_DEBUGGER=0x76
# Set battery I2C bus
CFLAGS+=-DI2C_SMBUS=I2C_0
# Set keyboard LED I2C bus
CFLAGS+=-DI2C_KBLED=I2C_1
# Set touchpad PS2 bus
CFLAGS+=-DPS2_TOUCHPAD=PS2_3
@ -28,11 +19,5 @@ CFLAGS+=\
-DCHARGER_CHARGE_VOLTAGE=17600 \
-DCHARGER_INPUT_CURRENT=3200
# Set keyboard LED I2C bus
CFLAGS+=-DI2C_KBLED=I2C_1
# Enable debug logging over keyboard parallel port
#CFLAGS+=-DPARPORT_DEBUG
# Add system76 common code
include src/board/system76/common/common.mk

View File

@ -4,18 +4,6 @@ EC=it8587e
KEYMAP?=default
SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c
# Set log level
# 0 - NONE
# 1 - ERROR
# 2 - WARN
# 3 - INFO
# 4 - DEBUG
# 5 - TRACE
CFLAGS+=-DLEVEL=4
# Enable I2C debug on 0x76
#CFLAGS+=-DI2C_DEBUGGER=0x76
# Set battery I2C bus
CFLAGS+=-DI2C_SMBUS=I2C_0
@ -28,8 +16,5 @@ CFLAGS+=\
-DCHARGER_CHARGE_VOLTAGE=13056 \
-DCHARGER_INPUT_CURRENT=1920
# Enable debug logging over keyboard parallel port
#CFLAGS+=-DPARPORT_DEBUG
# Add system76 common code
include src/board/system76/common/common.mk

View File

@ -4,18 +4,6 @@ EC=it5570e
KEYMAP?=default
SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c
# Set log level
# 0 - NONE
# 1 - ERROR
# 2 - WARN
# 3 - INFO
# 4 - DEBUG
# 5 - TRACE
CFLAGS+=-DLEVEL=4
# Enable I2C debug on 0x76
#CFLAGS+=-DI2C_DEBUGGER=0x76
# Set discrete GPU I2C bus
CFLAGS+=-DI2C_DGPU=I2C_1
@ -25,6 +13,17 @@ CFLAGS+=-DI2C_SMBUS=I2C_4
# Set touchpad PS2 bus
CFLAGS+=-DPS2_TOUCHPAD=PS2_3
# Set smart charger parameters
CFLAGS+=\
-DCHARGER_CHARGE_CURRENT=1536 \
-DCHARGER_CHARGE_VOLTAGE=16800 \
-DCHARGER_INPUT_CURRENT=9230
# Set CPU power limits in watts
CFLAGS+=\
-DPOWER_LIMIT_AC=180 \
-DPOWER_LIMIT_DC=28
# Custom fan curve
CLFAGS+=-DBOARD_HEATUP=5
CFLAGS+=-DBOARD_COOLDOWN=20
@ -36,12 +35,6 @@ CFLAGS+=-DBOARD_FAN_POINTS="\
FAN_POINT(80, 100) \
"
# Set smart charger parameters
CFLAGS+=\
-DCHARGER_CHARGE_CURRENT=1536 \
-DCHARGER_CHARGE_VOLTAGE=16800 \
-DCHARGER_INPUT_CURRENT=9230
# Enable DGPU support
CFLAGS+=-DHAVE_DGPU=1
CLFAGS+=-DBOARD_DGPU_HEATUP=5
@ -54,13 +47,5 @@ CFLAGS+=-DBOARD_DGPU_FAN_POINTS="\
FAN_POINT(80, 100) \
"
# Set CPU power limits in watts
CFLAGS+=\
-DPOWER_LIMIT_AC=180 \
-DPOWER_LIMIT_DC=28
# Enable debug logging over keyboard parallel port
#CFLAGS+=-DPARPORT_DEBUG
# Add system76 common code
include src/board/system76/common/common.mk

View File

@ -4,18 +4,6 @@ EC=it5570e
KEYMAP?=default
SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c
# Set log level
# 0 - NONE
# 1 - ERROR
# 2 - WARN
# 3 - INFO
# 4 - DEBUG
# 5 - TRACE
CFLAGS+=-DLEVEL=4
# Enable I2C debug on 0x76
#CFLAGS+=-DI2C_DEBUGGER=0x76
# Set battery I2C bus
CFLAGS+=-DI2C_SMBUS=I2C_4
@ -29,8 +17,5 @@ CFLAGS+=\
-DCHARGER_CHARGE_VOLTAGE=8800 \
-DCHARGER_INPUT_CURRENT=1600
# Enable debug logging over keyboard parallel port
#CFLAGS+=-DPARPORT_DEBUG
# Add system76 common code
include src/board/system76/common/common.mk

View File

@ -4,18 +4,6 @@ EC=it5570e
KEYMAP?=default
SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c
# Set log level
# 0 - NONE
# 1 - ERROR
# 2 - WARN
# 3 - INFO
# 4 - DEBUG
# 5 - TRACE
CFLAGS+=-DLEVEL=4
# Enable I2C debug on 0x76
#CFLAGS+=-DI2C_DEBUGGER=0x76
# Set discrete GPU I2C bus
CFLAGS+=-DI2C_DGPU=I2C_1
@ -25,6 +13,17 @@ CFLAGS+=-DI2C_SMBUS=I2C_4
# Set touchpad PS2 bus
CFLAGS+=-DPS2_TOUCHPAD=PS2_3
# Set smart charger parameters
CFLAGS+=\
-DCHARGER_CHARGE_CURRENT=1536 \
-DCHARGER_CHARGE_VOLTAGE=16800 \
-DCHARGER_INPUT_CURRENT=13050
# Set CPU power limits in watts
CFLAGS+=\
-DPOWER_LIMIT_AC=180 \
-DPOWER_LIMIT_DC=28
# Custom fan curve
CLFAGS+=-DBOARD_HEATUP=5
CFLAGS+=-DBOARD_COOLDOWN=20
@ -36,12 +35,6 @@ CFLAGS+=-DBOARD_FAN_POINTS="\
FAN_POINT(80, 100) \
"
# Set smart charger parameters
CFLAGS+=\
-DCHARGER_CHARGE_CURRENT=1536 \
-DCHARGER_CHARGE_VOLTAGE=16800 \
-DCHARGER_INPUT_CURRENT=13050
# Enable DGPU support
CFLAGS+=-DHAVE_DGPU=1
CLFAGS+=-DBOARD_DGPU_HEATUP=5
@ -54,13 +47,5 @@ CFLAGS+=-DBOARD_DGPU_FAN_POINTS="\
FAN_POINT(80, 100) \
"
# Set CPU power limits in watts
CFLAGS+=\
-DPOWER_LIMIT_AC=180 \
-DPOWER_LIMIT_DC=28
# Enable debug logging over keyboard parallel port
#CFLAGS+=-DPARPORT_DEBUG
# Add system76 common code
include src/board/system76/common/common.mk

View File

@ -1,9 +0,0 @@
#ifndef _EC_PARALLEL_H
#define _EC_PARALLEL_H
#include <stdint.h>
void parport_init(void);
int parport_write(uint8_t * data, int length);
#endif // _EC_PARALLEL_H

View File

@ -1,9 +0,0 @@
#ifndef _EC_PARALLEL_H
#define _EC_PARALLEL_H
#include <stdint.h>
void parport_init(void);
int parport_write(uint8_t * data, int length);
#endif // _EC_PARALLEL_H

View File

@ -1,122 +0,0 @@
#include <arch/delay.h>
#include <arch/time.h>
#include <ec/kbscan.h>
#include <ec/parallel.h>
#include <stdbool.h>
/*
* nWRITE = KSI[0]
* nDATASTB = KSI[1]
* nRESET = KSI[2]
* nADDRSTB = KSI[3]
*
* AD[8:1] = KSOL[7:0]
* nINTR = KSOH[0]
* nWAIT = KSOH[1]
*/
#define CTL_WRITE (1 << 0)
#define CTL_DATA (1 << 1)
#define CTL_RESET (1 << 2)
#define CTL_ADDR (1 << 3)
#define STS_WAIT (1 << 1)
// Maximum peripheral response time in ms
#define PARPORT_TIMEOUT 35
void parport_init(void) {
// XXX: Needed? Pull-ups, open-drain are always disabled in GPIO mode
KSOCTRL = 0;
// XXX: Needed? OVRPPK is for KBS mode, pull-ups are always disabled in GPIO mode
KSICTRLR = 0;
// Set all outputs to GPIO mode, low, and inputs
KSOL = 0;
KSOLGCTRL = 0xFF;
KSOLGOEN = 0;
KSOH1 = 0;
KSOHGCTRL = 0xFF;
KSOHGOEN = 0;
KSOH2 = 0;
// Set control lines as outputs, low
KSIGCTRL = 0xFF;
KSIGOEN = 0x0F;
KSIGDAT = 0;
// Assert nRESET
KSIGDAT &= ~CTL_RESET;
// Deassert nWRITE, nDATASTB, nADDRSTB
KSIGDAT |= CTL_WRITE | CTL_DATA | CTL_ADDR;
// Set nWAIT high
KSOH1 |= STS_WAIT;
// Pull up data lines
KSOL = 0xFF;
// Deassert nRESET
KSIGDAT |= CTL_RESET;
}
bool parport_wait_peripheral(uint8_t mask, uint8_t value) {
uint32_t start = time_get();
while (time_get() < start + PARPORT_TIMEOUT) {
if ((KSOHGDMRR & mask) == value) {
return true;
}
}
return false;
}
int parport_write(uint8_t * data, int length) {
// Assert nWRITE
KSIGDAT &= ~CTL_WRITE;
// Set data lines as outputs
KSOLGOEN = 0xFF;
int i;
for (i = 0; i < length; i++) {
// Wait for peripheral to indicate it's ready for next cycle
if (!parport_wait_peripheral(STS_WAIT, 0)) {
break;
}
// Write data to port
KSOL = data[i];
// Assert nDATASTB
KSIGDAT &= ~CTL_DATA;
// Wait for peripheral to indicate it's processing
if (!parport_wait_peripheral(STS_WAIT, STS_WAIT)) {
KSIGDAT |= CTL_DATA;
break;
}
// Deassert nDATASTB
KSIGDAT |= CTL_DATA;
// Wait for peripheral to indicate it's ready for next cycle
if (!parport_wait_peripheral(STS_WAIT, 0)) {
break;
}
// Reset data lines to high
KSOL = 0xFF;
}
// Set data lines back to inputs
KSOLGOEN = 0;
// Deassert nWRITE
KSIGDAT |= CTL_WRITE;
return i;
}