本帖最后由 ckdsx.cn 于 2023-12-15 11:38 编辑
工程目录:AiPi-Open-Kits/ AiPi-KVM
文件目录:AiPi-Open-Kits/ AiPi-KVM / main / main.c |
AiPi-KVM 三进一出切换器概述AiPi-KVM 是一款三进一出的HDMI+USB的切换器,可以让一个显示器在三台主机中切换其中一台主机,同时会把KVM上的USB设备(键盘鼠标等)也切换到目标主机当中。 这个设备方便开发人员在只有一台显示器且有3台电脑主机的情况下使用。
目前,这个源码只实现了使用按键进行切换主机,M61模组支持WiFi+BLE,所以它能够开发出更多的远程切换方式,比如可以通过在AiPi-DSL_Dashboard 工程添加一个控制页面,并开启一个TCP服务器,AiPI-KVM开发一个TCP客户端功能连接上AiPi-DSL_Dashboard 之后就能实现快捷控制。 使用方法1.连接AiPi-KVM 需要额外接入供电口,因为USB和HDMI的5V足以为整个板子供电
AiPi-KVM 拥有众多接口,而其中有三组输入: HDMI1+USB1、HDMI2+USB2、HDMI3+USB3,它们每组是成对接入同一台主机。所以你需要准备一根HDMI线和Type-C USB数据线。
除此之外,HDMI的输出和键盘鼠标的接入可以参考概述中的示意图。 2.切换板载的三个轻触按键,分别对应了三个主机的选择:[td]按键序号 | HDMI通道 | USB通道 | S3 | HDMI1 | USB1 | S4 | HDMI2 | USB2 | S5 | HDMI3 | USB3 |
例如,当按下S3时,HDMI的输出及键盘鼠标会同时切换到第一台主机上,屏幕显示第一台主机的页面。 3.掉电储存AiPi-KVM 可以存储当前设置的通道,所以当AiPi-KVM 重新启动时,可以自动设置掉电前的最后的通道。4.一些想法AiPi-KVM 使用Ai-M61-32S做切换控制,WiFi6+BLE5.3拥有强大的无线传输能力,所以它能够实现无线的控制,你可以用它连接之前AiPi-DSL_Dashboard ,或者使用App控制切换,这样,你就可以给它设计一个外壳,不需要按键就能做到切换PC。 编译和烧录1.烧录接线
AiPi-KVM 设计紧凑,因此没有把TTL芯片电路设计进去,因此,需要使用TTL工具连接烧录接口: [td]烧录接口 | TTL工具 | 3V3 | 3.3V | RX | TXD | TX | RXD | GND | GND |
main 工程代码: -------------------------------------------------- /** * @file main.c * @brief * @version 0.1 * @date 2023-08-22 * * @copyright Copyright (c) 2023 * */
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <FreeRTOS.h> #include <task.h> #include "board.h" #include "log.h" #include "mem.h" #include "kvm_dev.h" #include "easyflash.h" #include "bflb_mtd.h" #include "StateMachine.h" #define DBG_TAG "MAIN"
static int bl61x_get_heap_size(void) { struct meminfo info1 = { 0 }; struct meminfo info2 = { 0 }; uint32_t total_free_size = 0; // return xPortGetFreeHeapSize();
bflb_mem_usage(KMEM_HEAP, &info1); bflb_mem_usage(PMEM_HEAP, &info2);
total_free_size = info1.free_size; LOG_F("[%s:%d]heap_size------->KMEM_HEAP=%d PMEM_HEAP=%d", DBG_TAG, __LINE__, info1.free_size, info2.free_size); return total_free_size; } static void bl61x_show_heap_size_task(void* arg) { while (1) { bl61x_get_heap_size(); vTaskDelay(3000/portTICK_PERIOD_MS); } }
int main(void) { board_init(); bflb_mtd_init(); easyflash_init(); aipi_kvm_dev_init(); xTaskCreate(bl61x_show_heap_size_task, (char*)"heap", 512, NULL, 2, NULL); StateMachineTask_start(); vTaskStartScheduler(); }
[td]
|