windows 下webdav连接方法

1. 启用http网络连接

如果是https的连接,可以直接跳到第二步。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters]
"BasicAuthLevel"=dword:00000002

把上面文件保存为 xxx.reg,导入注册表,或

手动修改 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters

BasicAuthLevel 值改成 2(支持 http & https)

https://blog.csdn.net/kh766200466/article/details/91951568

2. 添加网络位置

在「我的电脑」画面中右键「添加一个网络位置」,「下一步」,「选择自定义网络位置」,网络地址输入为 WebDAV 的地址,比如坚果云就是 https://dav.jianguoyun.com/dav/,再点「下一步」,给该位置输入名称。

完成后可以在「我的电脑」画面看到新建的这个 WebDAV 地址的快捷方式了。第一次进入的时候需要输入用户名和密码。

https://www.jianshu.com/p/7ba5f0756efc

或者RaiDrive一步到位

直接图形化:

参考:https://sspai.com/post/47830

我的图书管理系统

最近发现家里的书越来越多,电子书也在kindle,boox,电脑和NAS里面堆得四处都是,因此下定决心对图书进行整理。

实体图书

  • 微信小程序:优优书柜

介绍可参考: https://www.appinn.com/youyoushugui-wechat-miniapp/

计划使用这个软件把图书和小伙伴分享,但是暂时还没有实施。

小说、漫画等快餐类图书

  • calibre管理

calibre是一个自由开源电子书软件套装,可以用来组织、存放、以及管理电子书,支持大多数的电子书格式。同时也支持与许多流行的电子书阅读器进行同步,并可能在DRM的限制下转换电子书的格式。

https://zh.wikipedia.org/zh-cn/Calibre

为了便于与E-INK设备共同使用,依旧使用calibre进行管理。

看和下载漫画用软件,19年左右参与过一段时间开发,不过后来没有坚持下去。

新的节目比当年的界面要好看一些。

阅读3.0, 阅读是一款可以自定义来源阅读网络内容的工具,为广大网络文学爱好者提供一种方便、快捷舒适的试读体验。

https://github.com/gedoor/legado

一般用这个看看爽文小说啥的,不过实际使用的时候,我比较喜欢导出epub之后给calibre导入到kindle或者使用静读天下来打开阅读。

PDF图书

  • 旧:Nas+Samba+Syncthing

这套环境我使用了大概两年左右,但是随着书籍的增多,简单的多设备同步会造成EINK平板的容量浪费。同时,因为Nas可能存在单点故障,因此数据还是存在一定风险。

  • 新:zotero

偶然的机会发现了zetero这个专门管理文献的软件,使用后感觉很满意,特别是强化了文献的搜索功能。以前有很多次想从某本书里面借几句话出来,但是只记得几个模糊的词,因此搜索了很久才找到,或者无功而返。

简单列举下我认为比较好用的功能:

  • 文献的关系管理:可以设置文件关系,比如在某个芯片的手册可以关联它的封装和设计样例;外语课程可以关联听力或者其他补充资料
  • 文献模糊搜索:上面说过了 🙂
  • PDF标注:不知道为什么,很少能够看到同时支持windows、linux的带有笔记和标注功能的PDF阅读器。不同平台使用不同软件,脑子有时候还是反映不太过来。
  • 网页存储:配合插件可以存储原始网页,避免浏览器书签里面的网站丢失导致资料缺失(目前我主力使用trilium,把网页作为笔记管理这部分内容,在评估是否应该迁移)

多设备同步或备份可以选择官方或支持webdav的网盘。

  • 同步策略(以下方案均测试可用,请根据使用场景选择)
    • zotero官方(免费版本300m)
    • 坚果云(免费版每月1G上传流量,速度很快)
    • koofr(免费版共2G空间,可以连接onedrive、google drive等网盘,连接的网盘每天限制1T的流量传输,速度适中,连接onedrive较慢)
    • TeraCloud(免费版共15G,速度适中)

