mirror of
https://gitlab.com/zephray/glider.git
synced 2024-12-22 13:43:16 +00:00
Initial fw port to r0p7
This commit is contained in:
parent
42c7b40052
commit
11c7a41474
13 changed files with 199 additions and 281 deletions
|
@ -25,16 +25,15 @@ pico_sdk_init()
|
||||||
|
|
||||||
add_executable(fw
|
add_executable(fw
|
||||||
bitstream.c
|
bitstream.c
|
||||||
|
button.c
|
||||||
caster.c
|
caster.c
|
||||||
edid.c
|
edid.c
|
||||||
fpga.c
|
fpga.c
|
||||||
fusb302.c
|
fusb302.c
|
||||||
fw.c
|
fw.c
|
||||||
max17135.c
|
|
||||||
power.c
|
power.c
|
||||||
ptn3460.c
|
ptn3460.c
|
||||||
tcpm_driver.c
|
tcpm_driver.c
|
||||||
tps65185.c
|
|
||||||
usb_mux.c
|
usb_mux.c
|
||||||
usb_pd_driver.c
|
usb_pd_driver.c
|
||||||
usb_pd_policy.c
|
usb_pd_policy.c
|
||||||
|
|
126
fw/button.c
Normal file
126
fw/button.c
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
//
|
||||||
|
// Copyright 2024 Wenting Zhang <zephray@outlook.com>
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
//
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "pico/stdlib.h"
|
||||||
|
#include "button.h"
|
||||||
|
|
||||||
|
#define BTN1 6
|
||||||
|
#define BTN2 5
|
||||||
|
|
||||||
|
#define BTNCNT 2
|
||||||
|
|
||||||
|
#define SHORT_PRESS_THRESHOLD 20
|
||||||
|
#define LONG_PRESS_THRESHOLD 500
|
||||||
|
#define RELEASE_THRESHOLD 20
|
||||||
|
|
||||||
|
void button_init() {
|
||||||
|
gpio_init(BTN1);
|
||||||
|
gpio_set_dir(BTN1, GPIO_IN);
|
||||||
|
gpio_pull_up(BTN1);
|
||||||
|
|
||||||
|
gpio_init(BTN2);
|
||||||
|
gpio_set_dir(BTN2, GPIO_IN);
|
||||||
|
gpio_pull_up(BTN2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan a single key, ID is the key number from 0, gpio is pin number
|
||||||
|
// Should be called at ~1ms interval
|
||||||
|
// Return value:
|
||||||
|
// 0 when nothing pressed
|
||||||
|
// 1 when short pressed
|
||||||
|
// 2 when long pressed
|
||||||
|
static uint32_t button_scan_single(int id, int gpio) {
|
||||||
|
static int timecntr[BTNCNT] = {0};
|
||||||
|
static enum {
|
||||||
|
STATE_IDLE,
|
||||||
|
STATE_FIRST_PRESSED,
|
||||||
|
STATE_HOLDING,
|
||||||
|
STATE_RELEASED
|
||||||
|
} state[BTNCNT] = {0};
|
||||||
|
uint32_t retval = 0;
|
||||||
|
|
||||||
|
switch (state[id]) {
|
||||||
|
case STATE_IDLE:
|
||||||
|
if (gpio_get(gpio) == 0) {
|
||||||
|
state[id] = STATE_FIRST_PRESSED;
|
||||||
|
timecntr[id] = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATE_FIRST_PRESSED:
|
||||||
|
timecntr[id]++;
|
||||||
|
if (gpio_get(gpio) == 0) {
|
||||||
|
// Still pressing
|
||||||
|
if (timecntr[id] >= SHORT_PRESS_THRESHOLD) {
|
||||||
|
state[id] = STATE_HOLDING;
|
||||||
|
timecntr[id] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// No longer pressed
|
||||||
|
state[id] = STATE_IDLE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATE_HOLDING:
|
||||||
|
timecntr[id]++;
|
||||||
|
if (gpio_get(gpio) == 0) {
|
||||||
|
// Still holding
|
||||||
|
if (timecntr[id] == LONG_PRESS_THRESHOLD) {
|
||||||
|
// Exactly when reaching the threshold, return the key press
|
||||||
|
// User gets feedback as soon as the threshold is reached
|
||||||
|
retval = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// No longer holding
|
||||||
|
if (timecntr[id] < LONG_PRESS_THRESHOLD) {
|
||||||
|
// Is a short press, signal
|
||||||
|
retval = 1;
|
||||||
|
}
|
||||||
|
timecntr[id] = 0;
|
||||||
|
state[id] = STATE_RELEASED;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATE_RELEASED:
|
||||||
|
if (gpio_get(gpio) == 0) {
|
||||||
|
// Pressed, reset time counter
|
||||||
|
timecntr[id] = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Keep counting time
|
||||||
|
// Only treat key as released when reaching threshold
|
||||||
|
timecntr[id]++;
|
||||||
|
if (timecntr[id] >= RELEASE_THRESHOLD) {
|
||||||
|
state[id] = STATE_IDLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t button_scan() {
|
||||||
|
uint32_t btn1 = button_scan_single(0, BTN1);
|
||||||
|
uint32_t btn2 = button_scan_single(1, BTN2);
|
||||||
|
uint32_t retval = (btn1 & 0x3) | ((btn2 & 0x3) << 2);
|
||||||
|
return retval;
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
//
|
//
|
||||||
// Copyright 2022 Wenting Zhang <zephray@outlook.com>
|
// Copyright 2024 Wenting Zhang <zephray@outlook.com>
|
||||||
//
|
//
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -21,6 +21,5 @@
|
||||||
//
|
//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
void max_init(void);
|
void button_init();
|
||||||
void max_set_vcom(uint16_t vcom);
|
uint32_t button_scan();
|
||||||
void max_enable(bool en);
|
|
18
fw/config.h
18
fw/config.h
|
@ -23,10 +23,7 @@
|
||||||
|
|
||||||
/* BOARD REVISION CONFIGURATION */
|
/* BOARD REVISION CONFIGURATION */
|
||||||
// Eariler revisions are not supported
|
// Eariler revisions are not supported
|
||||||
//#define BOARD_REV_R0P5
|
#define BOARD_REV_R0P7
|
||||||
//#define BOARD_REV_R0P6
|
|
||||||
// Lite version uses DVI instead of Type-C DP Alt-mode
|
|
||||||
#define BOARD_REV_RL0P1
|
|
||||||
|
|
||||||
/* SCREEN CONFIGURATION */
|
/* SCREEN CONFIGURATION */
|
||||||
|
|
||||||
|
@ -50,17 +47,12 @@
|
||||||
|
|
||||||
|
|
||||||
/* SET BASED ON PREVIOUS DEFINES, DO NOT MODIFY */
|
/* SET BASED ON PREVIOUS DEFINES, DO NOT MODIFY */
|
||||||
#if defined(BOARD_REV_R0P5)
|
#if defined(BOARD_REV_R0P7)
|
||||||
#define POWER_TPS65185
|
|
||||||
#define INPUT_TYPEC
|
|
||||||
#elif defined(BOARD_REV_R0P6)
|
|
||||||
#define POWER_GPIO
|
|
||||||
// VCOM measurement is not supported
|
|
||||||
#define INPUT_TYPEC
|
|
||||||
#elif defined(BOARD_REV_RL0P1)
|
|
||||||
#define POWER_GPIO
|
#define POWER_GPIO
|
||||||
#define POWER_GPIO_VCOM_MEASURE
|
#define POWER_GPIO_VCOM_MEASURE
|
||||||
#define INPUT_DVI
|
#define INPUT_ADV7611
|
||||||
|
#define INPUT_PTN3460
|
||||||
|
#define HAS_TYPEC
|
||||||
#else
|
#else
|
||||||
#error "Unknown board revision"
|
#error "Unknown board revision"
|
||||||
#endif
|
#endif
|
||||||
|
|
13
fw/edid.c
13
fw/edid.c
|
@ -27,16 +27,17 @@
|
||||||
#include "edid.h"
|
#include "edid.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#if defined(INPUT_DVI)
|
#ifdef BOARD_USE_EDID_EMU
|
||||||
#define EDID_I2C_ADDRESS (0x50)
|
#define EDID_I2C_ADDRESS (0x50)
|
||||||
#define EDID_I2C (i2c0)
|
#define EDID_I2C (i2c0)
|
||||||
#define EDID_I2C_SDA (0)
|
#define EDID_I2C_SDA (0)
|
||||||
#define EDID_I2C_SCL (1)
|
#define EDID_I2C_SCL (1)
|
||||||
#define EDID_VID_IN_PARAM (0x81) // DVI input
|
|
||||||
#elif defined(INPUT_TYPEC)
|
|
||||||
#define EDID_VID_IN_PARAM (0x85) // DisplayPort input
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// 0x81 for DVI, 0x85 for DP
|
||||||
|
// Always use 0x85 for now, doesn't really matter
|
||||||
|
#define EDID_VID_IN_PARAM (0x85)
|
||||||
|
|
||||||
static char edid[129] = {
|
static char edid[129] = {
|
||||||
0x00, // register number, not part of EDID
|
0x00, // register number, not part of EDID
|
||||||
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, // fixed header (0-7)
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, // fixed header (0-7)
|
||||||
|
@ -90,7 +91,7 @@ static char edid[129] = {
|
||||||
0x00 // checksum (127)
|
0x00 // checksum (127)
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef INPUT_DVI
|
#ifdef BOARD_USE_EDID_EMU
|
||||||
static void edid_i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event) {
|
static void edid_i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event) {
|
||||||
static uint8_t addr = 0;
|
static uint8_t addr = 0;
|
||||||
|
|
||||||
|
@ -133,7 +134,7 @@ void edid_init() {
|
||||||
checksum = ~checksum + 1;
|
checksum = ~checksum + 1;
|
||||||
edid[128] = checksum;
|
edid[128] = checksum;
|
||||||
|
|
||||||
#ifdef INPUT_DVI
|
#ifdef BOARD_USE_EDID_EMU
|
||||||
// DVI models has DDC I2C connected directly to the RP2040
|
// DVI models has DDC I2C connected directly to the RP2040
|
||||||
// EDID ROM emulation is needed
|
// EDID ROM emulation is needed
|
||||||
|
|
||||||
|
|
|
@ -25,10 +25,10 @@
|
||||||
#include "fpga.h"
|
#include "fpga.h"
|
||||||
#include "bitstream.h"
|
#include "bitstream.h"
|
||||||
|
|
||||||
#define FPGA_CS 12
|
#define FPGA_CS 13
|
||||||
#define FPGA_MOSI 13
|
#define FPGA_MOSI 15
|
||||||
#define FPGA_MISO 14
|
#define FPGA_MISO 12
|
||||||
#define FPGA_SCLK 15
|
#define FPGA_SCLK 14
|
||||||
#define FPGA_PROG 17
|
#define FPGA_PROG 17
|
||||||
#define FPGA_DONE 18
|
#define FPGA_DONE 18
|
||||||
#define FPGA_SUSP 19
|
#define FPGA_SUSP 19
|
||||||
|
|
101
fw/fw.c
101
fw/fw.c
|
@ -32,6 +32,7 @@
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
#include "fpga.h"
|
#include "fpga.h"
|
||||||
#include "edid.h"
|
#include "edid.h"
|
||||||
|
#include "button.h"
|
||||||
#include "caster.h"
|
#include "caster.h"
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
|
@ -43,10 +44,28 @@ int main()
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("Glider\n");
|
printf("Glider\n");
|
||||||
|
|
||||||
// TODO: Unify both input options
|
// Initialize I2C for TCPC/PTN3460/ADV7611 use
|
||||||
#if defined(INPUT_DVI)
|
i2c_init(i2c1, 100*1000);
|
||||||
|
gpio_set_function(2, GPIO_FUNC_I2C);
|
||||||
|
gpio_set_function(3, GPIO_FUNC_I2C);
|
||||||
|
gpio_pull_up(2);
|
||||||
|
gpio_pull_up(3);
|
||||||
|
|
||||||
|
int result = tcpm_init(0);
|
||||||
|
if (result)
|
||||||
|
fatal("Failed to initialize TCPC\n");
|
||||||
|
|
||||||
|
int cc1, cc2;
|
||||||
|
tcpc_config[0].drv->get_cc(0, &cc1, &cc2);
|
||||||
|
printf("CC status %d %d\n", cc1, cc2);
|
||||||
|
|
||||||
power_init();
|
power_init();
|
||||||
edid_init();
|
edid_init();
|
||||||
|
|
||||||
|
ptn3460_init();
|
||||||
|
pd_init(0);
|
||||||
|
sleep_ms(50);
|
||||||
|
|
||||||
power_enable(true);
|
power_enable(true);
|
||||||
|
|
||||||
//sleep_run_from_xosc();
|
//sleep_run_from_xosc();
|
||||||
|
@ -54,14 +73,10 @@ int main()
|
||||||
// https://ghubcoder.github.io/posts/awaking-the-pico/
|
// https://ghubcoder.github.io/posts/awaking-the-pico/
|
||||||
|
|
||||||
fpga_init();
|
fpga_init();
|
||||||
|
button_init();
|
||||||
//sleep_ms(5000);
|
//sleep_ms(5000);
|
||||||
//caster_init();
|
//caster_init();
|
||||||
|
|
||||||
gpio_init(2);
|
|
||||||
gpio_set_dir(2, GPIO_IN);
|
|
||||||
gpio_pull_up(2);
|
|
||||||
|
|
||||||
int mode_max = 6;
|
int mode_max = 6;
|
||||||
int mode = 1;
|
int mode = 1;
|
||||||
UPDATE_MODE modes[6] = {
|
UPDATE_MODE modes[6] = {
|
||||||
|
@ -73,54 +88,6 @@ int main()
|
||||||
UM_AUTO_LUT_ERROR_DIFFUSION
|
UM_AUTO_LUT_ERROR_DIFFUSION
|
||||||
};
|
};
|
||||||
|
|
||||||
while (1) {
|
|
||||||
//
|
|
||||||
if (gpio_get(2) == 0) {
|
|
||||||
sleep_ms(20);
|
|
||||||
if (gpio_get(2) == 0) {
|
|
||||||
int i = 0;
|
|
||||||
while (gpio_get(2) == 0) {
|
|
||||||
i++;
|
|
||||||
sleep_ms(1);
|
|
||||||
if (i > 500)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (i > 500) {
|
|
||||||
// Long press, clear screen
|
|
||||||
caster_redraw(0,0,1600,1200);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Short press, switch mode
|
|
||||||
mode++;
|
|
||||||
if (mode >= mode_max) mode = 0;
|
|
||||||
caster_setmode(0,0,1600,1200,modes[mode]);
|
|
||||||
}
|
|
||||||
while (gpio_get(2) == 0);
|
|
||||||
}
|
|
||||||
while (gpio_get(2) == 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif defined(INPUT_TYPEC)
|
|
||||||
int result = tcpm_init(0);
|
|
||||||
if (result)
|
|
||||||
fatal("Failed to initialize TCPC\n");
|
|
||||||
|
|
||||||
int cc1, cc2;
|
|
||||||
tcpc_config[0].drv->get_cc(0, &cc1, &cc2);
|
|
||||||
printf("CC status %d %d\n", cc1, cc2);
|
|
||||||
|
|
||||||
gpio_init(10);
|
|
||||||
gpio_put(10, 0);
|
|
||||||
gpio_set_dir(10, GPIO_OUT);
|
|
||||||
|
|
||||||
power_init();
|
|
||||||
power_enable(true); // TODO: should be dependent on DP signal valid
|
|
||||||
fpga_init();
|
|
||||||
|
|
||||||
ptn3460_init();
|
|
||||||
pd_init(0);
|
|
||||||
sleep_ms(50);
|
|
||||||
|
|
||||||
extern int dp_enabled;
|
extern int dp_enabled;
|
||||||
bool hpd_sent = false;
|
bool hpd_sent = false;
|
||||||
bool dp_valid = false;
|
bool dp_valid = false;
|
||||||
|
@ -138,8 +105,30 @@ int main()
|
||||||
dp_valid = ptn3460_is_valid();
|
dp_valid = ptn3460_is_valid();
|
||||||
printf(dp_valid ? "Input is valid\n" : "Input is invalid\n");
|
printf(dp_valid ? "Input is valid\n" : "Input is invalid\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Key press logic
|
||||||
|
uint32_t keys = button_scan();
|
||||||
|
if (keys & 0x1) {
|
||||||
|
// First key short press
|
||||||
|
}
|
||||||
|
if (keys & 0x2) {
|
||||||
|
// First key long press
|
||||||
|
// Clear screen
|
||||||
|
caster_redraw(0,0,1600,1200);
|
||||||
|
}
|
||||||
|
if (keys & 0x4) {
|
||||||
|
// Second key short press
|
||||||
|
}
|
||||||
|
if (keys & 0x8) {
|
||||||
|
// Second key long press
|
||||||
|
// Switch mode
|
||||||
|
mode++;
|
||||||
|
if (mode >= mode_max) mode = 0;
|
||||||
|
caster_setmode(0,0,1600,1200,modes[mode]);
|
||||||
|
}
|
||||||
|
|
||||||
|
sleep_ms(1);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,76 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright 2022 Wenting Zhang <zephray@outlook.com>
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
// SOFTWARE.
|
|
||||||
//
|
|
||||||
#include "pico/stdlib.h"
|
|
||||||
#include "hardware/i2c.h"
|
|
||||||
#include "max17135.h"
|
|
||||||
|
|
||||||
#define MAX_I2C i2c0
|
|
||||||
#define MAX_I2C_ADDR 0x48
|
|
||||||
|
|
||||||
void max_write(uint8_t reg, uint8_t val) {
|
|
||||||
uint8_t buf[2];
|
|
||||||
int result;
|
|
||||||
buf[0] = reg;
|
|
||||||
buf[1] = val;
|
|
||||||
result = i2c_write_blocking(MAX_I2C, MAX_I2C_ADDR, buf, 2, false);
|
|
||||||
if (result != 2) {
|
|
||||||
fatal("Failed writing data to MAX");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t max_read(uint8_t reg) {
|
|
||||||
int result;
|
|
||||||
uint8_t buf[1];
|
|
||||||
buf[0] = reg;
|
|
||||||
result = i2c_write_blocking(MAX_I2C, MAX_I2C_ADDR, buf, 1, true);
|
|
||||||
if (result != 1) {
|
|
||||||
fatal("Failed writing data to MAX");
|
|
||||||
}
|
|
||||||
result = i2c_read_blocking(MAX_I2C, MAX_I2C_ADDR, buf, 1, false);
|
|
||||||
if (result != 1) {
|
|
||||||
fatal("Failed reading data from MAX");
|
|
||||||
}
|
|
||||||
return buf[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
void max_set_vcom(uint16_t vcom) {
|
|
||||||
max_write(0x04, (vcom >> 16));
|
|
||||||
max_write(0x03, vcom & 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
void max_enable(bool en) {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
void max_init(void) {
|
|
||||||
//max_set_vcom(100); // -1V
|
|
||||||
printf("Product Revision: %08x\n", max_read(0x06));
|
|
||||||
printf("Product ID: %08x\n", max_read(0x07));
|
|
||||||
max_write(0x10, 0x80);
|
|
||||||
max_write(0x09, 0x01); // Startup
|
|
||||||
for (int i = 0; i < 20; i++) {
|
|
||||||
sleep_ms(10);
|
|
||||||
uint8_t val = max_read(0x05);
|
|
||||||
printf("Status: %08x\n", val);
|
|
||||||
}
|
|
||||||
printf("Fault: %08x\n", max_read(0x0a));
|
|
||||||
}
|
|
|
@ -28,13 +28,13 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "edid.h"
|
#include "edid.h"
|
||||||
|
|
||||||
#ifdef INPUT_TYPEC
|
#ifdef INPUT_PTN3460
|
||||||
|
|
||||||
#define PTN3460_I2C_ADDRESS (0x60)
|
#define PTN3460_I2C_ADDRESS (0x60)
|
||||||
#define PTN3460_I2C (i2c0)
|
#define PTN3460_I2C (i2c1)
|
||||||
#define PTN3460_HPD_PIN (8)
|
#define PTN3460_HPD_PIN (7)
|
||||||
#define PTN3460_PDN_PIN (9)
|
#define PTN3460_PDN_PIN (9)
|
||||||
#define PTN3460_VALID_PIN (2)
|
#define PTN3460_VALID_PIN (4)
|
||||||
|
|
||||||
void ptn3460_select_edid_emulation(uint8_t id) {
|
void ptn3460_select_edid_emulation(uint8_t id) {
|
||||||
uint8_t buf[2];
|
uint8_t buf[2];
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
//
|
//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifdef INPUT_TYPEC
|
#ifdef INPUT_PTN3460
|
||||||
void ptn3460_init(void);
|
void ptn3460_init(void);
|
||||||
void ptn3460_set_aux_polarity(int reverse);
|
void ptn3460_set_aux_polarity(int reverse);
|
||||||
bool ptn3460_is_valid(void);
|
bool ptn3460_is_valid(void);
|
||||||
|
|
|
@ -29,16 +29,13 @@ const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_COUNT] = {
|
||||||
{0, FUSB302_I2C_SLAVE_ADDR, &fusb302_tcpm_drv},
|
{0, FUSB302_I2C_SLAVE_ADDR, &fusb302_tcpm_drv},
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TCPC_I2C i2c0
|
#define TCPC_I2C i2c1
|
||||||
#define TCPC_I2C_SDA 0
|
#define TCPC_I2C_SDA 0
|
||||||
#define TCPC_I2C_SCL 1
|
#define TCPC_I2C_SCL 1
|
||||||
|
|
||||||
void tcpc_i2c_init(void) {
|
void tcpc_i2c_init(void) {
|
||||||
i2c_init(TCPC_I2C, 100*1000);
|
// Should be initialized at board level init to avoid dependencies between
|
||||||
gpio_set_function(TCPC_I2C_SDA, GPIO_FUNC_I2C);
|
// drivers that need I2C
|
||||||
gpio_set_function(TCPC_I2C_SCL, GPIO_FUNC_I2C);
|
|
||||||
gpio_pull_up(TCPC_I2C_SDA);
|
|
||||||
gpio_pull_up(TCPC_I2C_SCL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* I2C wrapper functions - get I2C port / slave addr from config struct. */
|
/* I2C wrapper functions - get I2C port / slave addr from config struct. */
|
||||||
|
|
|
@ -1,83 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright 2022 Wenting Zhang <zephray@outlook.com>
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
// SOFTWARE.
|
|
||||||
//
|
|
||||||
#include "pico/stdlib.h"
|
|
||||||
#include "hardware/i2c.h"
|
|
||||||
#include "tps65185.h"
|
|
||||||
|
|
||||||
#define TPS_I2C i2c0
|
|
||||||
#define TPS_I2C_ADDR 0x68
|
|
||||||
//#define TPS_I2C_ADDR 0x34
|
|
||||||
|
|
||||||
#define TPS_EN_PIN 21
|
|
||||||
|
|
||||||
void tps_write(uint8_t reg, uint8_t val) {
|
|
||||||
uint8_t buf[2];
|
|
||||||
int result;
|
|
||||||
buf[0] = reg;
|
|
||||||
buf[1] = val;
|
|
||||||
result = i2c_write_blocking(TPS_I2C, TPS_I2C_ADDR, buf, 2, false);
|
|
||||||
if (result != 2) {
|
|
||||||
fatal("Failed writing data to TPS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t tps_read(uint8_t reg) {
|
|
||||||
int result;
|
|
||||||
uint8_t buf[1];
|
|
||||||
buf[0] = reg;
|
|
||||||
result = i2c_write_blocking(TPS_I2C, TPS_I2C_ADDR, buf, 1, true);
|
|
||||||
if (result != 1) {
|
|
||||||
fatal("Failed writing data to TPS");
|
|
||||||
}
|
|
||||||
result = i2c_read_blocking(TPS_I2C, TPS_I2C_ADDR, buf, 1, false);
|
|
||||||
if (result != 1) {
|
|
||||||
fatal("Failed reading data from TPS");
|
|
||||||
}
|
|
||||||
return buf[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
void tps_set_vcom(uint16_t vcom) {
|
|
||||||
tps_write(0x04, (vcom >> 16));
|
|
||||||
tps_write(0x03, vcom & 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tps_enable(bool en) {
|
|
||||||
gpio_put(TPS_EN_PIN, en);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tps_init(void) {
|
|
||||||
gpio_init(TPS_EN_PIN);
|
|
||||||
gpio_put(TPS_EN_PIN, 1);
|
|
||||||
gpio_set_dir(TPS_EN_PIN, GPIO_OUT);
|
|
||||||
for (int i = 0; i < 100; i++) {
|
|
||||||
sleep_ms(5);
|
|
||||||
uint8_t val = tps_read(0x0f);
|
|
||||||
printf("Val: %08x\n", val);
|
|
||||||
}
|
|
||||||
sleep_ms(1000);
|
|
||||||
tps_set_vcom(212); // -1V
|
|
||||||
printf("VADJ: %08x\n", tps_read(0x02));
|
|
||||||
printf("UPSEQ0: %08x\n", tps_read(0x09));
|
|
||||||
printf("UPSEQ1: %08x\n", tps_read(0x0a));
|
|
||||||
printf("INT1: %08x\n", tps_read(0x07));
|
|
||||||
printf("INT2: %08x\n", tps_read(0x08));
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright 2022 Wenting Zhang <zephray@outlook.com>
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
// SOFTWARE.
|
|
||||||
//
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
void tps_init(void);
|
|
||||||
void tps_enable(bool en);
|
|
||||||
void tps_set_vcom(uint16_t vcom);
|
|
Loading…
Reference in a new issue