added ADB to new card

This commit is contained in:
dekunukem
2023-03-04 19:14:32 +00:00
parent c7d4aec61c
commit d793c6a971
30 changed files with 3444 additions and 2009 deletions

View File

@@ -37,11 +37,19 @@
#define DEBUG1_HI() HAL_GPIO_WritePin(DEBUG1_GPIO_Port, DEBUG1_Pin, GPIO_PIN_SET)
#define DEBUG1_LOW() HAL_GPIO_WritePin(DEBUG1_GPIO_Port, DEBUG1_Pin, GPIO_PIN_RESET)
// #define DEBUG0_HI() {}
// #define DEBUG0_LOW() {}
#define KEY_DELETE 111
#define KEY_CAPSLOCK 58
#define KEY_LEFTCTRL 29
#define KEY_LEFTSHIFT 42
#define KEY_LEFTALT 56
#define KEY_LEFTMETA 125
#define KEY_NUMLOCK 69
#define KEY_SCROLLLOCK 70
// #define DEBUG1_HI() {}
// #define DEBUG1_LOW() {}
#define KEY_RIGHTCTRL 97
#define KEY_RIGHTSHIFT 54
#define KEY_RIGHTALT 100
#define KEY_RIGHTMETA 126
#define ADB_CLK_35 34
#define ADB_CLK_65 64

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

@@ -27,6 +27,7 @@ Project File Date: 03/04/2023
<h2>Output:</h2>
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'my_adb'
compiling adb.c...
compiling main.c...
linking...
Program Size: Code=10556 RO-data=496 RW-data=64 ZI-data=1952

View File

@@ -3,7 +3,7 @@
<title>Static Call Graph - [my_adb\my_adb.axf]</title></head>
<body><HR>
<H1>Static Call Graph for image my_adb\my_adb.axf</H1><HR>
<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Sat Mar 04 18:12:57 2023
<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Sat Mar 04 18:18:46 2023
<BR><P>
<H3>Maximum Stack Usage = 180 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
Call chain for Maximum Stack Depth:</H3>

View File

@@ -2328,7 +2328,7 @@ Image component sizes
1036 80 186 20 0 460386 adb.o
52 10 0 4 0 1923 delay_us.o
350 0 0 0 0 7511 helpers.o
2376 276 61 16 416 19829 main.o
2376 276 61 16 416 19593 main.o
88 38 192 0 1536 640 startup_stm32f042x6.o
122 18 0 4 0 3587 stm32f0xx_hal.o
178 28 0 0 0 10471 stm32f0xx_hal_cortex.o
@@ -2345,7 +2345,7 @@ Image component sizes
92 14 24 4 0 1123 system_stm32f0xx.o
----------------------------------------------------------------------
9712 726 496 48 1952 546967 Object Totals
9712 726 496 48 1952 546731 Object Totals
0 0 32 0 0 0 (incl. Generated)
30 0 1 0 0 0 (incl. Padding)
@@ -2392,8 +2392,8 @@ Image component sizes
Code (inc. data) RO Data RW Data ZI Data Debug
10556 782 496 64 1952 542691 Grand Totals
10556 782 496 64 1952 542691 ELF Image Totals
10556 782 496 64 1952 542455 Grand Totals
10556 782 496 64 1952 542455 ELF Image Totals
10556 782 496 64 0 0 ROM Totals
==============================================================================

View File

@@ -1,7 +1,7 @@
Dependencies for Project 'my_adb', Target 'my_adb': (DO NOT MODIFY !)
CompilerVersion: 5060750::V5.06 update 6 (build 750)::ARMCC
F (startup_stm32f042x6.s)(0x637DDD5C)(--cpu Cortex-M0 -g --apcs=interwork --pd "__MICROLIB SETA 1"
-I.\RTE\_my_adb
-IC:\Users\allen\AppData\Local\Arm\Packs\ARM\CMSIS\5.6.0\CMSIS\Core\Include
@@ -39,7 +39,7 @@ I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim_ex.h)(0x637DDD5C)
I (../Drivers/CMSIS/Include/cmsis_armcc.h)(0x637DDD5C)
I (../Drivers/CMSIS/Include/core_cmFunc.h)(0x637DDD5C)
I (../Drivers/CMSIS/Device/ST/STM32F0xx/Include/system_stm32f0xx.h)(0x637DDD5C)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rcc_ex.h)(0x637DDD5C)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rcc_ex.h)(0x637DDD5C)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio.h)(0x637DDD5C)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio_ex.h)(0x637DDD5C)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma.h)(0x637DDD5C)
@@ -114,10 +114,10 @@ I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim_ex.h)(0x637DDD5C)
-IC:\Users\allen\AppData\Local\Arm\Packs\Keil\STM32F0xx_DFP\2.0.0\Drivers\CMSIS\Device\ST\STM32F0xx\Include
-D__UVISION_VERSION="529" -D_RTE_ -DSTM32F042x6 -DUSE_HAL_DRIVER -DSTM32F042x6
-D__UVISION_VERSION="529" -D_RTE_ -DSTM32F042x6 -DUSE_HAL_DRIVER -DSTM32F042x6
-o my_adb\helpers.o --omf_browse my_adb\helpers.crf --depend my_adb\helpers.d)
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x5D9B429A)
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x5D9B429A)
I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x5D9B4298)
I (C:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x5D9B429A)
I (../Inc/helpers.h)(0x637DDD5C)
@@ -156,7 +156,7 @@ I (C:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x5D9B429A)
I (../Inc/shared.h)(0x637DDD5C)
F (..\Inc\adb.h)(0x64038B83)()
F (..\Inc\delay_us.h)(0x637DDD5C)()
F (..\Inc\helpers.h)(0x637DDD5C)()
F (..\Inc\helpers.h)(0x637DDD5C)()
F (../Src/main.c)(0x64038B77)(--c99 -c --cpu Cortex-M0 -D__MICROLIB -g -O3 --apcs=interwork --split_sections -I ../Inc -I ../Drivers/STM32F0xx_HAL_Driver/Inc -I ../Drivers/STM32F0xx_HAL_Driver/Inc/Legacy -I ../Drivers/CMSIS/Device/ST/STM32F0xx/Include -I ../Drivers/CMSIS/Include
-I.\RTE\_my_adb

View File

@@ -299,20 +299,6 @@ void adb_mouse_update(void)
adb_send_response_16b(response);
}
#define KEY_DELETE 111
#define KEY_CAPSLOCK 58
#define KEY_LEFTCTRL 29
#define KEY_LEFTSHIFT 42
#define KEY_LEFTALT 56
#define KEY_LEFTMETA 125
#define KEY_NUMLOCK 69
#define KEY_SCROLLLOCK 70
#define KEY_RIGHTCTRL 97
#define KEY_RIGHTSHIFT 54
#define KEY_RIGHTALT 100
#define KEY_RIGHTMETA 126
uint8_t capslock_counter;
void adb_keyboard_update(void)
{
@@ -484,10 +470,10 @@ int main(void)
if(IS_ADB_HOST_PRESENT() == 0)
continue;
kb_enabled = is_protocol_enabled(PROTOCOL_ADB_KB);
mouse_enabled = is_protocol_enabled(PROTOCOL_ADB_MOUSE);
adb_kb_enabled = is_protocol_enabled(PROTOCOL_ADB_KB);
adb_mouse_enabled = is_protocol_enabled(PROTOCOL_ADB_MOUSE);
if(kb_enabled == 0 && mouse_enabled == 0)
if(adb_kb_enabled == 0 && adb_mouse_enabled == 0)
{
adb_reset();
continue;
@@ -512,17 +498,17 @@ int main(void)
mouse_srq = 0;
}
if((kb_srq && kb_enabled) || (mouse_srq && mouse_enabled))
if((kb_srq && adb_kb_enabled) || (mouse_srq && adb_mouse_enabled))
send_srq();
else
wait_until_change(ADB_DEFAULT_TIMEOUT_US);
adb_status = parse_adb_cmd(adb_data);
if(adb_status == ADB_MOUSE_POLL && mouse_enabled)
if(adb_status == ADB_MOUSE_POLL && adb_mouse_enabled)
adb_mouse_update();
else if(adb_status == ADB_KB_POLL && kb_enabled)
else if(adb_status == ADB_KB_POLL && adb_kb_enabled)
adb_keyboard_update();
else if(adb_status == ADB_KB_POLL_REG2 && kb_enabled)
else if(adb_status == ADB_KB_POLL_REG2 && adb_kb_enabled)
adb_send_response_16b(adb_kb_reg2);
else if(adb_status == ADB_KB_CHANGE_LED)
{

View File

@@ -0,0 +1,89 @@
#ifndef __ADB_H
#define __ADB_H
#ifdef __cplusplus
extern "C" {
#endif
#include "stm32f0xx_hal.h"
#define ADB_LINE_STATUS_ATTEN 1
#define ADB_LINE_STATUS_IDLE 2
#define ADB_LINE_STATUS_RESET 3
#define ADB_LINE_STATUS_BUSY 4
#define ADB_LINE_STATUS_ERROR 5
#define ADB_LINE_STATUS_COLLISION 6
#define ADB_TIMEOUT -1
#define ADB_OK 0
#define ADB_KB_POLL 2
#define ADB_KB_POLL_REG2 3
#define ADB_KB_CHANGE_LED 4
#define ADB_MOUSE_POLL 5
#define ADB_ERROR ADB_LINE_STATUS_ERROR
#define ADB_KB_DEFAULT_ADDR 2
#define ADB_MOUSE_DEFAULT_ADDR 3
#define ADB_CMD_TYPE_FLUSH 0
#define ADB_CMD_TYPE_LISTEN 2
#define ADB_CMD_TYPE_TALK 3
#define ADB_CHANGE_ADDR 0xFE
// #define DEBUG0_HI() HAL_GPIO_WritePin(DEBUG0_GPIO_Port, DEBUG0_Pin, GPIO_PIN_SET)
// #define DEBUG0_LOW() HAL_GPIO_WritePin(DEBUG0_GPIO_Port, DEBUG0_Pin, GPIO_PIN_RESET)
// #define DEBUG1_HI() HAL_GPIO_WritePin(DEBUG1_GPIO_Port, DEBUG1_Pin, GPIO_PIN_SET)
// #define DEBUG1_LOW() HAL_GPIO_WritePin(DEBUG1_GPIO_Port, DEBUG1_Pin, GPIO_PIN_RESET)
#define DEBUG0_HI() {}
#define DEBUG0_LOW() {}
#define DEBUG1_HI() {}
#define DEBUG1_LOW() {}
#define IS_ADB_HOST_PRESENT() HAL_GPIO_ReadPin(ADB_DET_GPIO_Port, ADB_DET_Pin)
#define KEY_DELETE 111
#define KEY_CAPSLOCK 58
#define KEY_LEFTCTRL 29
#define KEY_LEFTSHIFT 42
#define KEY_LEFTALT 56
#define KEY_LEFTMETA 125
#define KEY_NUMLOCK 69
#define KEY_SCROLLLOCK 70
#define KEY_RIGHTCTRL 97
#define KEY_RIGHTSHIFT 54
#define KEY_RIGHTALT 100
#define KEY_RIGHTMETA 126
#define ADB_CLK_35 34
#define ADB_CLK_65 64
#define EV_TO_ADB_LOOKUP_SIZE 186
#define ADB_DEFAULT_TIMEOUT_US 10000
#define ADB_KEY_UNKNOWN 255
#define ADB_KEY_CAPSLOCK 57
void adb_init(GPIO_TypeDef* data_port, uint16_t data_pin, GPIO_TypeDef* psw_port, uint16_t psw_pin);
uint8_t adb_recv_cmd(uint8_t* data);
uint8_t parse_adb_cmd(uint8_t data);
void adb_reset(void);
void adb_release_lines(void);
uint8_t adb_send_response_16b(uint16_t data);
void send_srq(void);
int32_t adb_wait_until_change(int32_t timeout_us);
extern uint8_t adb_mouse_current_addr, adb_kb_current_addr, adb_rw_in_progress;
extern const uint8_t linux_ev_to_adb_lookup[EV_TO_ADB_LOOKUP_SIZE];
extern uint16_t adb_kb_reg2;
extern uint8_t adb_kb_enabled, adb_mouse_enabled;
#ifdef __cplusplus
}
#endif
#endif

View File

File diff suppressed because one or more lines are too long

View File

@@ -383,6 +383,30 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>15</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Inc\adb.h</PathWithFileName>
<FilenameWithoutPath>adb.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Src\adb.c</PathWithFileName>
<FilenameWithoutPath>adb.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@@ -393,7 +417,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>15</FileNumber>
<FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -405,7 +429,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>16</FileNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -417,7 +441,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>17</FileNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -429,7 +453,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>18</FileNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -441,7 +465,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>19</FileNumber>
<FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -453,7 +477,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>20</FileNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -465,7 +489,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>21</FileNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -477,7 +501,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>22</FileNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -489,7 +513,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>23</FileNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -501,7 +525,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>24</FileNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -513,7 +537,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>25</FileNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -525,7 +549,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>26</FileNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -537,7 +561,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>27</FileNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -549,7 +573,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>28</FileNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -561,7 +585,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>29</FileNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -573,7 +597,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>30</FileNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -585,7 +609,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>31</FileNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -597,7 +621,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>32</FileNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -617,7 +641,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>33</FileNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>

View File

@@ -457,6 +457,16 @@
<FileType>1</FileType>
<FilePath>../Src/stm32f0xx_hal_msp.c</FilePath>
</File>
<File>
<FileName>adb.h</FileName>
<FileType>5</FileType>
<FilePath>..\Inc\adb.h</FilePath>
</File>
<File>
<FileName>adb.c</FileName>
<FileType>1</FileType>
<FilePath>..\Src\adb.c</FilePath>
</File>
</Files>
</Group>
<Group>

View File

Binary file not shown.

View File

@@ -0,0 +1,40 @@
apple_all\adb.o: ..\Src\adb.c
apple_all\adb.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
apple_all\adb.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h
apple_all\adb.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h
apple_all\adb.o: ../Inc/helpers.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal.h
apple_all\adb.o: ../Inc/stm32f0xx_hal_conf.h
apple_all\adb.o: ../Inc/main.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rcc.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_def.h
apple_all\adb.o: ../Drivers/CMSIS/Device/ST/STM32F0xx/Include/stm32f0xx.h
apple_all\adb.o: ../Drivers/CMSIS/Device/ST/STM32F0xx/Include/stm32f072xb.h
apple_all\adb.o: ../Drivers/CMSIS/Include/core_cm0.h
apple_all\adb.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
apple_all\adb.o: ../Drivers/CMSIS/Include/core_cmInstr.h
apple_all\adb.o: ../Drivers/CMSIS/Include/cmsis_armcc.h
apple_all\adb.o: ../Drivers/CMSIS/Include/core_cmFunc.h
apple_all\adb.o: ../Drivers/CMSIS/Device/ST/STM32F0xx/Include/system_stm32f0xx.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rcc_ex.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio_ex.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma_ex.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_cortex.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_flash.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_flash_ex.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_i2c.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_i2c_ex.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pwr.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pwr_ex.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_spi.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_spi_ex.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim_ex.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_uart.h
apple_all\adb.o: ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_uart_ex.h
apple_all\adb.o: ../Inc/shared.h
apple_all\adb.o: ../Inc/adb.h
apple_all\adb.o: ../Inc/delay_us.h

View File

Binary file not shown.

View File

Binary file not shown.

View File

@@ -22,17 +22,17 @@ Dialog DLL: TARMCM1.DLL V1.14.1.0
<h2>Project:</h2>
C:\Users\allen\Desktop\repos\USB4VC\firmware\apple_pre_usb\MDK-ARM\apple_all.uvprojx
Project File Date: 03/03/2023
Project File Date: 03/04/2023
<h2>Output:</h2>
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'apple_all'
compiling main.c...
../Src/main.c(435): warning: #188-D: enumerated type mixed with another type
../Src/main.c(641): warning: #188-D: enumerated type mixed with another type
HAL_GPIO_WritePin(ERR_LED_GPIO_Port, ERR_LED_Pin, spi_error_occured);
../Src/main.c: 1 warning, 0 errors
linking...
Program Size: Code=11496 RO-data=944 RW-data=92 ZI-data=2204
Program Size: Code=13548 RO-data=1132 RW-data=124 ZI-data=2204
FromELF: creating hex file...
"apple_all\apple_all.axf" - 0 Error(s), 1 Warning(s).

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

@@ -8,6 +8,7 @@
"apple_all\main.o"
"apple_all\stm32f0xx_it.o"
"apple_all\stm32f0xx_hal_msp.o"
"apple_all\adb.o"
"apple_all\stm32f0xx_hal_spi.o"
"apple_all\stm32f0xx_hal_spi_ex.o"
"apple_all\stm32f0xx_hal_rcc.o"

View File

File diff suppressed because it is too large Load Diff

View File

@@ -194,7 +194,7 @@ I (../Inc/shared.h)(0x617487BD)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_i2c_ex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pwr.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pwr_ex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_spi.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_spi.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_spi_ex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim_ex.h)(0x5DFA0893)
@@ -235,6 +235,7 @@ I (../Inc/helpers.h)(0x64015A0E)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio_ex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma_ex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_cortex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_flash.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_flash_ex.h)(0x5DFA0893)
@@ -302,6 +303,46 @@ I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim.h)(0x5DFA0893)
I (../Inc/shared.h)(0x617487BD)
I (../Inc/helpers.h)(0x64015A0E)
I (../Inc/quad_encoder.h)(0x62E9EEF5)
I (../Inc/m0110a.h)(0x64028814)
I (../Inc/lisa_kb.h)(0x64026FB5)
I (../Inc/adb.h)(0x64039017)
F (../Src/stm32f0xx_it.c)(0x6401427F)(--c99 -c --cpu Cortex-M0 -D__MICROLIB -g -O3 --apcs=interwork --split_sections -I ../Inc -I ../Drivers/STM32F0xx_HAL_Driver/Inc -I ../Drivers/STM32F0xx_HAL_Driver/Inc/Legacy -I ../Drivers/CMSIS/Device/ST/STM32F0xx/Include -I ../Drivers/CMSIS/Include
-I.\RTE\_apple_all
-IC:\Users\allen\AppData\Local\Arm\Packs\ARM\CMSIS\5.6.0\CMSIS\Core\Include
-IC:\Users\allen\AppData\Local\Arm\Packs\Keil\STM32F0xx_DFP\2.0.0\Drivers\CMSIS\Device\ST\STM32F0xx\Include
-D__UVISION_VERSION="529" -D_RTE_ -DSTM32F072xB -DUSE_HAL_DRIVER -DSTM32F072xB
-o apple_all\stm32f0xx_it.o --omf_browse apple_all\stm32f0xx_it.crf --depend apple_all\stm32f0xx_it.d)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal.h)(0x5DFA0893)
I (../Inc/stm32f0xx_hal_conf.h)(0x64014280)
I (../Inc/main.h)(0x64014280)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rcc.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_def.h)(0x5DFA0893)
I (../Drivers/CMSIS/Device/ST/STM32F0xx/Include/stm32f0xx.h)(0x5DFA0880)
I (../Drivers/CMSIS/Device/ST/STM32F0xx/Include/stm32f072xb.h)(0x5DFA0880)
I (../Drivers/CMSIS/Include/core_cm0.h)(0x5DFA0892)
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x5D9B4298)
I (../Drivers/CMSIS/Include/core_cmInstr.h)(0x5DFA0892)
I (../Drivers/CMSIS/Include/cmsis_armcc.h)(0x5DFA0892)
I (../Drivers/CMSIS/Include/core_cmFunc.h)(0x5DFA0892)
I (../Drivers/CMSIS/Device/ST/STM32F0xx/Include/system_stm32f0xx.h)(0x5DFA0880)
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x5D9B429A)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rcc_ex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio_ex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma_ex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_cortex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_flash.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_flash_ex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_i2c.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_i2c_ex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pwr.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pwr_ex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_spi.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_spi_ex.h)(0x5DFA0893)
I (../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim.h)(0x5DFA0893)

View File

Binary file not shown.

View File

@@ -40,3 +40,4 @@ apple_all\main.o: ../Inc/helpers.h
apple_all\main.o: ../Inc/quad_encoder.h
apple_all\main.o: ../Inc/m0110a.h
apple_all\main.o: ../Inc/lisa_kb.h
apple_all\main.o: ../Inc/adb.h

View File

Binary file not shown.

View File

@@ -0,0 +1,465 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "helpers.h"
#include "shared.h"
#include "adb.h"
#include "delay_us.h"
GPIO_TypeDef* adb_psw_port;
uint16_t adb_psw_pin;
GPIO_TypeDef* adb_data_port;
uint16_t adb_data_pin;
uint16_t adb_kb_reg2 = 0xffff; // all key released, all LED off
uint8_t adb_mouse_current_addr, adb_kb_current_addr, adb_rw_in_progress;
uint8_t adb_kb_enabled, adb_mouse_enabled;
#define ADB_PSW_HI() HAL_GPIO_WritePin(adb_psw_port, adb_psw_pin, GPIO_PIN_SET)
#define ADB_PSW_LOW() HAL_GPIO_WritePin(adb_psw_port, adb_psw_pin, GPIO_PIN_RESET)
#define ADB_DATA_HI() HAL_GPIO_WritePin(adb_data_port, adb_data_pin, GPIO_PIN_SET)
#define ADB_DATA_LOW() HAL_GPIO_WritePin(adb_data_port, adb_data_pin, GPIO_PIN_RESET)
#define ADB_READ_DATA_PIN() HAL_GPIO_ReadPin(adb_data_port, adb_data_pin)
const uint8_t linux_ev_to_adb_lookup[EV_TO_ADB_LOOKUP_SIZE] =
{
ADB_KEY_UNKNOWN, // EV0 KEY_RESERVED
53, // EV1 KEY_ESC
18, // EV2 KEY_1
19, // EV3 KEY_2
20, // EV4 KEY_3
21, // EV5 KEY_4
23, // EV6 KEY_5
22, // EV7 KEY_6
26, // EV8 KEY_7
28, // EV9 KEY_8
25, // EV10 KEY_9
29, // EV11 KEY_0
27, // EV12 KEY_MINUS
24, // EV13 KEY_EQUAL
51, // EV14 KEY_BACKSPACE
48, // EV15 KEY_TAB
12, // EV16 KEY_Q
13, // EV17 KEY_W
14, // EV18 KEY_E
15, // EV19 KEY_R
17, // EV20 KEY_T
16, // EV21 KEY_Y
32, // EV22 KEY_U
34, // EV23 KEY_I
31, // EV24 KEY_O
35, // EV25 KEY_P
33, // EV26 KEY_LEFTBRACE
30, // EV27 KEY_RIGHTBRACE
36, // EV28 KEY_ENTER
54, // EV29 KEY_LEFTCTRL
0, // EV30 KEY_A
1, // EV31 KEY_S
2, // EV32 KEY_D
3, // EV33 KEY_F
5, // EV34 KEY_G
4, // EV35 KEY_H
38, // EV36 KEY_J
40, // EV37 KEY_K
37, // EV38 KEY_L
41, // EV39 KEY_SEMICOLON
39, // EV40 KEY_APOSTROPHE
50, // EV41 KEY_GRAVE
56, // EV42 KEY_LEFTSHIFT
ADB_KEY_UNKNOWN, // EV43 KEY_BACKSLASH
6, // EV44 KEY_Z
7, // EV45 KEY_X
8, // EV46 KEY_C
9, // EV47 KEY_V
11, // EV48 KEY_B
45, // EV49 KEY_N
46, // EV50 KEY_M
43, // EV51 KEY_COMMA
47, // EV52 KEY_DOT
44, // EV53 KEY_SLASH
123, // EV54 KEY_RIGHTSHIFT
67, // EV55 KEY_KPASTERISK
58, // EV56 KEY_LEFTALT
49, // EV57 KEY_SPACE
57, // EV58 KEY_CAPSLOCK
122, // EV59 KEY_F1
120, // EV60 KEY_F2
99, // EV61 KEY_F3
118, // EV62 KEY_F4
96, // EV63 KEY_F5
97, // EV64 KEY_F6
98, // EV65 KEY_F7
100, // EV66 KEY_F8
101, // EV67 KEY_F9
109, // EV68 KEY_F10
71, // EV69 KEY_NUMLOCK
ADB_KEY_UNKNOWN, // EV70 KEY_SCROLLLOCK
89, // EV71 KEY_KP7
91, // EV72 KEY_KP8
92, // EV73 KEY_KP9
78, // EV74 KEY_KPMINUS
86, // EV75 KEY_KP4
87, // EV76 KEY_KP5
88, // EV77 KEY_KP6
69, // EV78 KEY_KPPLUS
83, // EV79 KEY_KP1
84, // EV80 KEY_KP2
85, // EV81 KEY_KP3
82, // EV82 KEY_KP0
65, // EV83 KEY_KPDOT
ADB_KEY_UNKNOWN, // EV84 UNKNOWN
ADB_KEY_UNKNOWN, // EV85 KEY_ZENKAKUHANKAKU
10, // EV86 KEY_102ND
103, // EV87 KEY_F11
111, // EV88 KEY_F12
ADB_KEY_UNKNOWN, // EV89 KEY_RO
ADB_KEY_UNKNOWN, // EV90 KEY_KATAKANA
ADB_KEY_UNKNOWN, // EV91 KEY_HIRAGANA
ADB_KEY_UNKNOWN, // EV92 KEY_HENKAN
ADB_KEY_UNKNOWN, // EV93 KEY_KATAKANAHIRAGANA
ADB_KEY_UNKNOWN, // EV94 KEY_MUHENKAN
ADB_KEY_UNKNOWN, // EV95 KEY_KPJPCOMMA
76, // EV96 KEY_KPENTER
125, // EV97 KEY_RIGHTCTRL
75, // EV98 KEY_KPSLASH
ADB_KEY_UNKNOWN, // EV99 KEY_SYSRQ
124, // EV100 KEY_RIGHTALT
ADB_KEY_UNKNOWN, // EV101 KEY_LINEFEED
115, // EV102 KEY_HOME
62, // EV103 KEY_UP
116, // EV104 KEY_PAGEUP
59, // EV105 KEY_LEFT
60, // EV106 KEY_RIGHT
119, // EV107 KEY_END
61, // EV108 KEY_DOWN
121, // EV109 KEY_PAGEDOWN
114, // EV110 KEY_INSERT
117, // EV111 KEY_DELETE
ADB_KEY_UNKNOWN, // EV112 KEY_MACRO
ADB_KEY_UNKNOWN, // EV113 KEY_MUTE
ADB_KEY_UNKNOWN, // EV114 KEY_VOLUMEDOWN
ADB_KEY_UNKNOWN, // EV115 KEY_VOLUMEUP
127, // EV116 KEY_POWER
81, // EV117 KEY_KPEQUAL
ADB_KEY_UNKNOWN, // EV118 KEY_KPPLUSMINUS
ADB_KEY_UNKNOWN, // EV119 KEY_PAUSE
ADB_KEY_UNKNOWN, // EV120 KEY_SCALE
ADB_KEY_UNKNOWN, // EV121 KEY_KPCOMMA
ADB_KEY_UNKNOWN, // EV122 KEY_HANGEUL
ADB_KEY_UNKNOWN, // EV123 KEY_HANJA
ADB_KEY_UNKNOWN, // EV124 KEY_YEN
55, // EV125 KEY_LEFTMETA
ADB_KEY_UNKNOWN, // EV126 KEY_RIGHTMETA
ADB_KEY_UNKNOWN, // EV127 KEY_COMPOSE
ADB_KEY_UNKNOWN, // EV128 KEY_STOP
ADB_KEY_UNKNOWN, // EV129 KEY_AGAIN
ADB_KEY_UNKNOWN, // EV130 KEY_PROPS
ADB_KEY_UNKNOWN, // EV131 KEY_UNDO
ADB_KEY_UNKNOWN, // EV132 KEY_FRONT
ADB_KEY_UNKNOWN, // EV133 KEY_COPY
ADB_KEY_UNKNOWN, // EV134 KEY_OPEN
ADB_KEY_UNKNOWN, // EV135 KEY_PASTE
ADB_KEY_UNKNOWN, // EV136 KEY_FIND
ADB_KEY_UNKNOWN, // EV137 KEY_CUT
ADB_KEY_UNKNOWN, // EV138 KEY_HELP
ADB_KEY_UNKNOWN, // EV139 KEY_MENU
ADB_KEY_UNKNOWN, // EV140 KEY_CALC
ADB_KEY_UNKNOWN, // EV141 KEY_SETUP
ADB_KEY_UNKNOWN, // EV142 KEY_SLEEP
ADB_KEY_UNKNOWN, // EV143 KEY_WAKEUP
ADB_KEY_UNKNOWN, // EV144 KEY_FILE
ADB_KEY_UNKNOWN, // EV145 KEY_SENDFILE
ADB_KEY_UNKNOWN, // EV146 KEY_DELETEFILE
ADB_KEY_UNKNOWN, // EV147 KEY_XFER
ADB_KEY_UNKNOWN, // EV148 KEY_PROG1
ADB_KEY_UNKNOWN, // EV149 KEY_PROG2
ADB_KEY_UNKNOWN, // EV150 KEY_WWW
ADB_KEY_UNKNOWN, // EV151 KEY_MSDOS
ADB_KEY_UNKNOWN, // EV152 KEY_COFFEE
ADB_KEY_UNKNOWN, // EV153 KEY_ROTATE_DISPLAY
ADB_KEY_UNKNOWN, // EV154 KEY_CYCLEWINDOWS
ADB_KEY_UNKNOWN, // EV155 KEY_MAIL
ADB_KEY_UNKNOWN, // EV156 KEY_BOOKMARKS
ADB_KEY_UNKNOWN, // EV157 KEY_COMPUTER
ADB_KEY_UNKNOWN, // EV158 KEY_BACK
ADB_KEY_UNKNOWN, // EV159 KEY_FORWARD
ADB_KEY_UNKNOWN, // EV160 KEY_CLOSECD
ADB_KEY_UNKNOWN, // EV161 KEY_EJECTCD
ADB_KEY_UNKNOWN, // EV162 KEY_EJECTCLOSECD
ADB_KEY_UNKNOWN, // EV163 KEY_NEXTSONG
ADB_KEY_UNKNOWN, // EV164 KEY_PLAYPAUSE
ADB_KEY_UNKNOWN, // EV165 KEY_PREVIOUSSONG
ADB_KEY_UNKNOWN, // EV166 KEY_STOPCD
ADB_KEY_UNKNOWN, // EV167 KEY_RECORD
ADB_KEY_UNKNOWN, // EV168 KEY_REWIND
ADB_KEY_UNKNOWN, // EV169 KEY_PHONE
ADB_KEY_UNKNOWN, // EV170 KEY_ISO
ADB_KEY_UNKNOWN, // EV171 KEY_CONFIG
ADB_KEY_UNKNOWN, // EV172 KEY_HOMEPAGE
ADB_KEY_UNKNOWN, // EV173 KEY_REFRESH
ADB_KEY_UNKNOWN, // EV174 KEY_EXIT
ADB_KEY_UNKNOWN, // EV175 KEY_MOVE
ADB_KEY_UNKNOWN, // EV176 KEY_EDIT
ADB_KEY_UNKNOWN, // EV177 KEY_SCROLLUP
ADB_KEY_UNKNOWN, // EV178 KEY_SCROLLDOWN
ADB_KEY_UNKNOWN, // EV179 KEY_KPLEFTPAREN
ADB_KEY_UNKNOWN, // EV180 KEY_KPRIGHTPAREN
ADB_KEY_UNKNOWN, // EV181 KEY_NEW
ADB_KEY_UNKNOWN, // EV182 KEY_REDO
105, // EV183 KEY_F13
107, // EV184 KEY_F14
113, // EV185 KEY_F15
};
void adb_release_lines(void)
{
ADB_PSW_HI();
ADB_DATA_HI();
}
void adb_reset(void)
{
adb_kb_current_addr = ADB_KB_DEFAULT_ADDR;
adb_mouse_current_addr = ADB_MOUSE_DEFAULT_ADDR;
adb_release_lines();
}
void adb_init(GPIO_TypeDef* data_port, uint16_t data_pin, GPIO_TypeDef* psw_port, uint16_t psw_pin)
{
adb_psw_port = psw_port;
adb_psw_pin = psw_pin;
adb_data_port = data_port;
adb_data_pin = data_pin;
adb_reset();
}
int32_t adb_wait_until_change(int32_t timeout_us)
{
uint32_t start_time = micros();
uint8_t start_state = ADB_READ_DATA_PIN();
uint32_t duration;
while(ADB_READ_DATA_PIN() == start_state)
{
duration = micros() - start_time;
if(timeout_us != 0 && duration > timeout_us)
return ADB_TIMEOUT;
}
return duration;
}
uint8_t look_for_atten(void)
{
// if ADB data line is high
if(ADB_READ_DATA_PIN() == GPIO_PIN_SET && adb_wait_until_change(ADB_DEFAULT_TIMEOUT_US) == ADB_TIMEOUT)
return ADB_TIMEOUT;
// now data line is low
adb_rw_in_progress = 1;
int32_t atten_duration = adb_wait_until_change(ADB_DEFAULT_TIMEOUT_US);
if(atten_duration > 2000 || atten_duration == ADB_TIMEOUT)
return ADB_LINE_STATUS_RESET;
if(atten_duration < 500)
return ADB_LINE_STATUS_BUSY; // not an attention signal
return ADB_LINE_STATUS_ATTEN;
}
uint8_t adb_read_bit(void)
{
if(ADB_READ_DATA_PIN() != GPIO_PIN_RESET)
return ADB_ERROR;
int32_t lo_time = adb_wait_until_change(ADB_DEFAULT_TIMEOUT_US);
int32_t hi_time = adb_wait_until_change(ADB_DEFAULT_TIMEOUT_US);
if(lo_time == ADB_TIMEOUT || hi_time == ADB_TIMEOUT)
return ADB_ERROR;
return hi_time > lo_time;
}
uint8_t adb_recv_cmd(uint8_t* data)
{
*data = 0;
uint8_t atten_result = look_for_atten();
if(atten_result != ADB_LINE_STATUS_ATTEN)
return atten_result;
int32_t sync_duration = adb_wait_until_change(ADB_DEFAULT_TIMEOUT_US);
if(sync_duration > 90 || sync_duration < 50)
return ADB_ERROR;
uint8_t temp = 0;
PCARD_BUSY_HI();
for (int i = 0; i < 8; ++i)
{
uint8_t this_bit = adb_read_bit();
if(this_bit == ADB_ERROR)
return ADB_ERROR;
temp |= this_bit << (7 - i);
}
PCARD_BUSY_LOW();
*data = temp;
return ADB_OK;
}
uint8_t adb_write_byte(uint8_t data)
{
for (int i = 0; i < 8; ++i)
{
if((data >> (7-i)) & 0x1)
{
ADB_DATA_LOW();
delay_us(ADB_CLK_35);
ADB_DATA_HI();
// if the line doesnt actually go high, then there has been a bus collision
if(ADB_READ_DATA_PIN() != GPIO_PIN_SET)
return ADB_LINE_STATUS_COLLISION;
delay_us(ADB_CLK_65);
}
else
{
ADB_DATA_LOW();
delay_us(ADB_CLK_65);
ADB_DATA_HI();
if(ADB_READ_DATA_PIN() != GPIO_PIN_SET)
return ADB_LINE_STATUS_COLLISION;
delay_us(ADB_CLK_35);
}
}
return ADB_OK;
}
uint8_t adb_write_16(uint16_t data)
{
PCARD_BUSY_HI();
if(adb_write_byte((uint8_t)(data >> 8)) == ADB_LINE_STATUS_COLLISION) // MSB
{
PCARD_BUSY_LOW();
return ADB_LINE_STATUS_COLLISION;
}
if(adb_write_byte((uint8_t)(data & 0xff)) == ADB_LINE_STATUS_COLLISION) // LSB
{
PCARD_BUSY_LOW();
return ADB_LINE_STATUS_COLLISION;
}
PCARD_BUSY_LOW();
return ADB_OK;
}
// to be called right after a LISTEN command from host
uint8_t adb_send_response_16b(uint16_t data)
{
adb_rw_in_progress = 1;
delay_us(200); // stop-to-start time
ADB_DATA_LOW();
delay_us(ADB_CLK_35);
ADB_DATA_HI();
delay_us(ADB_CLK_65);
if(adb_write_16(data) == ADB_LINE_STATUS_COLLISION)
{
adb_rw_in_progress = 0;
return ADB_LINE_STATUS_COLLISION;
}
ADB_DATA_LOW();
delay_us(ADB_CLK_65);
ADB_DATA_HI();
adb_rw_in_progress = 0;
return ADB_OK;
}
uint8_t adb_listen_16b(uint16_t* data)
{
*data = 0;
if(ADB_READ_DATA_PIN() != GPIO_PIN_SET)
return ADB_ERROR;
// stop-to-start
if(adb_wait_until_change(ADB_DEFAULT_TIMEOUT_US) == ADB_TIMEOUT)
return ADB_ERROR;
// start pulse
if(adb_wait_until_change(ADB_DEFAULT_TIMEOUT_US) == ADB_TIMEOUT)
return ADB_ERROR;
if(adb_wait_until_change(ADB_DEFAULT_TIMEOUT_US) == ADB_TIMEOUT)
return ADB_ERROR;
uint16_t temp = 0;
PCARD_BUSY_HI();
for (int i = 0; i < 16; ++i)
{
uint8_t this_bit = adb_read_bit();
if(this_bit == ADB_ERROR)
return ADB_ERROR;
temp |= this_bit << (15 - i);
}
PCARD_BUSY_LOW();
adb_wait_until_change(ADB_DEFAULT_TIMEOUT_US);
*data = temp;
return ADB_OK;
}
// addr 2 keyboard, 3 mouse
uint8_t parse_adb_cmd(uint8_t data)
{
uint8_t addr = data >> 4;
uint8_t cmd = (data >> 2) & 0x3;
uint8_t reg = data & 0x3;
if(addr == 0)
return ADB_ERROR;
if(cmd == ADB_CMD_TYPE_TALK && reg == 3 && addr == adb_mouse_current_addr && adb_mouse_enabled)
{
uint16_t response = 0x6001; // 0110 0000 0000 0001, device handler 0x1, 100dps apple desktop bus mouse
uint16_t rand_id = (rand() % 0xf) << 8;
response |= rand_id;
adb_send_response_16b(response);
}
if(cmd == ADB_CMD_TYPE_TALK && reg == 3 && addr == adb_kb_current_addr && adb_kb_enabled)
{
uint16_t response = 0x6005; // 0110 0000 0000 0101, device handler 0x5, appledesign keyboard
uint16_t rand_id = (rand() % 0xf) << 8;
response |= rand_id;
adb_send_response_16b(response);
}
if(cmd == ADB_CMD_TYPE_LISTEN && reg == 3 && addr == adb_mouse_current_addr)
{
uint16_t host_cmd;
adb_listen_16b(&host_cmd);
if((host_cmd & ADB_CHANGE_ADDR) == ADB_CHANGE_ADDR)
adb_mouse_current_addr = (host_cmd & 0xf00) >> 8;
}
if(cmd == ADB_CMD_TYPE_LISTEN && reg == 3 && addr == adb_kb_current_addr)
{
uint16_t host_cmd;
adb_listen_16b(&host_cmd);
if((host_cmd & ADB_CHANGE_ADDR) == ADB_CHANGE_ADDR)
adb_kb_current_addr = (host_cmd & 0xf00) >> 8;
}
if(cmd == ADB_CMD_TYPE_TALK && reg == 0 && addr == adb_mouse_current_addr)
return ADB_MOUSE_POLL;
if(cmd == ADB_CMD_TYPE_TALK && reg == 0 && addr == adb_kb_current_addr)
return ADB_KB_POLL;
if(cmd == ADB_CMD_TYPE_TALK && reg == 2 && addr == adb_kb_current_addr)
return ADB_KB_POLL_REG2;
if(cmd == ADB_CMD_TYPE_LISTEN && reg == 2 && addr == adb_kb_current_addr)
{
DEBUG1_HI();
adb_listen_16b(&adb_kb_reg2);
DEBUG1_LOW();
return ADB_KB_CHANGE_LED;
}
return ADB_OK;
}
void send_srq(void)
{
ADB_DATA_LOW();
delay_us(300);
ADB_DATA_HI();
}

