PortX:比 Xshell 更强大,跨平台且免费!

部署运行你感兴趣的模型镜像

你好,我是坚持分享干货的 EarlGrey,翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。

如果我的分享对你有帮助,请关注我,一起向上进击。

创作不易,希望大家给一点鼓励,把公众号设置为“星标”,给文章点个“赞”“在看”,谢谢大家啦~

41895095c66f8984624dd539f630abab.jpeg

目前支持ssh的客户端有很多,比如putty、crt、xshell等,今天分享一款别样的ssh客户端-PortX,通过简单但全面的UI,PortX为您提供了纯粹的终端模拟体验。

功能介绍

  • 跨平台(Mac OS X、Windows、Linux)

  • 谷歌驱动同步

  • 清晰的标签式用户界面

  • 本地Shell

  • SSH2

  • SFTP 文件上传

  • 端口转发:X11、本地、远程、SocksV5

  • 关键词搜索

  • 代理转发、键盘交互、公钥/私钥认证

  • 快速连接地址栏

  • 外观自定义

  • 全局选项

使用体验

a0570f2608abd76153d90269e339c12d.png

799559384ccfa1a4d9ac8e6bea500ca0.png

1、跨平台的支持

无论是 Mac、Windows 还是 Linux,都可以在您所有的设备上使用 PortX,无所不及。

b53deb90144749d30fc3c082f2fe8fc0.png

2、谷歌网盘同步

轻松将您的会话同步到谷歌云端硬盘,以便在您的所有设备上同步所有会话。始终保持最新状态。

2f5d31c25d87df925ab510ebcfcaee05.png

3、轻松管理

使用 PortX 的会话管理器改进工作流程,并通过轻松创建和管理 SSH 转移的能力确保您的信息安全。

3ad50e5960c18276f3b0a938b1b1ba44.png

4、选项卡式界面

使用 PortX 的选项卡式界面能同时管理多个会话并提高工作效率。

52034ecb98a8c7e24acafafcb66d05a4.png

下载地址

  • https://portx.online/zh

- EOF -

文章已经看到这了,别忘了在右下角点个“赞”和“在看”鼓励哦~

推荐阅读  点击标题可跳转

1、VS Code 变身小霸王游戏机!

2、认知升级:模型与范式转换

3、超赞的 Python 编译器,单核提速100倍

4、高效的终极秘诀

5、Python 3.12 版本有什么变化?

回复下方「关键词」,获取优质资源

回复关键词「 pybook03」,领取进击的Grey与小伙伴一起翻译的《Think Python 2e》电子版

回复关键词「书单02」,领取进击的Grey整理的 10 本 Python 入门书的电子版

👇关注我的公众号👇

告诉你更多细节干货

1118ec1995dd2275b761606f96b48043.jpeg

欢迎围观我的朋友圈

👆每天更新所想所悟

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