我的方案(onedrive+rclone+Termux+Android Phone+koofr)

虽然上面列举了很多种方案,但是我的图书容量已经远远超越15G,使用公有云同步的方案成本实在有些大,因此,我特别定制了一套符合我自己使用方式的方案。

我的使用环境满足下面条件:

  • 图书体积大:
    • 有一些生物学相关的书籍里面图像较多,每本300m上下
    • 有些图书只有图像版本,体积大
    • 芯片手册虽然体积很小,但是品类繁多
    • 外语能力差,部分书籍保留了英中日三种语言
    • 有些图书会赠送光盘或音视频资料
  • 网盘速度不敏感:
    • 书是用来看得,不是用来屯的
    • 虽然有时候会批量增加一些书籍,但是跨公网的同步时间没有什么强烈的要求
  • 同步用数据无隐私内容,泄露无危害
    • 都是能买到和网上公开的内容
    • 一些图书笔记
    • 基于RCLONE,可以实现全数据加密,隐私问题完美解决
  • 同步数据丢失后,本地依旧有多个副本存储在下面设备中
    • NAS(完整图书库)(现有方案暂未实现,计划syncthing同步台式机和NAS)
    • 家中台式机(完整图书库)
    • 笔记本电脑(完整图书库)
    • EINK平板(部分在读图书)
  • 可以接受使用手机作为中继
    • 手机随身携带
    • 使用电脑时,一般我在电脑边上 o.o
  • 为什么不直接在电脑上运行rclone
    • 买的onedrive不稳定,可能要经常维护
    • 终端较多,每次维护重复作业多,手机只要维护一个设备,其他设备可以一同使用
  • koofr在干什么
    • 平时,没有大文件变动时候,使用koofr管理即可,减少手机操作。

环境一览

  • Onedrive 5T+office365 淘宝40元(需要购买支持API的onedrive)

不推荐店铺,因为这种店随时跑路,帐号也随时会没,空间虽大但是很不稳定,而且管理权限不在手中,存储文件可能会被他人看到。

我选择这个网盘作为同步方案的原因是我有Nas,Onedrive的价值是同步和灾难备份,而不是作为所有文件的保存地。同时zotero这个软件对于文件的传输都是乱码格式的压缩文件,虽然没有密码,但是即便泄露,也不过是网上各种能够找到的网页和电子书再加上少许笔记而已,没有任何隐私资料。 配合rclone全数据库加密。

同时还有office 365可用,比拼家庭车划算。

可以参考koofr手册:https://koofr.eu/help/connect-other-cloud-services/how-can-i-connect-onedrive-to-koofr/

onedrive网盘的一大缺点是不支持webdav,或者说是只支持一种很特殊的webdav方案,zotera不支持。

rclone是本方案的核心,可以将onedrive网盘转换为webdav服务。

但是,这是一个GO语言编写的程序,不能直接在Android手机运行,但是借助Termux就可以了。

这是一个Android系统中的linux环境,在Android中使用Linux程序时经常会用到。

使用方法

Onedrive

一般老板会给注册好或者给出网页自助注册,不明的话可以询问店家。

Termux

Android程序, 安装即可。

第一次打开会执行一个自动安装,没有什么需要操作的。

rclone
pkg update
pkg install rclone

使用上面命令,直接安装即可。

配置

首先,rclone登录onedrive:参考https://rclone.org/onedrive/ 即可。

参考这个页面添加加密层

启动webdav服务器(remote:/是上一步的服务器名字):

rclone serve webdav --addr 0.0.0.0:端口 --user 用户名 --pass 密码 remote:/

参考资料

本方案制定过程中参考了以下资料

移植zephyr到GD32E103_EVAL板子

背景

终于考完日语了,虽然够呛能过 o.o 105分飘过了o.o

不过也算是有点空闲时间能随便玩玩了.迫于近年来半导体价格飞涨, 国产MCU的应用也越来越广(大部分是替代STM32的样子)

