2020年7月21日 星期二

BMW E53/E38 Cluster mileage and VIN recoding

BMW E53/E38 更換拆車的儀表板(IKE)需要更改
a.里程數(mileage)要調整數值與車上相同
b.車身碼(VIN)要更改與車上相同
c.可能還需要做coding更改一些參數設定,例如油箱容量及時速表微調等.

以上需要更改的資料都儲存在儀表板上的一顆EEPROM IC裡面, 這顆IC有兩種比較早期的是M93S66 而後期的是M35080, 這兩顆IC硬體都是八根腳但腳位定義完全不同, 軟體讀寫的方式也不同, 因此不能互換.

這裡只針對M35080來做研究.

M35080 (注意後面有V3 V6是不同的IC喔) 是一顆SPI界面可讀寫的ROM, 儲存容量有1024 bytes.
因此讀寫的位址範圍是 0x0000 ~ 0x03ff, 位址最開頭的32 bytes是 incremental register, 每兩個bytes為一個單位,一共16個. 里程數就是放在這16個 Incremental register 中, Incremental register有個限制就是寫入的數值不能比原本儲存的小, 實務上的意義就是里程數只能增加不能減少.



1.Mileage decode

實際來看這32 bytes的資料(十六進位數值), 里程數是139148 km

0x0000 10 fd 10 fd 10 fd 10 fd 10 fd 10 fd 10 fc 10 fc 
0x0010 10 fc 10 fc 10 fc 10 fc 10 fc 10 fc 10 fc 10 fc 

由六個 10 FD 及 十個 10 FC 組成

首先 10FC 左移一個bit 變成 21F8, 一共有6個10 FD, 6 左移一個bit 變成C
兩個數值組合起來變成 21F8C 轉換為十進位數值就是 139148

演算過程 (((0x10 << 1) << 8 | (0xFC << 1)) << 4) | (6 << 1) = 0x21F8C = 139148

2.VIN decode

車身碼VIN code有固定的格式, 由兩個英文字母加上5個數字組成

例如 LN73888

VIN的儲存位址沒有固定,各車型可能位置都不同,甚至有可能有兩個以上的位址儲存VIN code

以下VIN位址在0x022C

0x0220 8f ff fe 5e ff 2c fe 3c f6 91 49 31 4c 4e 73 88 
0x0230 12 80 12 09 81 92 12 80 43 20 0a 29 00 09 0d ee 

資料是 4c 4e 73 88 12 80
4c : ASCII code 字元 L
4e: ASCII code 字元 N
73: 數字 73
88: 數字 88
12: 忽略這個byte
80: 取高位數字8

這樣就能得到 VIN : LN73888

3.回到更換拆車的儀表板的主題, VIN 及 mileage 儲存在儀表板 及 LCM燈光模組.
當車輛鎖匙轉至紅火,LCM及IKE會互相比對VIN及mileage,如果不同就會亮防偽燈.
所以更換儀表板要更改VIN及mileage. 

4.更改 VIN
可透過BMW Scanner / PA Soft軟體來更改,不用拆解儀表板

5.更改 mileage
要拆儀表板分解並解焊M35080, 又分以下兩種作法
a. 用專用的M35080 programmer可以清除mileage
b.透過BMW Scanner / PA Soft軟體dump M35080的全部的資料到電腦檔案中, 手動修改檔案將前32 bytes清成 00, 找到VIN 所在位址修改為 FF FF FF FF 12 FF, 然後拆下M35080 換一顆全新資料空的上去, 再用BMW Scanner / PA Soft軟體寫回去.

上車後儀表板會自動把LCM上儲存的VIN 及 mileage 寫入M35080

這樣就完成了

6.這次我採取的作法是購買新的M35080來更新, 萬一弄壞了還有舊的備份.
首先解焊M35080, 值得一提是電路板的IC上幾乎都有打樹脂, 一定要先用熱風槍加熱再仔細清除.
參閱M35080 Datasheet及網路上Arduino的實做範例程式, 我用STM32F103 SPI實做了一個簡易的programmer. 可以讀取及寫入M35080, 另外也有Encode / Decode VIN / Search VIN 及 Encode / Decode mileage. 有了這個工具我把整個M35080的內容讀出然後將該內容的前32 bytes清成 00 
, 然後改寫 VIN, 接著把這份修改過的內容寫到新的M35080, 最後把新的M35080焊回去儀表板.








Reference














2020年7月12日 星期日

Jetson Nano Wifi Hotspot

一直以來都是透過ethetnet以ssh方式登入Jetson Nano, 這個方式有兩個很大的缺點,一是需要先取得Jetson Nano在區域網路分配到的IP address, 而且只要換個網路IP address也跟著改變, 二是Jetson Naon在移動的載台上拉著網路線極不方便.

經過一番研究,最好的方式是Jetson Nano + AC 8265無線網卡做Wifi AP

1.Jetson Nano在完成SD card初次開機時需要做Initial setup, 選擇語言, 建立user / password.
這時PC先透過USB OTG連線Jetson Nano.

$ sudo apt-get install screen

$ screen /dev/ttyACM0 115200

2.在完成以上初始化設定後登入Jetson Nano, 建立Wifi Hotspot

$ nmcli dev wifi hotspot ifname wlan0 ssid <SSID> password <PASSWORD>

編輯Wifi hotspot設定檔, 開機自動啟用Wifi Hotspot及設定Wifi hotspot的IP address & netmask

$ sudo vi /etc/NetworkManager/system-connections/Hotspot

-autoconnect=false
+autoconnect=true

[ipv4]
dns-search=
method=shared
+address1=10.0.0.1/24

3.重啟Network Manager

$ sudo systemctl restart network-manager.service

4.PC連線Jetson Nano wifi hotspot. 這個IP address永遠不變

$ ssh <USER>@10.0.0.1

5.這個作法PC仍然可以透過Jetson Nano的有線ethernet連上internet

[ PC ] <---Wifi ---> [ Hotspot / Jetson Nano / Ethernet ] <--- Local LAN ---> Internet


6.Disable wifi power save

$ sudo vi /etc/NetworkManager/conf.d/default-wifi-powersave-on.conf

-wifi.powersave = 3
+wifi.powersave = 2