From 0aa7b8871e4909de2d1d16add65d617c97df0feb Mon Sep 17 00:00:00 2001 From: jaseg Date: Mon, 22 Jun 2020 23:58:20 +0200 Subject: Initial minikbd mod --- hid-dials/Src/main.c | 338 +++++++++++++++++---------------------------------- 1 file changed, 110 insertions(+), 228 deletions(-) (limited to 'hid-dials/Src/main.c') diff --git a/hid-dials/Src/main.c b/hid-dials/Src/main.c index 58c40ad..0aa694f 100644 --- a/hid-dials/Src/main.c +++ b/hid-dials/Src/main.c @@ -1,4 +1,6 @@ +#include + #include "main.h" #include "usb_device.h" #include "usbd_hid.h" @@ -13,12 +15,13 @@ PCD_HandleTypeDef hpcd_USB_FS; void SystemClock_Config(void); static void MX_GPIO_Init(void); -static void MX_DMA_Init(void); -static void MX_ADC_Init(void); -static void MX_USB_PCD_Init(void); -void sendVolDown(void); -void sendVolUp(void); +enum keybits { + KEYBITS_VOL_UP = 0x20, + KEYBITS_VOL_DOWN = 0x40, +}; + +void sendKeybits(uint8_t keybits); struct key_t { @@ -32,94 +35,69 @@ uint16_t ADCreg[8]; uint16_t ADCval[8]; uint16_t ADClast[8]; +/* FIXME debug remove */ +TIM_TypeDef *tim1 = TIM1; +TIM_TypeDef *tim3 = TIM3; + int main(void) { - HAL_Init(); - - SystemClock_Config(); - - MX_GPIO_Init(); - MX_DMA_Init(); - MX_ADC_Init(); - MX_USB_HID_INIT(); - - HAL_ADC_Start_DMA(&hadc, ADCreg, 8); - - while (1) - { - - - for(int i = 0; i < 8; i++){ - ADCval[i] = ADCreg[i]; - if(ADCval[i] - ADClast[i] > 2000 || ADClast[i] - ADCval[i] > 2000 ) ADClast[i] = ADCval[i]; - } - - // Volume Dial 8 - if(ADCval[0] >= ADClast[0] + HYSTERESIS){ - sendVolUp(); - ADClast[0] = ADCval[0]; - } else if(ADCval[0] <= ADClast[0] - HYSTERESIS){ - sendVolDown(); - ADClast[0] = ADCval[0]; - } - - // Dial 1 - if(ADCval[1] >= ADClast[1] + HYSTERESIS){ - } else if(ADCval[1] <= ADClast[1] - HYSTERESIS){ - } - - // SwitchLayer - if(ADCval[2] >= ADClast[2] + HYSTERESIS){ - sendChar('v'); - ADClast[2] = ADCval[2]; - } else if(ADCval[2] <= ADClast[2] - HYSTERESIS){ - sendChar('v'); - ADClast[2] = ADCval[2]; - } - - // RotatePart Dial 3 - if(ADCval[3] >= ADClast[3] + HYSTERESIS){ - sendChar('R'); - ADClast[3] = ADCval[3]; - } else if(ADCval[3] <= ADClast[3] - HYSTERESIS){ - sendChar('r'); - ADClast[3] = ADCval[3]; - } - - // Grid Dial 4 - if(ADCval[4] >= ADClast[4] + HYSTERESIS){ - sendChar('n'); - ADClast[4] = ADCval[4]; - } else if(ADCval[4] <= ADClast[4] - HYSTERESIS){ - sendChar('N'); - ADClast[4] = ADCval[4]; - } - - // via - if(ADCval[5] >= ADClast[5] + HYSTERESIS){ - } else if(ADCval[5] <= ADClast[5] - HYSTERESIS){ - } - - // Trackwidth Dial 6 - if(ADCval[6] >= ADClast[6] + HYSTERESIS){ - sendChar('w'); - ADClast[6] = ADCval[6]; - } else if(ADCval[6] <= ADClast[6] - HYSTERESIS){ - sendChar('W'); - ADClast[6] = ADCval[6]; - } - - // zoom - if(ADCval[7] >= ADClast[7] + HYSTERESIS){ - sendCharWrong(0x3a); - ADClast[7] = ADCval[7]; - } else if(ADCval[7] <= ADClast[7] - HYSTERESIS){ - sendCharWrong(0x3b); - ADClast[7] = ADCval[7]; + HAL_Init(); + + SystemClock_Config(); + + MX_GPIO_Init(); + MX_USB_HID_INIT(); + + __HAL_RCC_TIM1_CLK_ENABLE(); + __HAL_RCC_TIM3_CLK_ENABLE(); + + TIM1->SMCR = 3; // Encoder mode 3 + TIM1->CCER = 0; // rising edge polarity + TIM1->ARR = 0xFFFF; // count from 0-ARR or ARR-0 + TIM1->CCMR1 = 0x0101; // f_DTS/16, N=8, IC1->TI1, IC2->TI2 + TIM1->CNT = 0; // Initialize counter + TIM1->EGR = 1; // Generate an update event + TIM1->CR1 = 1; // Enable the counter + + TIM3->SMCR = 3; // Encoder mode 3 + TIM3->CCER = 0; // rising edge polarity + TIM3->ARR = 0xFFFF; // count from 0-ARR or ARR-0 + TIM3->CCMR1 = 0x0101; // f_DTS/16, N=8, IC1->TI1, IC2->TI2 + TIM3->CNT = 0; // Initialize counter + TIM3->EGR = 1; // Generate an update event + TIM3->CR1 = 1; // Enable the counter + + uint16_t tim1_last = TIM1->CNT, tim3_last = TIM3->CNT; + int vol_delta = 0; + bool tx_vol_reset = 0; + while (1) { + uint16_t tim1_now = TIM1->CNT, tim3_now = TIM3->CNT; + int16_t tim1_delta = (int16_t)(tim1_now - tim1_last); + int16_t tim3_delta = (int16_t)(tim3_now - tim3_last); + + vol_delta += tim3_delta - tim1_delta; + +#define VOL_DELTA_INC 4 + uint8_t keybits = 0; + if (!tx_vol_reset) { + if (vol_delta >= VOL_DELTA_INC) { + keybits |= KEYBITS_VOL_UP; + vol_delta -= VOL_DELTA_INC; + tx_vol_reset = 1; + } else if (vol_delta <= -VOL_DELTA_INC) { + keybits |= KEYBITS_VOL_DOWN; + vol_delta += VOL_DELTA_INC; + tx_vol_reset = 1; + } + } else { + tx_vol_reset = 0; + } + sendKeybits(keybits); + + tim1_last = tim1_now; + tim3_last = tim3_now; + HAL_Delay(10); } - - HAL_Delay(10); - } } @@ -293,154 +271,58 @@ void sendCharWrong(uint8_t ch){ HAL_Delay(10); } -void sendVolUp(){ - uint8_t report[3]; - report[0]= HID_MEDIA_REPORT; - report[1]= 0xE9; - report[2]= 0x00; - USBD_HID_SendReport(&hUsbDeviceFS, report, 3); - HAL_Delay(10); - - report[0]= HID_MEDIA_REPORT; - report[1]= 0x00; - report[2]= 0x00; - USBD_HID_SendReport(&hUsbDeviceFS, report, 3); -} - -void sendVolDown(){ - uint8_t report[3]; - report[0]= HID_MEDIA_REPORT; - report[1]= 0xEA; - report[2]= 0x00; - USBD_HID_SendReport(&hUsbDeviceFS, report, 3); - HAL_Delay(10); - - report[0]= HID_MEDIA_REPORT; - report[1]= 0x00; - report[2]= 0x00; - USBD_HID_SendReport(&hUsbDeviceFS, report, 3); +void sendKeybits(uint8_t keybits){ + uint8_t report[2]; + report[0]= HID_MEDIA_REPORT; + report[1]= keybits; + USBD_HID_SendReport(&hUsbDeviceFS, report, 2); } void SystemClock_Config(void) { - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; - - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI14|RCC_OSCILLATORTYPE_HSI48; - RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; - RCC_OscInitStruct.HSI14State = RCC_HSI14_ON; - RCC_OscInitStruct.HSI14CalibrationValue = 16; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; - HAL_RCC_OscConfig(&RCC_OscInitStruct); - - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI48; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; - HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1); - - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB; - PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48; - HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI14|RCC_OSCILLATORTYPE_HSI48; + RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; + RCC_OscInitStruct.HSI14State = RCC_HSI14_ON; + RCC_OscInitStruct.HSI14CalibrationValue = 16; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + HAL_RCC_OscConfig(&RCC_OscInitStruct); + + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI48; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1); + + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48; + HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); } -static void MX_ADC_Init(void) -{ +static void MX_GPIO_Init(void) { + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); - ADC_ChannelConfTypeDef sConfig = {0}; - - hadc.Instance = ADC1; - hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; - hadc.Init.Resolution = ADC_RESOLUTION_12B; - hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; - hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV; - hadc.Init.LowPowerAutoWait = DISABLE; - hadc.Init.LowPowerAutoPowerOff = DISABLE; - hadc.Init.ContinuousConvMode = ENABLE; - hadc.Init.DiscontinuousConvMode = DISABLE; - hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; - hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - hadc.Init.DMAContinuousRequests = ENABLE; - hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED; - HAL_ADC_Init(&hadc); - - sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; - sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5; - sConfig.Channel = ADC_CHANNEL_1; - HAL_ADC_ConfigChannel(&hadc, &sConfig); - - sConfig.Channel = ADC_CHANNEL_2; - HAL_ADC_ConfigChannel(&hadc, &sConfig); - - sConfig.Channel = ADC_CHANNEL_3; - HAL_ADC_ConfigChannel(&hadc, &sConfig); - - sConfig.Channel = ADC_CHANNEL_4; - HAL_ADC_ConfigChannel(&hadc, &sConfig); - - sConfig.Channel = ADC_CHANNEL_5; - HAL_ADC_ConfigChannel(&hadc, &sConfig); - - sConfig.Channel = ADC_CHANNEL_6; - HAL_ADC_ConfigChannel(&hadc, &sConfig); - - sConfig.Channel = ADC_CHANNEL_7; - HAL_ADC_ConfigChannel(&hadc, &sConfig); - - sConfig.Channel = ADC_CHANNEL_8; - HAL_ADC_ConfigChannel(&hadc, &sConfig); -} - -static void MX_USB_PCD_Init(void) -{ - - hpcd_USB_FS.Instance = USB; - hpcd_USB_FS.Init.dev_endpoints = 8; - hpcd_USB_FS.Init.speed = PCD_SPEED_FULL; - hpcd_USB_FS.Init.phy_itface = PCD_PHY_EMBEDDED; - hpcd_USB_FS.Init.low_power_enable = DISABLE; - hpcd_USB_FS.Init.lpm_enable = DISABLE; - hpcd_USB_FS.Init.battery_charging_enable = DISABLE; - HAL_PCD_Init(&hpcd_USB_FS); -} - - -static void MX_DMA_Init(void) -{ - __HAL_RCC_DMA1_CLK_ENABLE(); - - HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); -} - - -static void MX_GPIO_Init(void) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET); - - GPIO_InitStruct.Pin = GPIO_PIN_13; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + GPIOA->MODER = 0x28000000 | (2<<(8*2)) | (2<<(9*2)); + GPIOB->MODER = (2<<(4*2)) | (2<<(5*2)); + GPIOA->PUPDR = 0x24000000 | (1<<(8*2)) | (1<<(9*2)); + GPIOB->PUPDR = (1<<(4*2)) | (1<<(5*2)); + GPIOA->AFR[1]= 0x00000022; + GPIOB->AFR[0]= 0x00110000; } void Error_Handler(void) { - while(1){ - HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1); - HAL_Delay(100); - HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0); - HAL_Delay(100); - } + while(1){ + HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1); + HAL_Delay(100); + HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0); + HAL_Delay(100); + } } + -- cgit