[Keyboard] Add PloopyCo devices (#7935)
* Initial Commit for Ploopyco Trackball This is a WIP at this point. Most of it compiles, but the SPI commands are non-functioning as they come from Arduino, so don't exist in LUFA * Convert SPI commands from arduino to LUFA But I have no idea if this is actually correct or not * Update keyboard readme * Clean up ploopyco trackball * Update readme * Update mouse key stuff * last minutue cleanup * Add caveat about scroll wheel * Fixup to code * Additional fixup * Add movement multiplier * Rename folders * mid changes * temp * Got it working!!!!! * Additional cleanup of code * Make unused pin calls more compact * Rotation info * Add debouncing checks * Make everything replaceable * Add info.json * Include ISP flashing info * Better handling for user customization * Reconfigure CPI stuff * fix issues with debug printing * Fix tiny scroll issue * Add and update scroll code from ploopy mouse * Update licensing * Add PloopyCo Mouse * Cleanup and layout stuff * Move common files to main folder for reuse * Increase polling rate * Update image for mouse * Apply changes from code review * Add VIA support
This commit is contained in:
		
							parent
							
								
									34b9c51d9c
								
							
						
					
					
						commit
						fbdc65e2e9
					
				
					 25 changed files with 1938 additions and 0 deletions
				
			
		
							
								
								
									
										103
									
								
								keyboards/ploopyco/pmw3600.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								keyboards/ploopyco/pmw3600.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,103 @@
 | 
			
		|||
/* Copyright 2020 Christopher Courtney, aka Drashna Jael're  (@drashna) <drashna@live.com>
 | 
			
		||||
 * Copyright 2019 Sunjun Kim
 | 
			
		||||
 * Copyright 2020 Ploopy Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "spi_master.h"
 | 
			
		||||
 | 
			
		||||
// Registers
 | 
			
		||||
#define REG_Product_ID  0x00
 | 
			
		||||
#define REG_Revision_ID 0x01
 | 
			
		||||
#define REG_Motion  0x02
 | 
			
		||||
#define REG_Delta_X_L 0x03
 | 
			
		||||
#define REG_Delta_X_H 0x04
 | 
			
		||||
#define REG_Delta_Y_L 0x05
 | 
			
		||||
#define REG_Delta_Y_H 0x06
 | 
			
		||||
#define REG_SQUAL 0x07
 | 
			
		||||
#define REG_Raw_Data_Sum  0x08
 | 
			
		||||
#define REG_Maximum_Raw_data  0x09
 | 
			
		||||
#define REG_Minimum_Raw_data  0x0A
 | 
			
		||||
#define REG_Shutter_Lower 0x0B
 | 
			
		||||
#define REG_Shutter_Upper 0x0C
 | 
			
		||||
#define REG_Control 0x0D
 | 
			
		||||
#define REG_Config1 0x0F
 | 
			
		||||
#define REG_Config2 0x10
 | 
			
		||||
#define REG_Angle_Tune  0x11
 | 
			
		||||
#define REG_Frame_Capture 0x12
 | 
			
		||||
#define REG_SROM_Enable 0x13
 | 
			
		||||
#define REG_Run_Downshift 0x14
 | 
			
		||||
#define REG_Rest1_Rate_Lower  0x15
 | 
			
		||||
#define REG_Rest1_Rate_Upper  0x16
 | 
			
		||||
#define REG_Rest1_Downshift 0x17
 | 
			
		||||
#define REG_Rest2_Rate_Lower  0x18
 | 
			
		||||
#define REG_Rest2_Rate_Upper  0x19
 | 
			
		||||
#define REG_Rest2_Downshift 0x1A
 | 
			
		||||
#define REG_Rest3_Rate_Lower  0x1B
 | 
			
		||||
#define REG_Rest3_Rate_Upper  0x1C
 | 
			
		||||
#define REG_Observation 0x24
 | 
			
		||||
#define REG_Data_Out_Lower  0x25
 | 
			
		||||
#define REG_Data_Out_Upper  0x26
 | 
			
		||||
#define REG_Raw_Data_Dump 0x29
 | 
			
		||||
#define REG_SROM_ID 0x2A
 | 
			
		||||
#define REG_Min_SQ_Run  0x2B
 | 
			
		||||
#define REG_Raw_Data_Threshold  0x2C
 | 
			
		||||
#define REG_Config5 0x2F
 | 
			
		||||
#define REG_Power_Up_Reset  0x3A
 | 
			
		||||
#define REG_Shutdown  0x3B
 | 
			
		||||
#define REG_Inverse_Product_ID  0x3F
 | 
			
		||||
#define REG_LiftCutoff_Tune3  0x41
 | 
			
		||||
#define REG_Angle_Snap  0x42
 | 
			
		||||
#define REG_LiftCutoff_Tune1  0x4A
 | 
			
		||||
#define REG_Motion_Burst  0x50
 | 
			
		||||
#define REG_LiftCutoff_Tune_Timeout 0x58
 | 
			
		||||
#define REG_LiftCutoff_Tune_Min_Length  0x5A
 | 
			
		||||
#define REG_SROM_Load_Burst 0x62
 | 
			
		||||
#define REG_Lift_Config 0x63
 | 
			
		||||
#define REG_Raw_Data_Burst  0x64
 | 
			
		||||
#define REG_LiftCutoff_Tune2  0x65
 | 
			
		||||
 | 
			
		||||
#ifdef CONSOLE_ENABLE
 | 
			
		||||
void print_byte(uint8_t byte);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    int8_t  motion;
 | 
			
		||||
    bool    isMotion;     // True if a motion is detected.
 | 
			
		||||
    bool    isOnSurface;  // True when a chip is on a surface
 | 
			
		||||
    int16_t dx;           // displacement on x directions. Unit: Count. (CPI * Count = Inch value)
 | 
			
		||||
    int8_t  mdx;
 | 
			
		||||
    int16_t dy;  // displacement on y directions.
 | 
			
		||||
    int8_t  mdy;
 | 
			
		||||
} report_pmw_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool spi_start_adv(void);
 | 
			
		||||
void spi_stop_adv(void);
 | 
			
		||||
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);
 | 
			
		||||
void pmw_upload_firmware(void);
 | 
			
		||||
bool pmw_check_signature(void);
 | 
			
		||||
report_pmw_t pmw_read_burst(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define degToRad(angleInDegrees) ((angleInDegrees)*M_PI / 180.0)
 | 
			
		||||
#define radToDeg(angleInRadians) ((angleInRadians)*180.0 / M_PI)
 | 
			
		||||
#define constrain(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)))
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue