December 26, 2023

年度更新。End of 2023

 忽然發現 2023 即將過去,今年都沒來更新 blog,趕緊來更新一下。

過去一年最大的改變莫過於 chatGPT 進入生活吧。短短幾個月,多做了很多以前不知道怎麼做或是沒想到可以做的事情。當然主要還是專業的寫程式碼之類。


然後有個人類訓練 AI,但是人類同時也被 AI 訓練著的感想。

今年最讓我覺得特別的大概是 CRC32 計算 for MCU。在運算量和 code size 達到均衡。

貼出來分享一下。

uint32_t halcrc32_update(uint32_t crc, uint8_t data) {

    crc ^= data;

    for (int i = 0; i < 8; i++) {

        if (crc & 1) {

            crc = (crc >> 1) ^ 0xEDB88320;

        } else {

            crc >>= 1;

        }

    }

    return crc;

}


uint32_t halcrc32_calculate(const uint8_t *data, uint32_t length) {

    uint32_t crc = 0xFFFFFFFF;

    for (uint32_t i = 0; i < length; i++) {

crc ^= data[i];

for (uint32_t n = 0; n < 8; n++) {

    if (crc & 1) {

        crc = (crc >> 1) ^ 0xEDB88320;

    } else {

        crc >>= 1;

    }

}

    }

    return crc ^ 0xFFFFFFFF;

}

 

寫得不多,塞點圖充版面一下。照片是 Pixel 8 Pro 拍攝的。


August 21, 2022

FreeBSD Transfer to new PC with NVME

這篇將提到如何把 FreeBSD 從舊 PC 轉移到新 PC,以及如何從 SATA 硬碟轉移到 NVME SSD。

轉移的目標是 ASUS PN41。 

另外也會提一下這幾年的使用心得。不想看的可以先跳過。

其實之前就想寫這篇。偷懶的結果就是昨天多花了不少時間搞。

原本我在各長居地都有架設個小 server,順便當對外防火牆。反正 loading 不會高到哪,找個普普機器就好,其實蠻方便的。

最早是自組的,通常就是淘汰的舊電腦,或是隨便買個便宜板子和便宜 CPU 上。後來經濟狀況好一點覺得這樣子太醜了,用久了便成一團灰,所以就改買便宜 PC。於是幾年前開始噵入ASUS VM60。最近覺得時間到了 (從 2014 用到今年吧?),追求成本更便宜又換成 ASUS PN41。

VM60一路上用來其實算是穩定,唯一也最常遇到的問題就是風扇不轉罷工。但是處理方式也很簡單,就是拆下滴針車油。後幾年大概就是大約一年左右要滴一次。其實本來是想換風扇,但是實在找不到便宜料就打消念頭了。

最近開始換成 ASUS PN41,有一方面也是覺得做這動作很累。但更大部分是 PN41 更適合我目前的使用情境。低工作瓦數 (Pentium N6005 TDP 10W),具備 NVME 和 SATA,可自行擴充的 RAM 插槽。

我用的版本是 Pentium N6005 CPU 的乞丐版。從中國買的,價錢大約都是折合台幣6,000出頭。不包含 RAM、硬碟甚至連無線網卡都沒有。畢竟這些我都有汰換的可以用。

前話聊完,再來講重點。

主機轉移的概念很簡單,就是

1. 把舊主機斷網

2. 舊主機裝上新 NVME SSD

3. 然後把資料都複製上 NVME SSD 後

4. 修改一下新 NVME SSD 上的/etc/fstab 讓他換主機能 mount 正確的 partitions。

5. 拿到新主機裝上,插網路線後開機。收工!

簡單幾個步驟。實際上有些魔鬼 (?) 細節。

步驟 0For PN41 ONLY! 先 pkg install realtek-re-kmod。為啥要先安裝 realtek-re-kmod 這個 package?這後面會講。另外這個步驟兩台主機都是 amd64 架構。如果是 x86 32 轉上來,我沒把握可以這樣搞。

步驟 1 是為了預防複製到一半又收到 mail 之類導致備份不完整。這個步驟的做法很簡單,就是直接拔掉網路線。