View File

@@ -49,6 +49,7 @@
#include "quad_encoder.h"
#include "m0110a.h"
#include "lisa_kb.h"
#include "adb.h"
#define PROTOCOL_STATUS_NOT_AVAILABLE 0
#define PROTOCOL_STATUS_ENABLED 1
@@ -118,13 +119,20 @@ int16_t byte_to_int16_t(uint8_t lsb, uint8_t msb)
void protocol_status_lookup_init(void)
{
memset(protocol_status_lookup, PROTOCOL_STATUS_NOT_AVAILABLE, PROTOCOL_LOOKUP_SIZE);
protocol_status_lookup[PROTOCOL_ADB_KB] = PROTOCOL_STATUS_DISABLED;
protocol_status_lookup[PROTOCOL_ADB_MOUSE] = PROTOCOL_STATUS_DISABLED;
protocol_status_lookup[PROTOCOL_M0100_MOUSE] = PROTOCOL_STATUS_ENABLED;
protocol_status_lookup[PROTOCOL_M0110_KB] = PROTOCOL_STATUS_ENABLED;
protocol_status_lookup[PROTOCOL_ADB_KB] = PROTOCOL_STATUS_ENABLED;
protocol_status_lookup[PROTOCOL_ADB_MOUSE] = PROTOCOL_STATUS_ENABLED;
protocol_status_lookup[PROTOCOL_M0100_MOUSE] = PROTOCOL_STATUS_DISABLED;
protocol_status_lookup[PROTOCOL_M0110_KB] = PROTOCOL_STATUS_DISABLED;
protocol_status_lookup[PROTOCOL_LISA_KB] = PROTOCOL_STATUS_DISABLED;
}
uint8_t is_protocol_enabled(uint8_t this_protocol)
{
if(this_protocol >= PROTOCOL_LOOKUP_SIZE)
return 0;
return protocol_status_lookup[this_protocol] == PROTOCOL_STATUS_ENABLED;
}
void handle_protocol_switch(uint8_t spi_byte)
{
uint8_t index = spi_byte & 0x7f;
@@ -374,6 +382,199 @@ void run_mac_kb(void)
m0100a_handle_inquiry();
}
uint8_t int16_to_uint6(int16_t value)
{
if(abs(value) <= 3)
return (uint8_t)value;
value = value >> 1;
if(value >= 63)
value = 63;
if(value <= -63)
value = -63;
return (uint8_t)value;
}
void adb_mouse_update(void)
{
if(mouse_buf_peek(&my_mouse_buf) == NULL)
return;
get_consolidated_mouse_event(&my_mouse_buf, &consolidated_mouse_event);
// mouse buffer now empty
uint16_t response = 0;
if(consolidated_mouse_event.button_left == 0)
response |= 0x8000;
if(consolidated_mouse_event.button_right == 0)
response |= 0x80;
response |= int16_to_uint6(consolidated_mouse_event.movement_x) & 0x7f;
response |= (int16_to_uint6(consolidated_mouse_event.movement_y) & 0x7f) << 8;
adb_send_response_16b(response);
}
uint8_t capslock_counter;
void adb_keyboard_update(void)
{
uint8_t buffered_code, buffered_value, adb_code;
uint16_t response = 0x8080;
if(kb_buf_peek(&my_kb_buf, &buffered_code, &buffered_value) == 0)
{
if(buffered_code >= EV_TO_ADB_LOOKUP_SIZE)
goto adb_kb_end;
adb_code = linux_ev_to_adb_lookup[buffered_code];
if(adb_code == ADB_KEY_UNKNOWN)
goto adb_kb_end;
/*
adb mac keyboard capslock key seems to behave differently than PC keyboards
On PC: Capslock down then up = Caps lock on, Capslock down then up again = Caps lock off
on adb mac: Capslock down = Capslock on, Capslock up = Caps lock off
looks like mac keyboard uses a locking capslock, so need to convert the PC code to suit
*/
if(adb_code == ADB_KEY_CAPSLOCK)
{
if(buffered_value != 1)
goto adb_kb_end;
capslock_counter++;
buffered_value = capslock_counter % 2;
}
if(buffered_value)
response &= 0x7fff;
response |= ((uint16_t)adb_code & 0x7f) << 8;
adb_send_response_16b(response);
adb_kb_end:
kb_buf_pop(&my_kb_buf);
if(buffered_code == KEY_DELETE)
{
if(buffered_value == 0)
adb_kb_reg2 |= 0x4000;
else
adb_kb_reg2 &= 0xbfff;
}
if(buffered_code == KEY_CAPSLOCK)
{
if(buffered_value == 0)
adb_kb_reg2 |= 0x2000;
else
adb_kb_reg2 &= 0xdfff;
}
if(buffered_code == KEY_LEFTCTRL || buffered_code == KEY_RIGHTCTRL)
{
if(buffered_value == 0)
adb_kb_reg2 |= 0x800;
else
adb_kb_reg2 &= 0xf7ff;
}
if(buffered_code == KEY_LEFTSHIFT || buffered_code == KEY_RIGHTSHIFT)
{
if(buffered_value == 0)
adb_kb_reg2 |= 0x400;
else
adb_kb_reg2 &= 0xfbff;
}
if(buffered_code == KEY_LEFTALT || buffered_code == KEY_RIGHTALT)
{
if(buffered_value == 0)
adb_kb_reg2 |= 0x200;
else
adb_kb_reg2 &= 0xfdff;
}
if(buffered_code == KEY_LEFTMETA || buffered_code == KEY_RIGHTMETA)
{
if(buffered_value == 0)
adb_kb_reg2 |= 0x100;
else
adb_kb_reg2 &= 0xfeff;
}
// if(buffered_code == KEY_NUMLOCK)
// {
// if(buffered_value == 0)
// adb_kb_reg2 |= 0x80;
// else
// adb_kb_reg2 &= 0xff7f;
// }
// if(buffered_code == KEY_SCROLLLOCK)
// {
// if(buffered_value == 0)
// adb_kb_reg2 |= 0x40;
// else
// adb_kb_reg2 &= 0xffbf;
// }
}
}
uint8_t adb_data, adb_status, this_addr, kb_srq, mouse_srq;
void run_adb(void)
{
if(IS_ADB_HOST_PRESENT() == 0)
return;
adb_kb_enabled = is_protocol_enabled(PROTOCOL_ADB_KB);
adb_mouse_enabled = is_protocol_enabled(PROTOCOL_ADB_MOUSE);
if(adb_kb_enabled == 0 && adb_mouse_enabled == 0)
{
adb_reset();
return;
}
adb_status = adb_recv_cmd(&adb_data);
adb_rw_in_progress = 0;
if(adb_status == ADB_LINE_STATUS_RESET)
{
adb_reset();
}
else if(adb_status != ADB_OK)
{
adb_reset();
return;
}
// we are just at the end of a ADB command, check address, assert SRQ if needed
this_addr = adb_data >> 4;
if(!kb_buf_is_empty(&my_kb_buf))
{
kb_srq = (this_addr != adb_kb_current_addr);
}
else if(!mouse_buf_is_empty(&my_mouse_buf))
{
mouse_srq = (this_addr != adb_mouse_current_addr);
}
else
{
kb_srq = 0;
mouse_srq = 0;
}
if((kb_srq && adb_kb_enabled) || (mouse_srq && adb_mouse_enabled))
send_srq();
else
adb_wait_until_change(ADB_DEFAULT_TIMEOUT_US);
adb_status = parse_adb_cmd(adb_data);
if(adb_status == ADB_MOUSE_POLL && adb_mouse_enabled)
adb_mouse_update();
else if(adb_status == ADB_KB_POLL && adb_kb_enabled)
adb_keyboard_update();
else if(adb_status == ADB_KB_POLL_REG2 && adb_kb_enabled)
adb_send_response_16b(adb_kb_reg2);
else if(adb_status == ADB_KB_CHANGE_LED)
{
// kb reg2 top 13 bits is button status, 1 = released 0 = pressed
// bottom 3 bits is LED, 1 = off, 0 = on
memset(spi_transmit_buf, 0, SPI_BUF_SIZE);
spi_transmit_buf[SPI_BUF_INDEX_MAGIC] = SPI_MISO_MAGIC;
spi_transmit_buf[SPI_BUF_INDEX_MSG_TYPE] = SPI_MISO_MSG_TYPE_KB_LED_REQUEST;
if(!(adb_kb_reg2 & 0x4)) // scroll lock LED
spi_transmit_buf[3] = 1;
if(!(adb_kb_reg2 & 0x1)) // num lock LED
spi_transmit_buf[4] = 1;
if(!(adb_kb_reg2 & 0x2)) // caps lock LED
spi_transmit_buf[5] = 1;
}
}
/* USER CODE END 0 */
/**
@@ -422,9 +623,14 @@ int main(void)
memset(spi_transmit_buf, 0, SPI_BUF_SIZE);
HAL_SPI_TransmitReceive_IT(&hspi1, spi_transmit_buf, spi_recv_buf, SPI_BUF_SIZE);
quad_init(&my_mouse_buf, &htim17, &htim16, &htim14, GPIOA, GPIO_PIN_8, GPIOB, GPIO_PIN_14, GPIOB, GPIO_PIN_15, GPIOB, GPIO_PIN_12);
quad_enable();
lisa_init(&lh);
adb_init(ADB_DATA_GPIO_Port, ADB_DATA_Pin, ADB_PWR_GPIO_Port, ADB_PWR_Pin);
quad_init(&my_mouse_buf, &htim17, &htim16, &htim14, GPIOA, GPIO_PIN_8, GPIOB, GPIO_PIN_14, GPIOB, GPIO_PIN_15, GPIOB, GPIO_PIN_12);
if(is_protocol_enabled(PROTOCOL_M0100_MOUSE))
quad_enable();
else
quad_disable();
/* USER CODE END 2 */
/* Infinite loop */
@@ -438,7 +644,7 @@ int main(void)
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
run_adb();
run_mac_kb();
run_lisa_kb();
HAL_SPI_TransmitReceive_IT(&hspi1, spi_transmit_buf, spi_recv_buf, SPI_BUF_SIZE);