Merge branch 'master' of https://github.com/system76/ec
This commit is contained in:
commit
ebcb6af3f5
2
ecflash
2
ecflash
@ -1 +1 @@
|
||||
Subproject commit 5a9300d804df6b658196f690a10ba8fc7e821a78
|
||||
Subproject commit 945ec8d276edd78f26cd744624344e67549824ad
|
@ -59,9 +59,15 @@ uint8_t acpi_read(uint8_t addr) {
|
||||
ACPI_16(0x1A, battery_full_capacity);
|
||||
ACPI_16(0x22, battery_design_voltage);
|
||||
|
||||
// Bypass status test in ACPI - TODO
|
||||
case 0x26:
|
||||
data |= 1 << 1;
|
||||
// If AC adapter connected
|
||||
if (!gpio_get(&ACIN_N)) {
|
||||
// And battery is not fully charged
|
||||
if (!(battery_status & 0x0020)) {
|
||||
// Battery is charging
|
||||
data |= 1 << 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
ACPI_16(0x2A, battery_current);
|
||||
|
@ -11,10 +11,10 @@ SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c
|
||||
# 3 - INFO
|
||||
# 4 - DEBUG
|
||||
# 5 - TRACE
|
||||
CFLAGS+=-DLEVEL=2
|
||||
CFLAGS+=-DLEVEL=4
|
||||
|
||||
# Enable I2C debug on 0x76
|
||||
CFLAGS+=-DI2C_DEBUGGER=0x76
|
||||
#CFLAGS+=-DI2C_DEBUGGER=0x76
|
||||
|
||||
# Set battery I2C bus
|
||||
CFLAGS+=-DI2C_SMBUS=I2C_0
|
||||
@ -35,6 +35,10 @@ include $(SCRATCH_DIR)/scratch.mk
|
||||
CFLAGS+=-I$(BUILD)/include
|
||||
INCLUDE+=$(BUILD)/include/scratch.h
|
||||
|
||||
console:
|
||||
cargo build --manifest-path ecflash/Cargo.toml --example smfi --release
|
||||
sudo ecflash/target/release/examples/smfi
|
||||
|
||||
flash: $(BUILD)/ec.rom
|
||||
cargo build --manifest-path ecflash/Cargo.toml --example isp --release
|
||||
sudo ecflash/target/release/examples/isp --internal $<
|
||||
|
8
src/board/system76/darp5/include/board/smfi.h
Normal file
8
src/board/system76/darp5/include/board/smfi.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef _BOARD_SMFI_H
|
||||
#define _BOARD_SMFI_H
|
||||
|
||||
void smfi_init(void);
|
||||
void smfi_event(void);
|
||||
void smfi_debug(unsigned char byte);
|
||||
|
||||
#endif // _BOARD_SMFI_H
|
@ -17,6 +17,7 @@
|
||||
#include <board/ps2.h>
|
||||
#include <board/pwm.h>
|
||||
#include <board/smbus.h>
|
||||
#include <board/smfi.h>
|
||||
#include <common/debug.h>
|
||||
#include <common/macro.h>
|
||||
#include <common/version.h>
|
||||
@ -45,6 +46,7 @@ void init(void) {
|
||||
pmc_init();
|
||||
pwm_init();
|
||||
smbus_init();
|
||||
smfi_init();
|
||||
|
||||
//TODO: INTC
|
||||
}
|
||||
@ -113,7 +115,9 @@ void main(void) {
|
||||
}
|
||||
// Handles ACPI communication
|
||||
pmc_event(&PMC_1);
|
||||
// AP/EC communication over SMFI
|
||||
smfi_event();
|
||||
// Idle until next timer interrupt
|
||||
PCON |= 1;
|
||||
//Disabled until interrupts used: PCON |= 1;
|
||||
}
|
||||
}
|
||||
|
@ -41,6 +41,12 @@ void pnp_enable() {
|
||||
pnp_write(0x07, 0x05);
|
||||
pnp_write(0x30, 0x01);
|
||||
|
||||
// Enable SMFI
|
||||
pnp_write(0x07, 0x0F);
|
||||
pnp_write(0xF5, 0x00);
|
||||
pnp_write(0xF6, 0x01);
|
||||
pnp_write(0x30, 0x01);
|
||||
|
||||
// Enable SWUC
|
||||
pnp_write(0x07, 0x04);
|
||||
pnp_write(0x30, 0x01);
|
||||
|
111
src/board/system76/darp5/smfi.c
Normal file
111
src/board/system76/darp5/smfi.c
Normal file
@ -0,0 +1,111 @@
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <board/smfi.h>
|
||||
#include <common/macro.h>
|
||||
#include <common/version.h>
|
||||
|
||||
// Shared memory host semaphore
|
||||
volatile uint8_t __xdata __at(0x1022) SMHSR;
|
||||
// Host RAM window control
|
||||
volatile uint8_t __xdata __at(0x105A) HRAMWC;
|
||||
// Host RAM window 0 base address
|
||||
volatile uint8_t __xdata __at(0x105B) HRAMW0BA;
|
||||
// Host RAM window 1 base address
|
||||
volatile uint8_t __xdata __at(0x105C) HRAMW1BA;
|
||||
// Host RAM window 0 access allow size
|
||||
volatile uint8_t __xdata __at(0x105D) HRAMW0AAS;
|
||||
// Host RAM window 1 access allow size
|
||||
volatile uint8_t __xdata __at(0x105E) HRAMW1AAS;
|
||||
|
||||
static volatile uint8_t __xdata __at(0xC00) smfi_cmd[256];
|
||||
static volatile uint8_t __xdata __at(0xD00) smfi_dbg[256];
|
||||
|
||||
enum SmfiCmd {
|
||||
SMFI_CMD_NONE = 0,
|
||||
SMFI_CMD_PROBE = 1,
|
||||
SMFI_CMD_BOARD = 2,
|
||||
SMFI_CMD_VERSION = 3,
|
||||
SMFI_CMD_DEBUG = 4,
|
||||
//TODO
|
||||
};
|
||||
|
||||
enum SmfiRes {
|
||||
SMFI_RES_OK = 0,
|
||||
SMFI_RES_ERR = 1,
|
||||
//TODO
|
||||
};
|
||||
|
||||
void smfi_init(void) {
|
||||
int i;
|
||||
|
||||
// Clear command region
|
||||
for (i = 0; i < ARRAY_SIZE(smfi_cmd); i++) {
|
||||
smfi_cmd[i] = 0x00;
|
||||
}
|
||||
|
||||
// Clear debug region
|
||||
for (i = 0; i < ARRAY_SIZE(smfi_dbg); i++) {
|
||||
smfi_dbg[i] = 0x00;
|
||||
}
|
||||
|
||||
|
||||
// H2RAM window 0 address 0xC00 - 0xCFF, read/write
|
||||
HRAMW0BA = 0xC0;
|
||||
HRAMW0AAS = 0x04;
|
||||
|
||||
// H2RAM window 1 address 0xD00 - 0xDFF, read/write
|
||||
HRAMW1BA = 0xD0;
|
||||
HRAMW1AAS = 0x04;
|
||||
|
||||
// Enable H2RAM window 0 and 1 using LPC I/O
|
||||
HRAMWC |= 0x13;
|
||||
}
|
||||
|
||||
void smfi_event(void) {
|
||||
int i;
|
||||
if (smfi_cmd[0]) {
|
||||
// Default to success
|
||||
smfi_cmd[1] = SMFI_RES_OK;
|
||||
|
||||
switch (smfi_cmd[0]) {
|
||||
case SMFI_CMD_PROBE:
|
||||
// Signature
|
||||
smfi_cmd[2] = 0x76;
|
||||
smfi_cmd[3] = 0xEC;
|
||||
// Version
|
||||
smfi_cmd[4] = 0x01;
|
||||
break;
|
||||
case SMFI_CMD_BOARD:
|
||||
strncpy(&smfi_cmd[2], board(), ARRAY_SIZE(smfi_cmd) - 2);
|
||||
break;
|
||||
case SMFI_CMD_VERSION:
|
||||
strncpy(&smfi_cmd[2], version(), ARRAY_SIZE(smfi_cmd) - 2);
|
||||
break;
|
||||
case SMFI_CMD_DEBUG:
|
||||
for (i = 2; i < ARRAY_SIZE(smfi_cmd) - 2; i++) {
|
||||
uint8_t b = smfi_cmd[i];
|
||||
if (b == 0) break;
|
||||
putchar(b);
|
||||
}
|
||||
default:
|
||||
// Command not found
|
||||
smfi_cmd[1] = SMFI_RES_ERR;
|
||||
break;
|
||||
}
|
||||
|
||||
// Mark command as finished
|
||||
smfi_cmd[0] = SMFI_CMD_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
void smfi_debug(unsigned char byte) {
|
||||
int tail = (int)smfi_dbg[0];
|
||||
tail++;
|
||||
if (tail >= ARRAY_SIZE(smfi_dbg)) {
|
||||
tail = 1;
|
||||
}
|
||||
smfi_dbg[tail] = byte;
|
||||
smfi_dbg[0] = (uint8_t)tail;
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include <board/smfi.h>
|
||||
|
||||
#ifdef SERIAL_DEBUGGER
|
||||
#include <mcs51/8051.h>
|
||||
#endif
|
||||
@ -10,6 +12,7 @@
|
||||
|
||||
int putchar(int c) {
|
||||
unsigned char byte = (unsigned char)c;
|
||||
smfi_debug(byte);
|
||||
#ifdef SERIAL_DEBUGGER
|
||||
SBUF = byte;
|
||||
#endif
|
||||
|
@ -74,9 +74,15 @@ uint8_t acpi_read(uint8_t addr) {
|
||||
ACPI_16(0x1A, battery_full_capacity);
|
||||
ACPI_16(0x22, battery_design_voltage);
|
||||
|
||||
// Bypass status test in ACPI - TODO
|
||||
case 0x26:
|
||||
data |= 1 << 1;
|
||||
// If AC adapter connected
|
||||
if (!gpio_get(&ACIN_N)) {
|
||||
// And battery is not fully charged
|
||||
if (!(battery_status & 0x0020)) {
|
||||
// Battery is charging
|
||||
data |= 1 << 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
ACPI_16(0x2A, battery_current);
|
||||
|
@ -11,10 +11,10 @@ SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c
|
||||
# 3 - INFO
|
||||
# 4 - DEBUG
|
||||
# 5 - TRACE
|
||||
CFLAGS+=-DLEVEL=2
|
||||
CFLAGS+=-DLEVEL=4
|
||||
|
||||
# Enable I2C debug on 0x76
|
||||
CFLAGS+=-DI2C_DEBUGGER=0x76
|
||||
#CFLAGS+=-DI2C_DEBUGGER=0x76
|
||||
|
||||
# Set battery I2C bus
|
||||
CFLAGS+=-DI2C_SMBUS=I2C_0
|
||||
@ -35,6 +35,10 @@ include $(SCRATCH_DIR)/scratch.mk
|
||||
CFLAGS+=-I$(BUILD)/include
|
||||
INCLUDE+=$(BUILD)/include/scratch.h
|
||||
|
||||
console:
|
||||
cargo build --manifest-path ecflash/Cargo.toml --example smfi --release
|
||||
sudo ecflash/target/release/examples/smfi
|
||||
|
||||
flash: $(BUILD)/ec.rom
|
||||
cargo build --manifest-path ecflash/Cargo.toml --example isp --release
|
||||
sudo ecflash/target/release/examples/isp --internal $<
|
||||
|
8
src/board/system76/galp3-c/include/board/smfi.h
Normal file
8
src/board/system76/galp3-c/include/board/smfi.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef _BOARD_SMFI_H
|
||||
#define _BOARD_SMFI_H
|
||||
|
||||
void smfi_init(void);
|
||||
void smfi_event(void);
|
||||
void smfi_debug(unsigned char byte);
|
||||
|
||||
#endif // _BOARD_SMFI_H
|
@ -18,6 +18,7 @@
|
||||
#include <board/ps2.h>
|
||||
#include <board/pwm.h>
|
||||
#include <board/smbus.h>
|
||||
#include <board/smfi.h>
|
||||
#include <common/debug.h>
|
||||
#include <common/macro.h>
|
||||
#include <common/version.h>
|
||||
@ -47,6 +48,7 @@ void init(void) {
|
||||
pmc_init();
|
||||
pwm_init();
|
||||
smbus_init();
|
||||
smfi_init();
|
||||
|
||||
//TODO: INTC
|
||||
}
|
||||
@ -115,7 +117,9 @@ void main(void) {
|
||||
}
|
||||
// Handles ACPI communication
|
||||
pmc_event(&PMC_1);
|
||||
// AP/EC communication over SMFI
|
||||
smfi_event();
|
||||
// Idle until next timer interrupt
|
||||
PCON |= 1;
|
||||
//Disabled until interrupts used: PCON |= 1;
|
||||
}
|
||||
}
|
||||
|
@ -41,6 +41,12 @@ void pnp_enable() {
|
||||
pnp_write(0x07, 0x05);
|
||||
pnp_write(0x30, 0x01);
|
||||
|
||||
// Enable SMFI
|
||||
pnp_write(0x07, 0x0F);
|
||||
pnp_write(0xF5, 0x00);
|
||||
pnp_write(0xF6, 0x01);
|
||||
pnp_write(0x30, 0x01);
|
||||
|
||||
// Enable SWUC
|
||||
pnp_write(0x07, 0x04);
|
||||
pnp_write(0x30, 0x01);
|
||||
|
111
src/board/system76/galp3-c/smfi.c
Normal file
111
src/board/system76/galp3-c/smfi.c
Normal file
@ -0,0 +1,111 @@
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <board/smfi.h>
|
||||
#include <common/macro.h>
|
||||
#include <common/version.h>
|
||||
|
||||
// Shared memory host semaphore
|
||||
volatile uint8_t __xdata __at(0x1022) SMHSR;
|
||||
// Host RAM window control
|
||||
volatile uint8_t __xdata __at(0x105A) HRAMWC;
|
||||
// Host RAM window 0 base address
|
||||
volatile uint8_t __xdata __at(0x105B) HRAMW0BA;
|
||||
// Host RAM window 1 base address
|
||||
volatile uint8_t __xdata __at(0x105C) HRAMW1BA;
|
||||
// Host RAM window 0 access allow size
|
||||
volatile uint8_t __xdata __at(0x105D) HRAMW0AAS;
|
||||
// Host RAM window 1 access allow size
|
||||
volatile uint8_t __xdata __at(0x105E) HRAMW1AAS;
|
||||
|
||||
static volatile uint8_t __xdata __at(0xC00) smfi_cmd[256];
|
||||
static volatile uint8_t __xdata __at(0xD00) smfi_dbg[256];
|
||||
|
||||
enum SmfiCmd {
|
||||
SMFI_CMD_NONE = 0,
|
||||
SMFI_CMD_PROBE = 1,
|
||||
SMFI_CMD_BOARD = 2,
|
||||
SMFI_CMD_VERSION = 3,
|
||||
SMFI_CMD_DEBUG = 4,
|
||||
//TODO
|
||||
};
|
||||
|
||||
enum SmfiRes {
|
||||
SMFI_RES_OK = 0,
|
||||
SMFI_RES_ERR = 1,
|
||||
//TODO
|
||||
};
|
||||
|
||||
void smfi_init(void) {
|
||||
int i;
|
||||
|
||||
// Clear command region
|
||||
for (i = 0; i < ARRAY_SIZE(smfi_cmd); i++) {
|
||||
smfi_cmd[i] = 0x00;
|
||||
}
|
||||
|
||||
// Clear debug region
|
||||
for (i = 0; i < ARRAY_SIZE(smfi_dbg); i++) {
|
||||
smfi_dbg[i] = 0x00;
|
||||
}
|
||||
|
||||
|
||||
// H2RAM window 0 address 0xC00 - 0xCFF, read/write
|
||||
HRAMW0BA = 0xC0;
|
||||
HRAMW0AAS = 0x04;
|
||||
|
||||
// H2RAM window 1 address 0xD00 - 0xDFF, read/write
|
||||
HRAMW1BA = 0xD0;
|
||||
HRAMW1AAS = 0x04;
|
||||
|
||||
// Enable H2RAM window 0 and 1 using LPC I/O
|
||||
HRAMWC |= 0x13;
|
||||
}
|
||||
|
||||
void smfi_event(void) {
|
||||
int i;
|
||||
if (smfi_cmd[0]) {
|
||||
// Default to success
|
||||
smfi_cmd[1] = SMFI_RES_OK;
|
||||
|
||||
switch (smfi_cmd[0]) {
|
||||
case SMFI_CMD_PROBE:
|
||||
// Signature
|
||||
smfi_cmd[2] = 0x76;
|
||||
smfi_cmd[3] = 0xEC;
|
||||
// Version
|
||||
smfi_cmd[4] = 0x01;
|
||||
break;
|
||||
case SMFI_CMD_BOARD:
|
||||
strncpy(&smfi_cmd[2], board(), ARRAY_SIZE(smfi_cmd) - 2);
|
||||
break;
|
||||
case SMFI_CMD_VERSION:
|
||||
strncpy(&smfi_cmd[2], version(), ARRAY_SIZE(smfi_cmd) - 2);
|
||||
break;
|
||||
case SMFI_CMD_DEBUG:
|
||||
for (i = 2; i < ARRAY_SIZE(smfi_cmd) - 2; i++) {
|
||||
uint8_t b = smfi_cmd[i];
|
||||
if (b == 0) break;
|
||||
putchar(b);
|
||||
}
|
||||
default:
|
||||
// Command not found
|
||||
smfi_cmd[1] = SMFI_RES_ERR;
|
||||
break;
|
||||
}
|
||||
|
||||
// Mark command as finished
|
||||
smfi_cmd[0] = SMFI_CMD_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
void smfi_debug(unsigned char byte) {
|
||||
int tail = (int)smfi_dbg[0];
|
||||
tail++;
|
||||
if (tail >= ARRAY_SIZE(smfi_dbg)) {
|
||||
tail = 1;
|
||||
}
|
||||
smfi_dbg[tail] = byte;
|
||||
smfi_dbg[0] = (uint8_t)tail;
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include <board/smfi.h>
|
||||
|
||||
#ifdef SERIAL_DEBUGGER
|
||||
#include <mcs51/8051.h>
|
||||
#endif
|
||||
@ -10,6 +12,7 @@
|
||||
|
||||
int putchar(int c) {
|
||||
unsigned char byte = (unsigned char)c;
|
||||
smfi_debug(byte);
|
||||
#ifdef SERIAL_DEBUGGER
|
||||
SBUF = byte;
|
||||
#endif
|
||||
|
@ -74,9 +74,15 @@ uint8_t acpi_read(uint8_t addr) {
|
||||
ACPI_16(0x1A, battery_full_capacity);
|
||||
ACPI_16(0x22, battery_design_voltage);
|
||||
|
||||
// Bypass status test in ACPI - TODO
|
||||
case 0x26:
|
||||
data |= 1 << 1;
|
||||
// If AC adapter connected
|
||||
if (!gpio_get(&ACIN_N)) {
|
||||
// And battery is not fully charged
|
||||
if (!(battery_status & 0x0020)) {
|
||||
// Battery is charging
|
||||
data |= 1 << 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
ACPI_16(0x2A, battery_current);
|
||||
|
@ -11,10 +11,10 @@ SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c
|
||||
# 3 - INFO
|
||||
# 4 - DEBUG
|
||||
# 5 - TRACE
|
||||
CFLAGS+=-DLEVEL=2
|
||||
CFLAGS+=-DLEVEL=4
|
||||
|
||||
# Enable I2C debug on 0x76
|
||||
CFLAGS+=-DI2C_DEBUGGER=0x76
|
||||
#CFLAGS+=-DI2C_DEBUGGER=0x76
|
||||
|
||||
# Set battery I2C bus
|
||||
CFLAGS+=-DI2C_SMBUS=I2C_4
|
||||
@ -38,6 +38,10 @@ include $(SCRATCH_DIR)/scratch.mk
|
||||
CFLAGS+=-I$(BUILD)/include
|
||||
INCLUDE+=$(BUILD)/include/scratch.h
|
||||
|
||||
console:
|
||||
cargo build --manifest-path ecflash/Cargo.toml --example smfi --release
|
||||
sudo ecflash/target/release/examples/smfi
|
||||
|
||||
flash: $(BUILD)/ec.rom
|
||||
cargo build --manifest-path ecflash/Cargo.toml --example isp --release
|
||||
sudo ecflash/target/release/examples/isp --internal $<
|
||||
|
@ -3,5 +3,6 @@
|
||||
|
||||
void smfi_init(void);
|
||||
void smfi_event(void);
|
||||
void smfi_debug(unsigned char byte);
|
||||
|
||||
#endif // _BOARD_SMFI_H
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <board/smfi.h>
|
||||
#include <common/macro.h>
|
||||
#include <common/version.h>
|
||||
|
||||
@ -26,6 +27,7 @@ enum SmfiCmd {
|
||||
SMFI_CMD_PROBE = 1,
|
||||
SMFI_CMD_BOARD = 2,
|
||||
SMFI_CMD_VERSION = 3,
|
||||
SMFI_CMD_DEBUG = 4,
|
||||
//TODO
|
||||
};
|
||||
|
||||
@ -62,6 +64,7 @@ void smfi_init(void) {
|
||||
}
|
||||
|
||||
void smfi_event(void) {
|
||||
int i;
|
||||
if (smfi_cmd[0]) {
|
||||
// Default to success
|
||||
smfi_cmd[1] = SMFI_RES_OK;
|
||||
@ -80,19 +83,29 @@ void smfi_event(void) {
|
||||
case SMFI_CMD_VERSION:
|
||||
strncpy(&smfi_cmd[2], version(), ARRAY_SIZE(smfi_cmd) - 2);
|
||||
break;
|
||||
case SMFI_CMD_DEBUG:
|
||||
for (i = 2; i < ARRAY_SIZE(smfi_cmd) - 2; i++) {
|
||||
uint8_t b = smfi_cmd[i];
|
||||
if (b == 0) break;
|
||||
putchar(b);
|
||||
}
|
||||
default:
|
||||
// Command not found
|
||||
smfi_cmd[1] = SMFI_RES_ERR;
|
||||
break;
|
||||
}
|
||||
|
||||
// Mark command as finished
|
||||
smfi_cmd[0] = SMFI_CMD_NONE;
|
||||
}
|
||||
|
||||
if (smfi_dbg[0]) {
|
||||
int i;
|
||||
for(i = 1; (i <= (int)smfi_dbg[0]) && (i < ARRAY_SIZE(smfi_dbg)); i++) {
|
||||
putchar(smfi_dbg[i]);
|
||||
}
|
||||
|
||||
// Mark debug transaction as complete
|
||||
smfi_dbg[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void smfi_debug(unsigned char byte) {
|
||||
int tail = (int)smfi_dbg[0];
|
||||
tail++;
|
||||
if (tail >= ARRAY_SIZE(smfi_dbg)) {
|
||||
tail = 1;
|
||||
}
|
||||
smfi_dbg[tail] = byte;
|
||||
smfi_dbg[0] = (uint8_t)tail;
|
||||
}
|
||||
|
@ -1,5 +1,7 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include <board/smfi.h>
|
||||
|
||||
#ifdef SERIAL_DEBUGGER
|
||||
#include <mcs51/8051.h>
|
||||
#endif
|
||||
@ -10,6 +12,7 @@
|
||||
|
||||
int putchar(int c) {
|
||||
unsigned char byte = (unsigned char)c;
|
||||
smfi_debug(byte);
|
||||
#ifdef SERIAL_DEBUGGER
|
||||
SBUF = byte;
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user