整个移植过程可以看出GD32和STM32高度相似.

具体代码参考: https://github.com/zephyrproject-rtos/zephyr/pull/36833 PR的使用方法请参考后面

本次移植大概花费三四天,本文不会记录详细的移植过程(因为代码在上一行)只会记载几个移植中的小问题.

主要参考资料:https://docs.zephyrproject.org/latest/guides/porting/index.html

基础知识

为了能够移植zephyr系统,下面知识是我认为必须要先了解的,可能会有些不全,仅供参考,如有不足欢迎补充

  • 最低限度的计算机组成原理以及单片机构成常识(一般来说MCU由内核(arm,risk-v等,执行指令,提供中断系统)存储(flash, ram等)外设(gpio,uart,can,ethernet等),一般芯片是要放在电路板上才能工作,综上zephyr的硬件驱动划分为arch, soc, board)
  • cmake(虽然使用west命令进行编译,但是实际的构建环境是cmake,因此在移植前,我建议了解最低限度的cmake知识)
  • kconfig(官方仓库https://github.com/ulfalizer/Kconfiglib,用于配置内核宏, 会影响构建过程以及C程序)
  • dts(devicetree 设备树)(zephyr系统通过设备树对arch,soc,board进行抽象,类似linux设备树,但是系统调用方式不同,zephyr通过将dts编译为宏,在程序和构建过程中调用)
  • linux(虽然据说windows也可以使用,但是我建议如无特殊原因,请尽量养成在linux或mac中开发程序,避免各种麻烦)
  • openocd(MCU调试工具) 这个东西的使用的话相对简单,但是编写tcl脚本需要对jtag/swd的底层原理比较熟悉.一般的MCU openocd中都包含了支持文件, 但是不巧的是GD32E103_eval的这款板子和芯片均不在支持范围内.
  • yaml(一种配置文件格式,类似json/xml)简单了解即可
  • git(zephyr版本通过git管理)
  • C Marco (C语言宏)
    • 虽然因为zephyr项目使用C语言编写,为了移植掌握C语言是必要的无需多做说明,但是在处理设备树的过程中,会用到极其复杂的宏调用,数十层的宏包装人脑展开已经极为困难,有些时候只能根据编译器预编译结果来检查问题. 所以如果您是C语言新手或关于预编译器工作原理不是很清楚的话,强烈建议您补全此处知识,包括但不限于宏拼接(##运算),可变参数列表宏(__VA_ARGS__)
  • vscode调试和编译的配置方法(可能经常使用keil,iar等IDE环境的朋友会比较陌生)

相关文件

zephyr的移植主要设计下面文件(module需要单独建立仓库,可以参考https://github.com/feilongfl/hal_gd32, 仓库内GD32E1的支持包来自gigadevice官网)

  • boards(板级外设)
  • socs(芯片外设)
  • drivers(驱动)
  • west.yml(module)

绝大多数都可以参考STM32F1x的芯片进行移植,其实从手册来看,驱动也可以共用, 但是为了避免STM32的驱动应用在其他厂家的芯片上所产生的法律和道德问题, 我主要使用GD32官方提供的代码.

主要问题

  • arm mpu可能在移植初期带来一些问题,所以在初期最好关闭
  • zephyr使用systick定时器运行,所以在开始配置时,我们可以不用从时钟系统开始.我认为从gpio led灯开始会比较容易.
  • 我的移植顺序(目前只做了这些,至此芯片基本功能已经完成,但是我适配的串口只能支持基本的收发,如果要应用console或其他subsys可能还要支持中断和DMA):
    • 已实现
      • led灯(GPIO的输出)
      • RCU时钟树
      • 按键(GPIO输入)
      • 串口(GPIO pinmux, uart外设)
    • 计划中
      • 串口(runtime config)
      • 串口(中断驱动)
      • 串口(DMA)
      • CAN
      • USB
  • openocd 这个是移植过程中比较头痛的,因为虽然会使用openocd调试一些芯片,但是编写tcl脚本适配芯片debug系统确实没怎么研究过.只了解一些边界扫描之类的理论知识.这个位置氛围两个部分,一个是debugger,另一部分是debugger和MCU间的通讯支持
    • debugger
      • GD32开发板接入pc,执行 lsusb,可以得到Bus 001 Device 006: ID 28e9:058f GDMicroelectronics CMSIS-DAP,因此debugger是CMSIS-DAP,这部分驱动openocd内提供.
    • debugger和MCU间的通讯支持
      • 因为GD32基本与STM32相似, 仔细调查发现是与STM32F1x系列相似(新系列例如G4等不兼容), 于是常识STM32F1的openocd配置,发现jtag和swd的ID芯片信息需要修改,修改后即可工作.
  • west.yaml 这个和android的repo命令所使用的manifest原理很相似,看来大家都觉得git submodule不好用
  • 感觉GD32的EVAL板质量一般
    • 目前手中的板子信号振铃极其严重,串口波特率115200就已经开始乱码了,有点怀疑是不良品
      • 也可能是usb串口不良,因为我没想到只有两个DB9的串口接口可以使用,用的淘宝8元包邮的那种,后续可能会更换usb串口测试下
      • 印象里CMSIS DAP是自带虚拟串口的,不清楚为啥GD的这个调试器没有接串口.像ST-link一样调试串口可能更友好一些.
    • 吐嘈下,好多年没用锉刀打磨PCB板子边角了o.o
    • 从手册来看,芯片支持CANFD协议,但是PHY芯片手册标识最高速率1M,不是CANfd应该使用的PHY芯片.
      • 后续不稳定可能要自己更换
      • 不过确实是第一次见国产CAN phy,以前只用过NXP的产品,不知道国产芯片是否能有超越数据手册的性能 o.o
      • 我猜GD是不想管理太多芯片,整个eval系列物料共用了
  • 移植过程中发现STM32的官方支持确实很到位, GD32就没有找到太多的支持.

写完之后再看感觉会移植的人也不需要看了,不会的可能看完还是看不会 o.o

PR用法

动图如下(顺便发现了termtosvgasciinema这几个好玩的工具):

https://asciinema.org/a/443449

boox max2 更换电池

平时看漫画和anki的主力工具,用了两三年,电池有点不行了.

翻遍了国内各种网站,竟然没有任何拆解相关的内容, 我掰了掰侧面,感觉不像卡扣的.问淘宝电池卖家也没有拆解方案,最终在youtube上找到了前人的拆解视频,才恍然大悟,正面竟然只是一层贴纸,螺丝密密麻麻排在贴纸下.

拆解视频

注意,贴纸很薄,但很结实,感觉像是某种塑料,能割伤手指!!拆机一定要小心.

电池更换

和视频说明区别不大,换上电池满血复活 🙂

stm32g431系列PD编译踩坑

最近开始研究了一下stm32cube,发现挺好用的,就是bug太多,经常生成的工程不能编译.

我一般选择生成makefile,这样对自动集成比较友好.方便后续迭代.

cube配置

没有硬件,电路在不断改设计(这个是我随便画得,不一定能运行,没看手册),暂定这么分配管脚.这次主要是测试编译和接口,为以后开发踩下坑

芯片支持usbfs和fdcan,可以做个canfd数据分析,省下周立功两千多大洋(感觉周立功的东西去个0差不多),vector这种级别的比不了还是买吧.

而且支持双向USBPD,可以做快充,或者大功率耗电.看了下st的pd视频,估计未来的st芯片系列都会带有这个模块.

cube坑和注意事项

  1. pd快充的硬件模块ucpd必须要手动开启中断和DMA,增加USBPD中间件并不会自动配置.
  2. GUI_INTERFACE启用后可以对PD进行debug,ST有一个上位机PD工具
  3. USBPD开启TRACE_EMB,并且TRACE_EMB模块打开可以在串口debug,也可以在GUI看到.

生成代码的坑

这坑就大了…

Makefile上

  1. IDrivers/CMSIS/Include这里多一行,生成工程经常遇到,老错误了
  2. 下面这段
LIBS = -lc -lm -lnosys  \
-lUSBPDCORE_PD3_FULL_CM4_wc32.a
LIBDIR =  \
-LMiddlewares/ST/STM32_USBPD_Library/Core/lib

把链接文件当库用了…应当是下面这样:

LIBS = -lc -lm -lnosys \
Middlewares/ST/STM32_USBPD_Library/Core/lib/USBPDCORE_PD3_FULL_CM4_wc32.a

LIBDIR = 

3. 修改下面编译阶段,加入ccache可以加快编译,毕竟整个库几乎不用改.不然每次修改makefile都会全部重新构建.

4. cube配置后可能有重复的文件加进去,导致一堆符号重复,删除重复即可

库BUG

经过上面反复折腾,如果你在cube配置时选择双向(dual)PD你会看到下面错误:

/usr/bin/ccache arm-none-eabi-gcc -c -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -DUSE_FULL_LL_DRIVER -DUSBPD_PORT_COUNT=1 -D_RTOS -D_DRP -D_TRACE -D_GUI_INTERFACE -DUSBPDCORE_LIB_PD3_FULL -DUSE_HAL_DRIVER -DSTM32G431xx -IInc -IDrivers/STM32G4xx_HAL_Driver/Inc -IDrivers/STM32G4xx_HAL_Driver/Inc/Legacy -IUtilities/GUI_INTERFACE -IUtilities/TRACER_EMB -IMiddlewares/Third_Party/FreeRTOS/Source/include -IMiddlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -IMiddlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F -IMiddlewares/ST/STM32_USBPD_Library/Core/inc -IMiddlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/inc -IMiddlewares/ST/STM32_USBPD_Library/../../../Drivers/STM32G4xx_HAL_Driver/Inc -IMiddlewares/ST/STM32_USB_Device_Library/Core/Inc -IMiddlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc -IDrivers/CMSIS/Device/ST/STM32G4xx/Include -IDrivers/CMSIS/Include -Og -Wall -fdata-sections -ffunction-sections -g -gdwarf-2 -MMD -MP -MF"build/usbpd_cad_hw_if.d" -Wa,-a,-ad,-alms=build/usbpd_cad_hw_if.lst Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_cad_hw_if.c -o build/usbpd_cad_hw_if.o
Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_cad_hw_if.c:167:17: warning: 'ManageStateDetached_SNK' used but never defined
  167 | static uint32_t ManageStateDetached_SNK(uint8_t PortNum);
      |                 ^~~~~~~~~~~~~~~~~~~~~~~
arm-none-eabi-gcc build/main.o build/app_freertos.o build/usbpd.o build/usbpd_dpm_user.o build/usbpd_pwr_user.o build/usbpd_pwr_if.o build/usbpd_vdm_user.o build/usbpd_dpm_core.o build/usb_device.o build/usbd_conf.o build/usbd_desc.o build/usbd_cdc_if.o build/stm32g4xx_it.o build/stm32g4xx_hal_msp.o build/stm32g4xx_hal_timebase_tim.o build/stm32g4xx_ll_utils.o build/stm32g4xx_ll_exti.o build/stm32g4xx_hal_gpio.o build/stm32g4xx_hal_pcd.o build/stm32g4xx_hal_pcd_ex.o build/stm32g4xx_ll_usb.o build/stm32g4xx_hal.o build/stm32g4xx_hal_rcc.o build/stm32g4xx_hal_rcc_ex.o build/stm32g4xx_hal_flash.o build/stm32g4xx_hal_flash_ex.o build/stm32g4xx_hal_flash_ramfunc.o build/stm32g4xx_hal_exti.o build/stm32g4xx_hal_dma.o build/stm32g4xx_hal_dma_ex.o build/stm32g4xx_hal_pwr.o build/stm32g4xx_hal_pwr_ex.o build/stm32g4xx_hal_cortex.o build/stm32g4xx_hal_adc.o build/stm32g4xx_hal_adc_ex.o build/stm32g4xx_ll_adc.o build/stm32g4xx_hal_crc.o build/stm32g4xx_hal_crc_ex.o build/stm32g4xx_hal_dac.o build/stm32g4xx_hal_dac_ex.o build/stm32g4xx_hal_fdcan.o build/stm32g4xx_hal_i2c.o build/stm32g4xx_hal_i2c_ex.o build/stm32g4xx_hal_smbus.o build/stm32g4xx_hal_i2s.o build/stm32g4xx_hal_iwdg.o build/stm32g4xx_ll_lpuart.o build/stm32g4xx_ll_gpio.o build/stm32g4xx_ll_dma.o build/stm32g4xx_hal_uart.o build/stmle32g4xx_hal_uart_ex.o build/stm32g4xx_hal_rng.o build/stm32g4xx_hal_rtc.o build/stm32g4xx_hal_rtc_ex.o build/stm32g4xx_hal_spi.o build/stm32g4xx_hal_spi_ex.o build/stm32g4xx_hal_tim.o build/stm32g4xx_hal_tim_ex.o build/stm32g4xx_ll_pwr.o build/stm32g4xx_ll_usart.o build/stm32g4xx_ll_ucpd.o build/system_stm32g4xx.o build/croutine.o build/event_groups.o build/list.o build/queue.o build/stream_buffer.o build/tasks.o build/timers.o build/cmsis_os2.o build/heap_4.o build/port.o build/usbpd_trace.o build/usbpd_cad_hw_if.o build/usbpd_hw.o build/usbpd_hw_if_it.o build/usbpd_phy.o build/usbpd_phy_hw_if.o build/usbpd_pwr_hw_if.o build/usbpd_timersserver.o build/stm32g4xx_ll_tim.o build/usbd_core.o build/usbd_ctlreq.o build/usbd_ioreq.o build/usbd_cdc.o build/data_struct_tlv.o build/bsp_gui.o build/gui_api.o build/tracer_emb.o build/tracer_emb_hw.o build/stm32g4xx_ll_rcc.o build/startup_stm32g431xx.o -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -specs=nano.specs -TSTM32G431RBTx_FLASH.ld  -lc -lm -lnosys Middlewares/ST/STM32_USBPD_Library/Core/lib/USBPDCORE_PD3_FULL_CM4_wc32.a -Wl,-Map=build/sthub.map,--cref -Wl,--gc-sections -o build/sthub.elf
/usr/lib/gcc/arm-none-eabi/9.3.0/../../../../arm-none-eabi/bin/ld: build/usbpd_cad_hw_if.o: in function `ManageStateDetached_DRP':
/home/feilong/workspace/sthub/prj/stm32g431rbtx/Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_cad_hw_if.c:1137: undefined reference to `ManageStateDetached_SNK'
collect2: error: ld returned 1 exit status
make: *** [Makefile:260:build/sthub.elf] 错误 1

这个问题我猜了好久,因为之前的链接库错误,我一直在找这个库在那个lib里面,就差对全系统文件进行objdump了,后来突然发现这个ManageStateDetached_SNK函数就在报错的那个文件里面.不过是这么写的

#if defined(_SNK)
static uint32_t ManageStateDetached_SNK(uint8_t PortNum)
{

看来ST是认为这个函数只有在sink时候才应该编译,但按照名字来看双向接口应该也有这个功能.于是修改成下面这样,编译之.

#if defined(_DRP) || defined(_SNK)
static uint32_t ManageStateDetached_SNK(uint8_t PortNum)
{

然后编译成功了.

不过至于能不能正常工作,这个就需要之后硬件完成后在测试了.