Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move optical sensor code to drivers folder #13044

Merged
merged 5 commits into from
Jun 21, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions keyboards/ploopyco/adns5050.c → drivers/sensors/adns5050.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,16 @@


#include "adns5050.h"
#include "quantum.h"
#include "wait.h"

#ifdef CONSOLE_ENABLE
# include "print.h"
#endif
#include "debug.h"
#include "print.h"
#include "gpio.h"

#ifndef OPTIC_ROTATED
# define OPTIC_ROTATED false
#endif

// Definitions for the ADNS serial line.
// These really ought to be defined in your config.h, but defaults are
// here if you're really lazy.
#ifndef ADNS_SCLK_PIN
# define ADNS_SCLK_PIN B7
#endif
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
#include "spi_master.h"
#include "quantum.h"
#include "adns9800_srom_A6.h"
#include "adns.h"
#include "adns9800.h"

// registers
#define REG_Product_ID 0x00
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ static float precisionSpeed = 1;

static uint16_t i2c_timeout_timer;

#ifndef I2C_TIMEOUT
# define I2C_TIMEOUT 100
#ifndef PIMORONI_I2C_TIMEOUT
# define PIMORONI_I2C_TIMEOUT 100
#endif
#ifndef I2C_WAITCHECK
# define I2C_WAITCHECK 1000
Expand All @@ -38,7 +38,7 @@ static uint16_t i2c_timeout_timer;

void trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white) {
uint8_t data[] = {0x00, red, green, blue, white};
i2c_transmit(TRACKBALL_WRITE, data, sizeof(data), I2C_TIMEOUT);
i2c_transmit(TRACKBALL_WRITE, data, sizeof(data), PIMORONI_I2C_TIMEOUT);
}

int16_t mouse_offset(uint8_t positive, uint8_t negative, int16_t scale) {
Expand Down Expand Up @@ -68,59 +68,19 @@ __attribute__((weak)) void trackball_check_click(bool pressed, report_mouse_t* m
}
}

bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
if (true) {
xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
}


if (!process_record_user(keycode, record)) { return false; }

/* If Mousekeys is disabled, then use handle the mouse button
* keycodes. This makes things simpler, and allows usage of
* the keycodes in a consistent manner. But only do this if
* Mousekeys is not enable, so it's not handled twice.
*/
#ifndef MOUSEKEY_ENABLE
if (IS_MOUSEKEY_BUTTON(keycode)) {
report_mouse_t currentReport = pointing_device_get_report();
if (record->event.pressed) {
currentReport.buttons |= 1 << (keycode - KC_MS_BTN1);
} else {
currentReport.buttons &= ~(1 << (keycode - KC_MS_BTN1));
}
pointing_device_set_report(currentReport);
pointing_device_send();
}
#endif

return true;
}

void trackball_register_button(bool pressed, enum mouse_buttons button) {
report_mouse_t currentReport = pointing_device_get_report();
if (pressed) {
currentReport.buttons |= button;
} else {
currentReport.buttons &= ~button;
}
pointing_device_set_report(currentReport);
}

float trackball_get_precision(void) { return precisionSpeed; }
void trackball_set_precision(float precision) { precisionSpeed = precision; }
bool trackball_is_scrolling(void) { return scrolling; }
void trackball_set_scrolling(bool scroll) { scrolling = scroll; }


__attribute__((weak)) void pointing_device_init(void) { trackball_set_rgbw(0x80, 0x00, 0x00, 0x00); }
__attribute__((weak)) void pointing_device_init(void) { i2c_init(); trackball_set_rgbw(0x00, 0x00, 0x00, 0x00); }

void pointing_device_task(void) {
static bool debounce;
static uint16_t debounce_timer;
uint8_t state[5] = {};
if (timer_elapsed(i2c_timeout_timer) > I2C_WAITCHECK) {
if (i2c_readReg(TRACKBALL_WRITE, 0x04, state, 5, I2C_TIMEOUT) == I2C_STATUS_SUCCESS) {
if (i2c_readReg(TRACKBALL_READ, 0x04, state, 5, PIMORONI_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) {
if (!state[4] && !debounce) {
if (scrolling) {
#ifdef PIMORONI_TRACKBALL_INVERT_X
Expand Down Expand Up @@ -159,7 +119,10 @@ void pointing_device_task(void) {
if (timer_elapsed(debounce_timer) > MOUSE_DEBOUNCE) debounce = false;

report_mouse_t mouse = pointing_device_get_report();
// trackball_check_click(state[4] & (1 << 7), &mouse);

#ifdef PIMORONI_TRACKBALL_CLICK
trackball_check_click(state[4] & (1 << 7), &mouse);
#endif

#ifndef PIMORONI_TRACKBALL_ROTATE
update_member(&mouse.x, &x_offset);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#ifdef POINTING_DEVICE_ENABLE

#include "wait.h"
#include "debug.h"
#include "print.h"
Expand All @@ -29,17 +27,26 @@ bool _inBurst = false;
#ifndef PMW_CPI
# define PMW_CPI 1600
#endif
#ifndef PMW_CLOCK_SPEED
# define PMW_CLOCK_SPEED 70000000
#endif
#ifndef SPI_MODE
# define SPI_MODE 3
#endif
#ifndef SPI_DIVISOR
# define SPI_DIVISOR 2
# define SPI_DIVISOR (F_CPU / PMW_CLOCK_SPEED)
#endif
#ifndef ROTATIONAL_TRANSFORM_ANGLE
# define ROTATIONAL_TRANSFORM_ANGLE 0x00
#endif
#ifndef PMW_CS_PIN
# define PMW_CS_PIN SPI_SS_PIN
#endif

void print_byte(uint8_t byte) { dprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1' : '0'), (byte & 0x40 ? '1' : '0'), (byte & 0x20 ? '1' : '0'), (byte & 0x10 ? '1' : '0'), (byte & 0x08 ? '1' : '0'), (byte & 0x04 ? '1' : '0'), (byte & 0x02 ? '1' : '0'), (byte & 0x01 ? '1' : '0')); }

bool spi_start_adv(void) {
bool status = spi_start(SPI_SS_PIN, false, 3, SPI_DIVISOR);
bool status = spi_start(PMW_CS_PIN, false, SPI_MODE, SPI_DIVISOR);
wait_us(1);
return status;
}
Expand All @@ -57,7 +64,7 @@ spi_status_t spi_write_adv(uint8_t reg_addr, uint8_t data) {
spi_start_adv();
// send address of the register, with MSBit = 1 to indicate it's a write
spi_status_t status = spi_write(reg_addr | 0x80);
status = spi_write(data);
status = spi_write(data);

// tSCLK-NCS for write operation
wait_us(20);
Expand Down Expand Up @@ -86,22 +93,29 @@ uint8_t spi_read_adv(uint8_t reg_addr) {
}

void pmw_set_cpi(uint16_t cpi) {
int cpival = constrain((cpi / 100) - 1, 0, 0x77); // limits to 0--119
uint8_t cpival = constrain((cpi / 100) - 1, 0, 0x77); // limits to 0--119

spi_start_adv();
spi_write_adv(REG_Config1, cpival);
spi_stop();
}

uint16_t pmw_get_cpi(void) {
uint8_t cpival = spi_read_adv(REG_Config1);
return (uint16_t)(cpival & 0xFF) * 100;
}

bool pmw_spi_init(void) {
setPinOutput(PMW_CS_PIN);

spi_init();
_inBurst = false;

spi_stop();
spi_start_adv();
spi_stop();

spi_write_adv(REG_Shutdown, 0xb6); // Shutdown first
spi_write_adv(REG_Shutdown, 0xb6); // Shutdown first
wait_ms(300);

spi_start_adv();
Expand All @@ -127,14 +141,18 @@ bool pmw_spi_init(void) {

wait_ms(1);

return pmw_check_signature();
}

void pmw_upload_firmware(void) {
spi_write_adv(REG_Config2, 0x00);

spi_write_adv(REG_Angle_Tune, constrain(ROTATIONAL_TRANSFORM_ANGLE, -30, 30));

bool init_success = pmw_check_signature();

writePinLow(PMW_CS_PIN);

return init_success;
}

void pmw_upload_firmware(void) {
spi_write_adv(REG_SROM_Enable, 0x1d);

wait_ms(10);
Expand Down Expand Up @@ -217,5 +235,3 @@ report_pmw_t pmw_read_burst(void) {

return data;
}

#endif
1 change: 1 addition & 0 deletions keyboards/ploopyco/pmw3360.h → drivers/sensors/pmw3360.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ spi_status_t spi_write_adv(uint8_t reg_addr, uint8_t data);
uint8_t spi_read_adv(uint8_t reg_addr);
bool pmw_spi_init(void);
void pmw_set_cpi(uint16_t cpi);
uint16_t pmw_get_cpi(void);
void pmw_upload_firmware(void);
bool pmw_check_signature(void);
report_pmw_t pmw_read_burst(void);
Expand Down
2 changes: 1 addition & 1 deletion keyboards/draculad/keymaps/pimoroni/keymap.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include QMK_KEYBOARD_H
#include "pimoroni_trackball.h"
#include "drivers/sensors/pimoroni_trackball.h"
#include "pointing_device.h"


Expand Down
35 changes: 0 additions & 35 deletions keyboards/draculad/keymaps/pimoroni/pimoroni_trackball.h

This file was deleted.

2 changes: 1 addition & 1 deletion keyboards/draculad/keymaps/pimoroni/rules.mk
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# only uncomment on the side you have your trackball on
POINTING_DEVICE_ENABLE = yes
SRC += pimoroni_trackball.c
SRC += drivers/sensors/pimoroni_trackball.c
QUANTUM_LIB_SRC += i2c_master.c
OLED_DRIVER_ENABLE = yes
MOUSEKEY_ENABLE = no
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#include "dactyl_manuform.h"
#include "quantum.h"
#include "spi_master.h"
#include "pmw3360.h"
#include "drivers/sensors/pmw3360.h"
#include "pointing_device.h"


Expand Down
Loading