步驟 2 其實也還好。舊主機不支援 NVME,所以就是拿 NVME SSD + 外接盒接上。舊主機是 MBR,新主機我打算用 GPT。還有 PN41 只能用 EFI 方式開機,所以也不得不弄 GPT 搞 EFI

我原本用的分區方式是 / 跟 /usr 兩個分區。所以先在 NVME SSD (這邊變成USB 磁碟) 上建立 GPT。

因為我用的 NVME SSD 也是汰換的 (以前買筆電隨機的 256G NVME SSD),所以

#確定 NVME SSD 的 dev 名稱。在我的例子是 /dev/da0,操作上就用 da0
gpart show
# 先砍掉原本的
gpart destroy -F da0
# 建立新的
gpart create -s GPT da0
# boot partition
gpart add -b 40 -s 128 -t freebsd-boot da0
# EFI partition
gpart add -s 81752 -t efi da0
# UFS root, / 。這裡 -l 代表的是 label。-s 代表大小,沒設定會用光剩下的
gpart add -s 68G -t freebsd-ufs -l root da0
gpart add -t freebsd-ufs -l usr da0


#稍微檢視一下
gpart show -l da0


應該會看到
=>       40  500118112   da0  GPT     (238G)
         40        128     1  (null)  (64K)
        168      81752     2  (null)  (40M)
      81920  142606336     3  root    (68G)
  142688256  357429896     4  usr     (170G)

再來設定 EFI boot
gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 da0
newfs_msdos -F 32 -c 1 /dev/da0p2
mount -t msdosfs /dev/da0p2 /mnt
mkdir -p /mnt/EFI/BOOT
cp /boot/loader.efi /mnt/EFI/BOOT/BOOTx64.efi
umount /mnt
# -i 3 代表 index 3。對應到前面 gpart show 顯示的。我們想弄的是 root
gpart set -a bootme -i 3 da0

弄好應該會看到
=>       40  500118112   da0  GPT     (238G)
         40        128     1  (null)  (64K)
        168      81752     2  (null)  (40M)
      81920  142606336     3  root [bootme] (68G)
  142688256  357429896     4  usr     (170G)

這樣就簡單搞好。再來就是把 UFS 弄成想要的形狀
# da0pX  X會對應到前面建立的 index。我們要弄全部的 UFS
newfs -njtEU /dev/da0p3
tunefs -a enable /dev/da0p3
newfs -njtEU /dev/da0p4
tunefs -a enable /dev/da0p4
#再來 mount
mount /dev/da0p3 /mnt
#建立 usr 掛載點
mkdir /mnt/usr
#建立下面三個目錄,因為之後不複製這三個
mkdir /mnt/proc
mkdir /mnt/dev
mkdir /mnt/mnt
#現學現賣 XD 用 /dev/da0p3 也可以
mount /dev/gpt/root /mnt
mount /dev/gpt/usr /mnt/usr

步驟 3 不難。我們利用 tar 就能完成。有些檔案特意避開 (例如各 partition 的 .sujournal)
tar -C / -cf - --exclude="./mnt" --exclude="./proc" --exclude="./dev" --exclude="./.sujournal" --exclude="./usr/.sujournal" .|tar -xf - -C /mnt

可能會有些錯誤。大部分就是檔案編碼問題。可以看看無大礙。沒有就不用特意管他。

步驟4 把原本的 partiton dev 名稱改掉。編輯 /mnt/etc/fstab
/ 改成用 /dev/gpt/root
/usr 改成用 /dev/gpt/usr

改好的 /mnt/etc/fstab 看起來應該會像這樣
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/gpt/root   /               ufs     rw      2       2
/dev/gpt/usr    /usr            ufs     rw      2       2
proc    /proc           procfs  rw      0       0

因為用的是 PN41,要順便編輯一下 /mnt/boot/loader.conf,加上
if_re_load="YES"
if_re_name="/boot/modules/if_re.ko"

弄好後 umount,再關機或是拔外接盒
umount /mnt/usr
umount /mnt

步驟5 真的把 NVME SSD 裝上 PN41 後就可以跑了。 PN41 需要 步驟0 是因為 PN41  用了新的 realtek 網卡,需要更新 driver。然後需要編輯 /boot/loader.conf 讓新 driver 替代自帶的。

大致上就這樣。留個筆記給自己。發文不附圖好像怪怪的,所以附上一張。



November 12, 2021

USB serial on WSL2

最近有需要在 WSL2 上用 USB TTL 的需求。
這邊做一下紀錄。

我的 WSL2 Linux 用的是 Windows 11 + Ubuntu 20.04 LTS,以下就以這個為基礎做紀錄。

估狗了一下,大致上都是說需要 usbip 。簡單來說就是透過網路方式分享 USB`.
比較早的一些方案,抓 usbip for windows 然後重新 compile  WSL2 linux kernel 對我無效。
e.g.

最後找到這篇比較官方 (M$) 開發者的說明,還蠻新的


遵循這個 blog 的說明,Windows 需要安裝
usbipd-win

WSL2 上則是先安裝一些需要的工具

sudo apt install linux-tools-5.4.0-77-generic hwdata

然後編輯 sudoer

visudo

找到 Defaults secure_path 這行,修改如下 (紅色代表我新增的內容)

Defaults secure_path="/usr/lib/linux-tools/5.4.0-77-generic:...

做完這些,還需要打開 Windows 的防火牆設定。(重點,卡了我一點時間)


基本上就是去 Windows firewall 管理打開剛剛安裝的 usbipd-win 權限。
這樣 host 和 target 才能通。
接著用 Administrator 權限啟動 Windows terminal ,同時也要啟動 WSL2,接著就能在 Windows tesminal (power shell or command prompt) 執行 usbipd

查詢可用的 USB 裝置

usbipd wsl list

從這邊可以看到裝置的 BUS ID。然後就可以掛載。

usbipd wsl attach --busid <bus-id>

舉我的例子來說,


我想掛載 USB TTL,所以就用

usbipd wsl attach --busid 4-2

如果要取消掛載,就用

usbipd wsl detach --busid 4-2

然後在 WSL2 打 lsusb -t -v  還有 dmesg  應該就能看到裝置了。

BUT ... 因為我用的是 CP2102 的 USB TTL,似乎並沒有直接抓到。
所以還是要參考最早重新 compile  kernel 的文章來產生 kernel module。

替換 kernel 不用參考上面那篇,後來找到的方法感覺比較正統。

compile 好,make modules_install 後,把 Compile 好的 kernel copy 出來

cp vmlinux /mnt/c/User/YourName/vmlinux

編輯 /mnt/c/User/YourName/.wslconfig
內容

[WSL2]
kernel=C:\\Users\\YourName\\vmlinux


然後重新啟動 WSL2
Windows terminal 下關閉 wsl2
wsl --shutdown

然後重新啟動 WSL2,跑上面的 usbipd 指令。 
WSL2 裡

sudo modprobe cp210x

再觀察一下 dmesg,應該就能看到他被掛載到 /dev/ttyUSB0
達成我最早的目的。






November 03, 2020

Progress 10/12 of the 2020

 好久沒更新。

稍微記錄一下這陣子改了些啥。

1. AreaView 2 (環景)

2. 移植其他 VAG 的液晶儀表

大概就這樣。圖之後有空再編輯補上。

December 20, 2019

源自對修車的熱愛 - 異種移植 VW 音響至 Suzuki SX4 Part 2

經過一陣子。

把老車整理了一下,這次把主機整合上倒車顯影。
找幫忙整理的車廠把鏡頭和線路弄好,自己再接上主機。

還搞了無線 carplay (某寶買轉換 dongle,¥690 RMB)
還蠻方便的。只是不知道為何沒辦法聲控...難道麥克風不在主機上嗎?(待確認)





March 20, 2019

源自對修車的熱愛 - 液晶儀表

原廠政策看起來是不給 MPV 車型液晶儀表。
只好自己來了...

Before

After
效果不錯,只是有些設定不符合比較麻煩。
筆記重點
Part Number: 3G0920791C
需要準備所有的鑰匙,做在線激活。
交換前,備份 ABS coding。以及 17 的 coding 和 adaption。
設定:
Address 17
Coding: 
Wheel Circ. (Byte 3):  Version 3 - 適合 225/40R18 同規格胎
Tank characteristic curve (Byte 2): Version 4 - 50L油箱

Address 5F
Coding:
Enable MOST (byte 19, BIT5)

January 14, 2019

源自對修車的熱愛 - 異種移植 VW 音響至 Suzuki SX4


最近一兩年 Car Play 和 Android Auto 都很夯,大家也很想要。
但是市面上有這些功能的車機都不便宜……嗎?
其實不然。 VW 因應中國市場需求,在中國產的中低階車種會有配一種很低階但是有 Car Play 和 Baidu CarLife 的主機 (但是沒有 Android Auto)。
當地很多車主嫌太 low,會換成安卓機之類,這時候這些低階主機就被出清了。
掌握到這點,在做了點功課後,就到淘寶買了一台,準備安裝在家裡的老車 SX4上。
這台主機俗稱 280D,應該有新舊兩種版本,差在外觀 (吧?)

我會簡單帶一下流程,順便提一下重要細節當作筆記。

首先基礎知識。要轉接,其實就是線路對上就好。
然後 VW 的主機基本上以 CAN BUS 為通訊控制機處,因為異種移植,所以基本上還要準備解碼器來解決控制訊號問題。

我先做了一下功課
1. 確認尺寸 - 至少要塞得下去原車的空間吧... 盜一下圖 (X)
基本上  2 din 應該進得去。我的是主機在下,還有一種是主機在上的
圖片來源是我買的地方: https://item.taobao.com/item.htm?spm=a1z09.2.0.0.716b2e8dD6eNKV&id=562476292226&_u=e30otr689de1

2. 買主機、接頭 (我是賣家有附)、收音機轉換線、解碼器。解碼器基本上看你要的功能,我想保留之後還能裝倒車顯影的能力,所以我買有支援倒車顯影的。
主機真的很便宜。我搭解碼器買一買 158 RMB。只是後來發現解碼器不夠用,又買更好的 (因為我想要倒車顯影啊...),但是總花費大概不超過 250 RMB 。圖片裡的是後來漲價了。


買來長這樣


3. 轉接線。用關鍵字下。基本上買來要自己剪頭改。所以可以上 youtube 學一下怎麼搭線。
這裡的圖是網路上找來的 SX4 接口圖。解碼器有些偵測腳要看這邊接。(電源、小燈、ACC)
這樣接下來反應才會正常。SX4要對接的就是要買圖中藍色那種公插座 (某種ISO標準規格)

主機上有腳位標示,基本上就對好接上。
4. 最後就是加工。不然沒辦法很好地塞進去車裡。我是拿尖嘴鉗把周邊一堆有干涉的都拔掉了。其實不困難。
加工後變這樣,可以對照前面加工前的圖。
5. 如果你跟我一樣有 VCDS 或是 OBD11 和網關還有線束,可以稍微調整一下 ^_^,改改配色... (基本上只有藍色、紅色和金色可以搞出來)。我還順便升級了 firmware。


6. 裝好後就上車了。基本上前面有搞好應該就 Ok 了。基本上效果還不錯。也可以調整時間啥的 (但是要用奇妙的方式。這好像跟買的解碼器廠商有關係)。





總結,列一下優缺點
優點:
1. 超便宜!!! 有基礎功能 (廣播、藍芽音樂、藍芽電話、USB和SD卡音樂)
2. 有 CAR PLAY !!! 有 Mirror Link (但是我沒試成功)
3. 音樂可以播無損 FLAC 格式!!!
4. 外觀不會太寒酸 (至少強原本的 10 條街),原廠等級的穩定度

缺點:
1. 沒有 Android Auto QQ
2. 音樂格式不支援 AAC
3. 不合的外觀不知道算不算... XD
4. 不支援歌曲名稱日文顯示...

嚴格來說不算他的錯:
1. 調整時間... 要用詭異方式調整 (跟解碼器廠商有關)

大概記得的就先寫到這樣。