Refactor timers, add GPIO debugging, and increase print speed

This commit is contained in:
Jeremy Soller 2019-09-27 21:04:59 -06:00
parent da40506f04
commit b479defcc4
No known key found for this signature in database
GPG Key ID: E988B49EE78A7FB1
9 changed files with 85 additions and 30 deletions

View File

@ -8,7 +8,11 @@ clean:
rm -rf build
sim: build/ec.rom
cargo run --release --manifest-path ecsim/Cargo.toml -- $<
cargo run \
--release \
--manifest-path ecsim/Cargo.toml \
--no-default-features \
-- $<
build/ec.rom: build/ec.ihx
mkdir -p build

2
ecsim

@ -1 +1 @@
Subproject commit 7e685cd81523da7e8479d51d547dc146e1957fd8
Subproject commit f735f202a66f903dd571276fc67b8a679dd3ddae

View File

@ -1,30 +1,18 @@
#include <8051.h>
#include "include/delay.h"
#include "include/timer.h"
void timer_clear(void) {
TR0 = 0;
TF0 = 0;
}
void timer_mode_1(int value) {
timer_clear();
TMOD = 0x01;
TH0 = (unsigned char)(value >> 8);
TL0 = (unsigned char)value;
TR0 = 1;
}
// One millisecond in ticks is determined as follows:
// 9.2 MHz is the clock rate
// The timer divider is 12
// The timer rate is 12 / 9.2 MHz = 1.304 us
// The ticks are 1000 ms / (1.304 us) = 766.667
// 65536 - 766.667 = 64769.33
void delay_ms(int ms) {
for (int i = 0; i < ms; i++) {
// One millisecond in ticks is determined as follows:
// 9.2 MHz is the clock rate
// The timer divider is 12
// The timer rate is 12 / 9.2 MHz = 1.304 us
// The ticks are 1000 ms / (1.304 us) = 766.667
// 65536 - 766.667 = 64769.33
timer_mode_1(64769);
while (TF0 == 0) {}
timer_clear();
timer_wait();
timer_stop();
}
}

View File

@ -1,3 +1,5 @@
#include <stdio.h>
#include "include/gpio.h"
void gpio_init() {
@ -98,3 +100,22 @@ void gpio_init() {
GPCRJ6 = 0x44;
GPCRJ7 = 0x80;
}
void gpio_debug_bank(char bank, unsigned char data) {
for(char i = 0; i < 8; i++) {
printf("%c%d = %d\n", bank, i, (data >> i) & 1);
}
}
void gpio_debug(void) {
gpio_debug_bank('A', GPDRA);
gpio_debug_bank('B', GPDRB);
gpio_debug_bank('C', GPDRC);
gpio_debug_bank('D', GPDRD);
gpio_debug_bank('E', GPDRE);
gpio_debug_bank('F', GPDRF);
gpio_debug_bank('G', GPDRG);
gpio_debug_bank('H', GPDRH);
gpio_debug_bank('I', GPDRI);
gpio_debug_bank('J', GPDRJ);
}

View File

@ -2,6 +2,7 @@
#define _GPIO_H_
void gpio_init(void);
void gpio_debug(void);
__xdata volatile unsigned char __at(0x1600) GCR;

8
src/include/timer.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef _TIMER_H_
#define _TIMER_H_
void timer_mode_1(int value);
void timer_wait(void);
void timer_stop(void);
#endif // _TIMER_H_

View File

@ -19,6 +19,8 @@ struct Pin LED_AIRPLANE_N = PIN(G, 6);
struct Pin PWR_SW = PIN(D, 0);
static char * MODEL = "galp3-c";
void main() {
gpio_init();
gctrl_init();
@ -29,10 +31,10 @@ void main() {
//TODO: INTC, PECI, PWM, SMBUS
// Set the battery full LED (to know our firmware is loaded)
pin_set(&LED_BAT_CHG, true);
delay_ms(1000);
pin_set(&LED_BAT_FULL, true);
printf("Hello from System76 EC!\n");
printf("Hello from System76 EC for %s!\n", MODEL);
gpio_debug();
bool last = false;
for(;;) {

View File

@ -1,20 +1,31 @@
#include <stdio.h>
#include "include/delay.h"
#include "include/kbscan.h"
#include "include/timer.h"
// Wait 25 us
// 65536 - (25 / 1.304) = 65517
void parallel_delay(void) {
timer_mode_1(65517);
timer_wait();
timer_stop();
}
// This takes a time of 25 us * 3 = 75 us
// That produces a frequency of 13.333 KHz
// Which produces a bitrate of 106.667 KHz
void parallel_write(unsigned char value) {
// Make sure clock is high
KSOH1 = 0xFF;
delay_ms(1);
parallel_delay();
// Set value
KSOL = value;
delay_ms(1);
parallel_delay();
// Set clock low
KSOH1 = 0;
delay_ms(1);
parallel_delay();
// Set clock high again
KSOH1 = 0xFF;

20
src/timer.c Normal file
View File

@ -0,0 +1,20 @@
#include <8051.h>
#include "include/timer.h"
void timer_mode_1(int value) {
timer_stop();
TMOD = 0x01;
TH0 = (unsigned char)(value >> 8);
TL0 = (unsigned char)value;
TR0 = 1;
}
void timer_wait(void) {
while (TF0 == 0) {}
}
void timer_stop(void) {
TR0 = 0;
TF0 = 0;
}