/*********************************************************************************************************************** * Copyright (C) All rights reserved. ***********************************************************************************************************************/ /*********************************************************************************************************************** * @file gpio.c * @brief This file implements device driver for GPIO module. * @version 1.0.0 * @date 2019/6/26 ***********************************************************************************************************************/ /*********************************************************************************************************************** Includes ***********************************************************************************************************************/ #include "BAT32G133.h" #include "gpio.h" /*********************************************************************************************************************** Pragma directive ***********************************************************************************************************************/ /*********************************************************************************************************************** Global variables and functions ***********************************************************************************************************************/ /** * @brief Set specified GPIO as output function. * * @param port port address, such as &P0, &P1, &P2... * @param pinMsk * e.g., bit0: 0x01, bit1: 0x02, bit0~3: 0x0F, bit0~7: 0xFF */ void GPIO_Output_Enable(__IO uint8_t *port, uint8_t pinMsk) { *(port - 0x2A0) &= ~pinMsk; /*!< PMC=0: Digital Function */ *(port + 0x020) &= ~pinMsk; /*!< PM =0: Output Function */ } /** * @brief Set specified GPIO as input function. * * @param port port address, such as &P0, &P1, &P2... * @param pinMsk * e.g., bit0: 0x01, bit1: 0x02, bit0~3: 0x0F, bit0~7: 0xFF */ void GPIO_Input_Enable(__IO uint8_t *port, uint8_t pinMsk) { *(port - 0x2A0) &= ~pinMsk; /*!< PMC=0: Digital Function */ *(port + 0x020) |= pinMsk; /*!< PM =1: Input Function */ } /** * @brief Enable pull up resister of input GPIO . * * @param port port address, such as &P0, &P1, &P2... * @param pinMsk * e.g., bit0: 0x01, bit1: 0x02, bit0~3: 0x0F, bit0~7: 0xFF */ void GPIO_PullUp_Enable(__IO uint8_t *port, uint8_t pinMsk) { *(port - 0x2A0) &= ~pinMsk; /*!< PMC=0: Digital Function */ *(port - 0x2D0) |= pinMsk; /*!< PU =1: Pull Up enable */ } /** * @brief Disable pull up resister of input GPIO . * * @param port port address, such as &P0, &P1, &P2... * @param pinMsk * e.g., bit0: 0x01, bit1: 0x02, bit0~3: 0x0F, bit0~7: 0xFF */ void GPIO_PullUp_Disable(__IO uint8_t *port, uint8_t pinMsk) { *(port - 0x2D0) &= ~pinMsk; /*!< PU =0: Pull Up disable */ } /** * @brief Enable pull down resister of input GPIO . * * @param port port address, such as &P0, &P1, &P2... * @param pinMsk * e.g., bit0: 0x01, bit1: 0x02, bit0~3: 0x0F, bit0~7: 0xFF */ void GPIO_PullDown_Enable(__IO uint8_t *port, uint8_t pinMsk) { *(port - 0x2A0) &= ~pinMsk; /*!< PMC=0: Digital Function */ *(port - 0x2C0) |= pinMsk; /*!< PD =1: Pull Down enable */ } /** * @brief Disable pull down resister of input GPIO . * * @param port port address, such as &P0, &P1, &P2... * @param pinMsk * e.g., bit0: 0x01, bit1: 0x02, bit0~3: 0x0F, bit0~7: 0xFF */ void GPIO_PullDown_Disable(__IO uint8_t *port, uint8_t pinMsk) { *(port - 0x2C0) &= ~pinMsk; /*!< PD =0: Pull Down disable */ } /** * @brief Nch Open Drain Output mode * * @param port address, such as &P0, &P1, &P3, &P5, &P7 * @param pinMsk * e.g., bit0: 0x01, bit1: 0x02, bit0~3: 0x0F, bit0~7: 0xFF */ void GPIO_Nch_OpenDrain(__IO uint8_t *port, uint8_t pinMsk) { *(port - 0x2B0) |= pinMsk; /*!< POM =1: Nch OpenDrain Output */ } /** * @brief Set specified value to GPIO output * * @param port port address, such as &P0, &P1, &P2... * @param value */ void GPIO_Set_Value(__IO uint8_t *port, uint8_t value) { *port = value; /*!< PL = value */ } /** * @brief Get value from GPIO input * * @param port port address, such as &P0, &P1, &P2... * * @return */ uint8_t GPIO_Get_Value(__IO uint8_t *port) { //PORT->PMS = 0x01; /*!< Digital output level of the pin is read */ return (*port); /*!< PL = value */ } /** * @brief Initializes the PORTx * @param PORTx: where x can be 0~3 * @param PINx: where x can be 0~7 * @param MODEx: such as INPUT,PULLUP_INPUT,TTL_INPUT,ANALOG_INPUT,OUTPUT,OPENDRAIN_OUTPUT,PULLDOWN_INPUT * * @retval None */ #define CFG_BIT_DIR_INPUT 0x01 #define CFG_BIT_PU 0x02 #define CFG_BIT_PD 0x04 #define CFG_BIT_ANALOG 0x08 void PORT_Init(PORT_TypeDef PORTx,PIN_TypeDef PINx,PIN_ModeDef MODEx) { uint8_t mode = MODEx; uint8_t pos = 1<<PINx; #if 1 uint8_t cfg = CFG_BIT_DIR_INPUT; if(mode == PULLUP_INPUT) { cfg |= CFG_BIT_PU; }else if(mode == ANALOG_INPUT) { cfg |= CFG_BIT_ANALOG; }else if(mode == OUTPUT) { cfg &= ~CFG_BIT_DIR_INPUT; }else if(mode ==PULLDOWN_INPUT) { cfg |= CFG_BIT_PD; } if(cfg & CFG_BIT_DIR_INPUT) { if(cfg & CFG_BIT_ANALOG) *((volatile uint8_t*)(&PORT->PMC0+PORTx)) |= pos; else *((volatile uint8_t*)(&PORT->PMC0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PM0+PORTx)) |= pos; if(cfg & CFG_BIT_PU) *((volatile uint8_t*)(&PORT->PU0+PORTx)) |= pos; else *((volatile uint8_t*)(&PORT->PU0+PORTx)) &= ~pos; if(cfg & CFG_BIT_PD) *((volatile uint8_t*)(&PORT->PD0+PORTx)) |= pos; else *((volatile uint8_t*)(&PORT->PD0+PORTx)) &= ~pos; } else { *((volatile uint8_t*)(&PORT->PMC0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PM0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->POM0+PORTx)) &= ~pos; } #else switch(mode) { case INPUT: *((volatile uint8_t*)(&PORT->PMC0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PM0+PORTx)) |= pos; //*((volatile uint8_t*)(&PORT->PIM0+PORTx)) &= ~pos; //*((volatile uint8_t*)(&PORT->POM0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PU0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PD0+PORTx)) &= ~pos; break; case PULLUP_INPUT: *((volatile uint8_t*)(&PORT->PMC0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PM0+PORTx)) |= pos; //*((volatile uint8_t*)(&PORT->PIM0+PORTx)) &= ~pos; //*((volatile uint8_t*)(&PORT->POM0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PU0+PORTx)) |= pos; *((volatile uint8_t*)(&PORT->PD0+PORTx)) &= ~pos; break; case TTL_INPUT: *((volatile uint8_t*)(&PORT->PMC0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PM0+PORTx)) |= pos; //*((volatile uint8_t*)(&PORT->PIM0+PORTx)) |= pos; //*((volatile uint8_t*)(&PORT->POM0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PU0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PD0+PORTx)) &= ~pos; break; case ANALOG_INPUT: *((volatile uint8_t*)(&PORT->PMC0+PORTx)) |= pos; break; case OUTPUT: *((volatile uint8_t*)(&PORT->PMC0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PM0+PORTx)) &= ~pos; //*((volatile uint8_t*)(&PORT->PIM0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->POM0+PORTx)) &= ~pos; break; // case OPENDRAIN_OUTPUT: // *((volatile uint8_t*)(&PORT->PMC0+PORTx)) &= ~pos; // *((volatile uint8_t*)(&PORT->PM0+PORTx)) &= ~pos; // //*((volatile uint8_t*)(&PORT->PIM0+PORTx)) &= ~pos; // *((volatile uint8_t*)(&PORT->POM0+PORTx)) |= pos; // break; case PULLDOWN_INPUT: *((volatile uint8_t*)(&PORT->PMC0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PM0+PORTx)) |= pos; //*((volatile uint8_t*)(&PORT->PIM0+PORTx)) &= ~pos; //*((volatile uint8_t*)(&PORT->POM0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PU0+PORTx)) &= ~pos; *((volatile uint8_t*)(&PORT->PD0+PORTx)) |= pos; break; } #endif } /** * @brief Set the PORTx bit * @param PORTx: where x can be 0~3 * @param PINx: where x can be 0~7 * * @retval None */ void PORT_SetBit(PORT_TypeDef PORTx,PIN_TypeDef PINx) { uint8_t pos = 1<<PINx; *((volatile uint8_t*)(&PORT->P0+PORTx)) |= pos; } /** * @brief Clear the PORTx bit * @param PORTx: where x can be 0~3 * @param PINx: where x can be 0~7 * * @retval None */ void PORT_ClrBit(PORT_TypeDef PORTx,PIN_TypeDef PINx) { uint8_t pos = 1<<PINx; *((volatile uint8_t*)(&PORT->P0+PORTx)) &= ~pos; } /** * @brief Toggle the PORTx bit * @param PORTx: where x can be 0~3 * @param PINx: where x can be 0~7 * * @retval None */ void PORT_ToggleBit(PORT_TypeDef PORTx,PIN_TypeDef PINx) { uint8_t pos = 1<<PINx; *((volatile uint8_t*)(&PORT->P0+PORTx)) ^= pos; } /** * @brief Get the PORTx bit * @param PORTx: where x can be 0~3 * @param PINx: where x can be 0~7 * * @retval None */ uint8_t PORT_GetBit(PORT_TypeDef PORTx,PIN_TypeDef PINx) { uint8_t pos = 1<<PINx; //PORT->PMS = 0x01; /*!< Digital output level of the pin is read */ return *((volatile uint8_t*)(&PORT->P0+PORTx))&pos; } /** * @brief Config the PORTx bit * @param PORT_CFGx: such as P00_CFG ... * @param CFGx: such as IOCFG_INTP0 ... * * @retval None */ void PORT_Cfg(IO_CfgType PORT_CFGx, IO_CfgDef CFGx) { *((volatile uint8_t*)(&PORT->P00CFG+PORT_CFGx)) = CFGx; } 使用这里面的函数控制led闪亮
最新发布
09-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值