mirror of
https://github.com/dragonpilot/dragonpilot.git
synced 2026-06-12 13:54:19 +08:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ba9cc0cd3 | ||
|
|
7de523b8a2 | ||
|
|
1412691630 | ||
|
|
baffaeee93 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -41,8 +41,6 @@ selfdrive/boardd/boardd
|
||||
selfdrive/logcatd/logcatd
|
||||
selfdrive/mapd/default_speeds_by_region.json
|
||||
selfdrive/proclogd/proclogd
|
||||
selfdrive/ui/_ui
|
||||
selfdrive/ui/_soundd
|
||||
selfdrive/test/longitudinal_maneuvers/out
|
||||
selfdrive/visiond/visiond
|
||||
selfdrive/loggerd/loggerd
|
||||
|
||||
730
CHANGELOGS-DEV.md
Normal file
730
CHANGELOGS-DEV.md
Normal file
@@ -0,0 +1,730 @@
|
||||
dragonpilot 0.8.8-2
|
||||
========================
|
||||
* ADDED: newer faster and modularized mapd and slow down for curve. (Thanks to @move-fast)
|
||||
* ADDED: Street name on the bottom bar.
|
||||
* ADDED: Now supports 1+3t / C2 / C3 / Jetson Xavier NX.
|
||||
* ADDED: Smoother tune for PRIUS_TSS2.
|
||||
* Bug fixes.
|
||||
|
||||
dragonpilot 0.8.8-1
|
||||
========================
|
||||
** BETA TESTING ONLY **
|
||||
* Based on openpilot 0.8.8 devel.
|
||||
* FIXED: dashcam issue.
|
||||
* FIXED: some VW vehicles issue. (Thanks to @yayism)
|
||||
* FIXED: white panda + j533 acc issue. (Thanks to @lirudy)
|
||||
* ADDED: Auto fake black panda.
|
||||
* ADDED: 2018 chinese camry hybrid fingerprint (Thanks to @stingshen)
|
||||
* WIP: mapd.
|
||||
|
||||
dragonpilot 0.8.7-4
|
||||
========================
|
||||
* 2017 JADE w/ Added Comma Pedal Support. (Thanks to @lijunhao731)
|
||||
* Fixed toyota / honda brake light display. (Thanks to @loveloveses)
|
||||
* Fixed UI toggle. (Thanks to @鄧育林、@謝聖鴻)
|
||||
* Fixed VW resume/display issue. (Thanks to @SKY)
|
||||
* Fixed CJK font installation issue.
|
||||
|
||||
dragonpilot 0.8.7-3
|
||||
========================
|
||||
* Bug fixes.
|
||||
* Fixed gpxd.
|
||||
* Added some Chinese support.
|
||||
|
||||
dragonpilot 0.8.7-2
|
||||
========================
|
||||
* Fixed sound issue.
|
||||
* Changed gpx logs to OSM compatible format.
|
||||
* HONDA: Added BSM support for CRV-Hybrid.
|
||||
* HONDA: Added toggle to force displaying km/h in HUD.
|
||||
* TOYOTA: Add new Toggles under DP - Cars to enable/disable Following Modes / Accel Modes with physical button feature.
|
||||
|
||||
dragonpilot 0.8.7-1
|
||||
========================
|
||||
* Based on openpilot 0.8.7 devel.
|
||||
* Support 1+3t / C2 / Jetson Xavier NX.
|
||||
* Support White / Grey Panda.
|
||||
* TOYOTA: Can now change Following Modes with physical button from the steering wheel.
|
||||
* TOYOTA: Can now change Acceleration Modes with physical button if your car supports it.
|
||||
* TOYOTA: Added Low speed override toggles.
|
||||
* Dev UI now displays RPM reading.
|
||||
* Added Prebuilt toggle for faster boot.
|
||||
* Lexus RX high RPM fix. (Thanks to @crazysim).
|
||||
* Added toggle to launch Language settings.
|
||||
* Added toggle to launch Volume settings.
|
||||
* Added toggle to launch date/time settings.
|
||||
* Added toggle to flash panda.
|
||||
* Added toggle to recover panda firmware.
|
||||
* Added toggle to delete logging (/sdcard/realdata).
|
||||
* Added GPS Logger.
|
||||
|
||||
dragonpilot 0.8.6-1
|
||||
========================
|
||||
* Based on openpilot 0.8.6 devel.
|
||||
* Support 1+3t / C2 / Jetson Xavier NX.
|
||||
* Support White / Grey Panda.
|
||||
|
||||
dragonpilot 0.8.5-4
|
||||
========================
|
||||
* Added multiple toggles.
|
||||
* Code clean up.
|
||||
* Android app support. (see selfdrive/dragonpilot/HOWTO-APPD.md)
|
||||
* Better support for VW MPQ (Thanks to @Saber)
|
||||
|
||||
dragonpilot 0.8.5-3
|
||||
========================
|
||||
* Added Jetson support toggle.
|
||||
* Added Steering Ratio controller.
|
||||
* Reduce Following Profile to 3 modes only. (1.8s / 1.5s / 1.2s)
|
||||
* Bug fixes.
|
||||
|
||||
dragonpilot 0.8.5-2
|
||||
========================
|
||||
* Added black panda simulation toggle.
|
||||
* Added No GPS toggle.
|
||||
* Added No Battery Toggle.
|
||||
* Bug fixes.
|
||||
|
||||
dragonpilot 0.8.5-1
|
||||
========================
|
||||
* Based on openpilot 0.8.5 devel.
|
||||
* 基於 openpilot 0.8.5 devel.
|
||||
* Support 1+3t / C2 / Jetson Xavier NX.
|
||||
* 支持 1+3t / C2 / Jetson Xavier NX.
|
||||
* No White/Grey Panda Support.
|
||||
* 不支持白灰熊.
|
||||
|
||||
dragonpilot 0.8.4-3
|
||||
========================
|
||||
* 簡化 1+3t 安裝方法. (請查閱 HOWTO-ONEPLUS.md)
|
||||
* Simplied 1+3t installation. (See HOWTO-ONEPLUS.md)
|
||||
* 加回舊 ssh 登錄.
|
||||
* Good old ssh key.
|
||||
* 修復本田錯誤. (感謝 @loveloveses)
|
||||
* Fixed Honda bug. (Thanks to @loveloveses)
|
||||
|
||||
dragonpilot 0.8.4-2
|
||||
========================
|
||||
* 加回可調整加速/跟車設定.
|
||||
* Added back Accel/Following Profile.
|
||||
* 支持 Headless Jetson Xavier NX (https://github.com/efinilan/xnxpilot.git)
|
||||
* Support Headless Jetson Xavier NX (https://github.com/efinilan/xnxpilot.git)
|
||||
* 支持 1+3t (需額外安裝手續)
|
||||
* Support 1+3t (Require additional install procedure)
|
||||
* 支持白/灰熊
|
||||
* Support White/Grey Panda.
|
||||
|
||||
dragonpilot 0.8.4-1
|
||||
========================
|
||||
* 基於 openpilot 0.8.4 devel.
|
||||
* Based on openpilot 0.8.4 devel.
|
||||
|
||||
dragonpilot 0.8.1
|
||||
========================
|
||||
* 基於最新 openpilot 0.8.1 devel.
|
||||
* Based on latest openpilot 0.8.1 devel.
|
||||
* 加入行車記錄按鈕。(感謝 @toyboxZ 提供)
|
||||
* Added REC screen button. (Thanks to @toyboxZ)
|
||||
|
||||
dragonpilot 0.8.0
|
||||
========================
|
||||
* 基於最新 openpilot 0.8.0 devel.
|
||||
* Based on latest openpilot 0.8.0 devel.
|
||||
* 加入 git 錯誤修正。(感謝 @toyboxZ 提供)
|
||||
* Added git error fix. (Thanks to @toyboxZ)
|
||||
|
||||
dragonpilot 0.7.10.1
|
||||
========================
|
||||
* HYUNDAI_GENESIS 使用 INDI 控制器。(感謝 @donfyffe 提供)
|
||||
* HYUNDAI_GENESIS uses INDI controller. (Thanks to @donfyffe)
|
||||
* HYUNDAI_GENESIS 加入 Cruise 按紐 和 lkMode 支援。(感謝 @donfyffe 建議)
|
||||
* HYUNDAI_GENESIS added Cruise button event and lkMode feature. (Thanks to @donfyffe)
|
||||
* 支援台灣版 2018 Huyndai IONIQ + smart MDPS (dp_hkg_smart_mdps) (感謝 @andy741217 提供)
|
||||
* Support 2018 Taiwan Hyundai IONIQ + smart MDPS (dp_hkg_smart_mdps) (Thanks to @andy741217)
|
||||
* 使用 openpilot v0.8 的模型。(感謝 @eisenheim)
|
||||
* Use openpilot v0.8 model. (Thanks to @eisenheim)
|
||||
* 加入 0.8 測試版的部分優化。
|
||||
* Added optimizations from pre-0.8.
|
||||
* 加入 dp_honda_eps_mod 設定來使用更高的扭力 (需 eps mod)。(感謝 @Wuxl_369 提供)
|
||||
* Added dp_honda_eps_mod setting to enable higher torque (eps mod required). (Thanks to @Wuxl_369)
|
||||
* 修正 VW 對白/灰熊的支援 (感謝 @lirudy 提供)
|
||||
* Fixed issue with white/grey panda support for VW (Thanks to @lirudy)
|
||||
* GENESIS_G70 優化 (感謝 @sebastian4k 提供)
|
||||
* GENESIS_G70 Optimisation (Thanks to @sebastian4k)
|
||||
* HYUNDAI_GENESIS 優化 (感謝 @donfyffe 提供)
|
||||
* HYUNDAI_GENESIS Optimisation (Thanks to @donfyffe)
|
||||
* 加入 Dynamic gas Lite。(感謝 @toyboxZ 提供)
|
||||
* Added Dynamic Gas Lite. (Thanks to @toyboxZ)
|
||||
* 加入來自 afa 的 Honda inspire, accord, crv SnG 優化。(感謝 @menwenliang 提供)
|
||||
* Added Honda inspire, accord, crv SnG optimisation from afa fork. (Thanks to @menwenliang)
|
||||
* 加入 dp_toyota_lowest_cruise_override_vego。(感謝 @toyboxZ 提供)
|
||||
* Added dp_toyota_lowest_cruise_override_vego. (Thanks to @toyboxZ)
|
||||
|
||||
dragonpilot 0.7.10.0
|
||||
========================
|
||||
* 基於最新 openpilot 0.7.10 devel.
|
||||
* Based on latest openpilot 0.7.10 devel.
|
||||
* 修正 Prius 特定情況下無法操控方向盤的問題。
|
||||
* Fixed unable to regain Prius steering control under certain condition.
|
||||
* 更新 VW MQB 的支援。(需執行 scripts/vw.sh 腳本)
|
||||
* Updated support of VW MQB. (scripts/vw.sh script required)
|
||||
* 新增 2018 China Toyota CHR 指紋v2。(感謝 @xiaohongcheung 提供)
|
||||
* Added 2018 China Toyota CHR FPv2. (Thanks to @xiaohongcheung)
|
||||
* 加入 Headunit Reloaded Android Auto App 支援。(感謝 @Ninjaa 提供)
|
||||
* Added Headunit Reloaded Android Auto App Support. (Thanks to @Ninjaa)
|
||||
* 優化 nanovg。(感謝 @piggy 提供)
|
||||
* Optomized nanovg. (Thanks to @piggy)
|
||||
* 加入 complete_setup.sh (感謝 @深鲸希西 提供)
|
||||
* Added complete_setup.sh (Thanks to @深鲸希西)
|
||||
* Based on latest openpilot 0.7.10 devel.
|
||||
* 修正 EON 接 PC/USB 充電器時仍會自動關機的錯誤。(感謝 @小愛 回報)
|
||||
* Fixed auto shutdown issue when EON connect to PC/USB Charger. (Thanks to @LOVEChen)
|
||||
* HYUNDAI_GENESIS 使用 INDI 控制器。(感謝 @donfyffe 提供)
|
||||
* HYUNDAI_GENESIS uses INDI controller. (Thanks to @donfyffe)
|
||||
|
||||
dragonpilot 0.7.8.3
|
||||
========================
|
||||
* VW 加入 6 分鐘時間方向盤控制限制輔助方案。(特別感謝 @actuallylemoncurd 提供代碼)
|
||||
* VW added 6 minutes timebomb assist. (dp_timebomb_assist, special thanks to @actuallylemoncurd)
|
||||
|
||||
dragonpilot 0.7.8.2
|
||||
========================
|
||||
* 修正在沒網路的情況下,開機超過五分鐘的問題。
|
||||
* Fixed 5+ minutes boot time issue when there is no internet connection.
|
||||
* 錯誤回傳改使用 dp 的主機。
|
||||
* Used dp server for error reporting.
|
||||
* 更新服務改使用 gitee 的 IP 檢查連線狀態。
|
||||
* updated service uses gitee IP address instead.
|
||||
|
||||
dragonpilot 0.7.8.1
|
||||
========================
|
||||
* 加入 ko-KR 翻譯。
|
||||
* Added ko-KR translation.
|
||||
* 加入 Honda Jade 支援。(感謝 @李俊灝)
|
||||
* Added Honda Jade support. (Thanks to @lijunhao731)
|
||||
* 修正 ui.cc 內存越界的問題。(感謝 @piggy 提供)
|
||||
* Fixed ui.cc memory out of bound issue. (Thanks to @piggy)
|
||||
* gpxd 記錄改自動存成 zip 格式。
|
||||
* gpxd now store in zip format.
|
||||
* 強制關閉 panda 檢查 DOS 硬體。
|
||||
* Force disabled DOS hardware check in panda.
|
||||
|
||||
dragonpilot 0.7.8.0
|
||||
========================
|
||||
* 基於最新 openpilot 0.7.8 devel.
|
||||
* Based on latest openpilot 0.7.8 devel.
|
||||
* 加入重置 DP 設定按鈕。(感謝 @LOVEChen 建議)
|
||||
* Added "Reset DP Settings" button. (Thanks to @LOVEChen)
|
||||
* 將警示訊息更改為類似於概念 UI 的設計。
|
||||
* Alert messages changed to concept UI alike design.
|
||||
* 當 manager 出現錯誤後,按 Exit 按鈕會執行 reset_update 腳本。
|
||||
* Added ability to execute reset_update.sh when press "Exit" button once manager returned errors.
|
||||
|
||||
dragonpilot 0.7.7.3
|
||||
========================
|
||||
* 修正方向盤監控。
|
||||
* Fixed steering monitor timer param.
|
||||
* 修正行駛時關閉畫面導致當機的錯誤。(感謝 @salmankhan, @stevej99, @bobbydough 回報)
|
||||
* Fixed screen frozen issue when "screen off while driving" toggle is enabled. (Thanks to @salmankhan, @stevej99, @bobbydough)
|
||||
* 加回 Dev Mini UI 開關。(感謝 @Ninjaa 建議)
|
||||
* Re-added Dev Mini UI. (Thanks to @Ninjaa)
|
||||
* 新增 (dp_reset_live_parameters_on_start) 每次發車重設 LiveParameters 值。(感謝 @eisenheim)
|
||||
* Added ability (dp_reset_live_param_on_start) to reset LiveParameters on each start. (Thanks @eisenheim)
|
||||
* 修正同時開啟 dp_toyota_zss 和 dp_lqr 產生的錯誤。(感謝 @bobbydough)
|
||||
* Fixed error cuased by enabling both dp_toyota_zss and dp_lqr at the same time. (Thanks to @bobbydough)
|
||||
* 新增 (dp_gpxd) 將 GPS 軌跡導出至 GPX 格式 (/sdcard/gpx_logs/)的功能。 (感謝 @mageymoo1)
|
||||
* Added ability (dp_gpxd) to export GPS track into GPX files (/sdcard/gpx_logs/). (Thanks to @mageymoo1)
|
||||
* 使用德國的車道寬度估算值。 (感謝 @arne182)
|
||||
* Used lane width estimate value from Germany. (Thanks to @arne182)
|
||||
|
||||
dragonpilot 0.7.7.2
|
||||
========================
|
||||
* 加入 d_poly offset。 (感謝 @ShaneSmiskol)
|
||||
* Added d_poly offset. (Thanks to @ShaneSmiskol)
|
||||
* 加入 ZSS 支援。(感謝 @bobbydough, @WilliamPrius 建議, @bobbydough 測試)
|
||||
* Added ZSS support. (Thanks to @bobbydough, @WilliamPrius for recommendation, @bobbydough for testing)
|
||||
* 加入錯誤記錄至 /sdcard/crash_logs/ (感謝 @ShaneSmiskol 提供代碼)
|
||||
* Added error logs to /sdcard/crash_logs/ (Special Thanks to @ShaneSmiskol)
|
||||
* 加入 LQR 控制器開關進設定畫面。
|
||||
* Added LQR Controller toggle to settings.
|
||||
|
||||
dragonpilot 0.7.7.1
|
||||
========================
|
||||
* 加入 C2 風扇靜音模式。(感謝 @dingliangxue)
|
||||
* Added C2 quiet fan mode. (Thanks to @dingliangxue)
|
||||
* 加入「輔助換道最低啟動速度」、「自動換道最低啟動速度」設定。
|
||||
* Added "Assisted Lane Change Min Engage Speed" and "Auto Lane Change Min Engage Speed" settings.
|
||||
* 加入回調校介面。(感謝 @Kent)
|
||||
* Re-added Dev UI. (Thanks to @Kent)
|
||||
* 加入 "dp_lqr" 設定來強制使用 RAV4 的 lqr 調校。(感謝 @eisenheim)
|
||||
* Added "dp_lqr" setting to force enable lqr tuning from RAV4. (Thanks to eisenheim)
|
||||
|
||||
dragonpilot 0.7.7.0
|
||||
========================
|
||||
* 基於最新 openpilot 0.7.7 devel.
|
||||
* Based on latest openpilot 0.7.7 devel.
|
||||
* 當 Manager 出現錯誤時,顯示 IP 位置。(感謝 @dingliangxue)
|
||||
* When Manager failed, display IP address. (Thanks to @dingliangxue)
|
||||
* 加回 sr learner 開關。
|
||||
* Re-added sr learner toggle.
|
||||
* 加回 加速模式 開關。
|
||||
* Re-added Accel Profile toggle.
|
||||
* Toyota 加入改寫最低巡航速度功能。(感謝 @Mojo)
|
||||
* Added Toyota to override lowerest cruise speed. (Thanks to @Mojo)
|
||||
* 介面加入盲點偵測顯示。(感謝 @wabes)
|
||||
* Added BSM indicator to UI. (Thanks to @wabes)
|
||||
* 加回彎道減速功能。(感謝 @Mojo)
|
||||
* re-added Slow On Curve functionality. (Thanks to @Mojo)
|
||||
|
||||
dragonpilot 0.7.6.2
|
||||
========================
|
||||
* 修正無法正確關閉駕駛監控的問題。
|
||||
* Fixed unable to properly turn off driver monitor issue.
|
||||
|
||||
dragonpilot 0.7.6.1
|
||||
========================
|
||||
* 基於最新 openpilot 0.7.6.1 devel.
|
||||
* Based on latest openpilot 0.7.6.1 devel.
|
||||
* 優化並整合 dp 服務。 (所有的設定檔已改名,請重新設定所有的功能)
|
||||
* Optimized and integrated several dp services. (Settings have been renamed, please re-config all settings)
|
||||
* 完全關閉 steer ratio learner。
|
||||
* Completely disabled steer ratio learner.
|
||||
* 移除「加速模式」。
|
||||
* Removed Accel Profile.
|
||||
* 加入本田皓影混電版指紋v1。(感謝 @劉駿)
|
||||
* Added Honda Breeze Hybrid FPv1. (Thanks to @劉駿)
|
||||
* 加入台灣版 Toyota Prius 4.5 指紋v1。(感謝 @jeekid)
|
||||
* Added Taiwan Toyota Prius 4.5 FPv1. (Thanks to @jeekid)
|
||||
|
||||
dragonpilot 0.7.5.4
|
||||
========================
|
||||
* Dynamic Follow 更新模型。(感謝 @ShaneSmiskol 提供代碼、 @cgw1968 測試)
|
||||
* Updated Dynamic Follow model. (Special Thanks to @ShaneSmiskol for the feature and @cgw1968 for testing)
|
||||
|
||||
dragonpilot 0.7.5.3
|
||||
========================
|
||||
* Dynamic Follow 更新至 ShaneSmiskol:stock_additions 0.7.5 版。(感謝 @ShaneSmiskol 提供代碼、 @Wei 測試)
|
||||
* Updated Dynamic Follow to ShaneSmiskol:stock_additions 0.7.5. (Special Thanks to @ShaneSmiskol for the feature and @Wei for testing)
|
||||
* 優化 Lexus GSH 轉向。(感謝 @簡銘佑 測試)
|
||||
* Optimize Lexus GSH steering. (Thanks to @簡銘佑)
|
||||
* C2 支援自動關機「DragonAutoShutdownAt」參數。(感謝 @cgw1968 建議)
|
||||
* C2 to support auto shutdown "DragonAutoShutDownAt" param. (Thanks to @cgw1968)
|
||||
* 修正出現「pedalPressed」的錯誤。(感謝 @Wei 回報)
|
||||
* Fixed issue showing "pedalPressed" error. (Thanks to @Wei)
|
||||
* 將剎車狀熊顯示於 dp 資訊欄。
|
||||
* Added brake indicator to dp infobar.
|
||||
* 修正「溫度監控」燈示。
|
||||
* Fixed "Temp monitor" indicator.
|
||||
* 加入「方向燈取消控制」延遲控制設。(感謝 @wabes 建議)
|
||||
* Added delay config to "Disable Lat Control on Blinker". (Thanks to @wabes)
|
||||
* 加入巴西版 2020 Corolla Hybrid 指紋v2。(感謝 @berno22 提供)
|
||||
* Added Brazil 2020 Corolla Hybrid FPv2. (Thanks to @berno22)
|
||||
|
||||
dragonpilot 0.7.5.2
|
||||
========================
|
||||
* 加入對 VW MQB/PQ 的支援。(感謝 @dingliangxue 移植)
|
||||
* Added support to VW MQB/PQ platform. (Thanks to @dingliangxue)
|
||||
* 修改成 3 小時後停止供電。(感謝 @Wei 建議)
|
||||
* Updated to stop charging after 3 hrs. (Thanks to @Wei)
|
||||
* 移除行車記錄下的「碰撞偵測」功能。
|
||||
* Removed Impact Detection in Dashcam.
|
||||
* 修正開啟「Noctua 風扇」模式導致的錯誤。(感謝 @阿濤 回報)
|
||||
* Fixed a bug caused by enabling "Noctua Mod". (Thanks to @阿濤)
|
||||
* 修正「位智模式」無法顯示警示的問題。(感謝 @axandres 回報)
|
||||
* Fixed alert issue in waze mode. (Thanks to @axandres)
|
||||
* 修正無法顯示更新中圖示的問題。
|
||||
* Fixed unable to display "UPDATING" icon issue.
|
||||
* 加入「允許多次自動換道」功能。(感謝 @阿濤 建議)
|
||||
* Added "Allow Continuous Auto Lane Change" Toggle. (Thanks to @阿濤)
|
||||
* 修正開機後設定頁面有時會錯誤的問題。(感謝 @salmankhan、@Wei 回報)
|
||||
* Fixed setting page crash issue. (Thanks to @salmankhan, @Wei)
|
||||
* 修正熄火後一直出現更新訊息的錯誤。(感謝 @Sky Chang 回報)
|
||||
* Fixed issue that keep showing update prompt. (Thanks to @Sky Chang)
|
||||
|
||||
dragonpilot 0.7.5.1
|
||||
========================
|
||||
* 修正因同時使用「社群功能」和「自定車型」造成的加減速問題。(特別感謝 @Wei、@Sky Chang、@Han9365、@鄧育林 的測試以及回報。)
|
||||
* Fixed acceleration issue caused by used of both "Community Maintain Feature" and "Custom Car Model". (Special Thanks to @Wei, @Sky Chang, @Han9365, @鄧育林)
|
||||
* 新增 DragonMaxSpeedLimit 設定值 (mph),當如果車速高於此值 op 將會停止操控。(感謝 @Anthony 建議)
|
||||
* Added DragonMaxSpeedLimit parameter (mph), op will stop controlling when car speed is high than the value. (Thanks to @Anthony)
|
||||
* 更新 appd 使用 cnpmjs 來下載 APKs。
|
||||
* Updated appd to use cnpmjs to download APKs.
|
||||
* 修正更新服務。(感謝 @Wei)
|
||||
* Fixed Update Service. (Thanks to @Wei)
|
||||
* 新增加拿大版 2018 Toyota Sienna LTD 指紋(v2)。(感謝 明峰 提供)
|
||||
* Added Canada 2018 Toyota Sienna LTD fingerprint (v2). (Thanks to 明峰)
|
||||
* 新增「通過移動網路上傳」開關
|
||||
* Added Upload Over Mobile Network toggle.
|
||||
* 新增「通過熱點上傳」開關
|
||||
* Added Upload Over Hotspot toggle.
|
||||
* 新增加拿大版 2018 Toyota Sienna LTD 指紋(v1)。(感謝 明峰 提供)
|
||||
* Added Canada 2018 Toyota Sienna LTD fingerprint (v1). (Thanks to 明峰)
|
||||
* 新增大陸版 Volkswagen Golf GTI 指紋 (v1)。(感謝 easyeiji 提供)
|
||||
* Added China Volkswagen Golf GTI fingerprint (v1). (Thanks to easyeiji)
|
||||
|
||||
dragonpilot 0.7.5.0
|
||||
========================
|
||||
* 基於最新 openpilot 0.7.5 devel-staging.
|
||||
* Based on latest openpilot 0.7.5 devel-staging.
|
||||
* 更新 dp 圖示 (特別感謝 @wabes 的設計與提供)。
|
||||
* Updated dp logo, special thanks to @wabes for the design.
|
||||
* 簡/繁中文版和 i18n 整合成為單一版本。
|
||||
* Merged zhs/zht/i18n versions into one.
|
||||
* 新增大陸版 CAMRY HYBRID 指紋v2。(感謝 @杜子腾)
|
||||
* Added China Camery Hybrid FPv2. (Thanks to @杜子腾)
|
||||
* 新增台灣版 Altis HYBRID 指紋v1。(感謝 @Fish)
|
||||
* Added Taiwan Altis Hybrid FPv1. (Thanks to @Fish)
|
||||
* 新增行駛時關閉畫面功能。
|
||||
* Added Screen off while driving feature.
|
||||
* 新增倒車時關閉畫面功能。
|
||||
* Added Screen off while reversing feature.
|
||||
* 新增駕駛介面加入「加速模式」切換鈕。
|
||||
* Added acceleration profile toggle onto driving UI.
|
||||
* 新增自定車型功能,取代指紋暫存功能。
|
||||
* Replaced fingerprint cache with custom car model selector.
|
||||
* 新增可調亮度。
|
||||
* Added Brightness changer.
|
||||
* 新增部分德語支持。(特別感謝 @arne182 提供)
|
||||
* Added partial de_DE language support (Thanks to @arne182)
|
||||
* 新增停車碰撞偵測記錄功能。
|
||||
* Added off road impact detection to dashcam.
|
||||
|
||||
2020-05-06
|
||||
========================
|
||||
* 更新 dp 圖示 (特別感謝 @wabes 的設計與提供)。
|
||||
* 中文版整合進 i18n 版。
|
||||
* 刪除指紋暫存功能。
|
||||
* 新增 CAMERY HIBRID 指紋。(感謝 @杜子腾)
|
||||
* 新增行駛時關閉畫面功能。
|
||||
* 新增倒車時關閉畫面功能。
|
||||
* 新增駕駛介面加入「加速模式」切換鈕。
|
||||
* 新增自定義車型。
|
||||
|
||||
2020-04-16
|
||||
========================
|
||||
* [DEVEL] 加入台灣版 2016 Lexus IS200t 指紋。(感謝 Philip / Cody Dai)
|
||||
* [DEVEL] 加入台灣版 2016 Toyota Prius 4.5 代指紋。(感謝 Philip)
|
||||
* [DEVEL] 加入台灣版 201x Toyota RAV4 4WD 指紋。(感謝 Philip)
|
||||
* [DEVEL] 加入台灣版 2020 Toyota Auris w/ LTA 指紋。(感謝 Philip)
|
||||
* [DEVEL] 修正 commIssue 錯誤。(感謝 Kent 協助)
|
||||
|
||||
2020-04-13
|
||||
========================
|
||||
* [DEVEL] 加入可調整 Toyota Sng 起步反應值 (DragonToyotaSngResponse)。 (特別感謝 @Wei 提供 PR)
|
||||
* [DEVEL] 駕駛介面加入「動態調整車距」按鈕。(感謝 @cgw1968-5779 建議)
|
||||
* [DEVEL] 更新 update script。(感謝 深鯨希西 回報)
|
||||
|
||||
2020-04-10
|
||||
========================
|
||||
* [DEVEL] 更新 panda 至最新的 comma:master 分支。
|
||||
* [DEVEL] 移除所有的第三方應用改為自動下載。
|
||||
* [DEVEL] 移除「啟用原廠 DSU 模式」、「安全帶檢查」、「車門檢查」開關。
|
||||
|
||||
2020-03-31
|
||||
========================
|
||||
* [DEVEL] 更新至 2020-03-31 testing 分支。
|
||||
|
||||
2020-03-27
|
||||
========================
|
||||
* [DEVEL] 更新至最新的 testing 分支:
|
||||
* 加入波蘭版 2015 Lexus NX200T 支援。(感謝 wabes 提供)
|
||||
* 調整「啟用原廠 DSU 模式」為不再需要 AHB 。(Enable Stock DSU Mode no longer requires "AHB" toggle)
|
||||
* 加入「安全帶檢查」、「車門檢查」、「檔位檢查」、「溫度檢查」開關。
|
||||
* 加入曲率學習功能 - Curvature Learner 。(感謝 zorrobyte 提供)
|
||||
* 加入大陸版 2018 Toyota Highlander 支援。(感謝 toyboxZ 提供)
|
||||
* 加入大陸版 2018 Toyota Camry 2.0 支援。(感謝 Rming 提供)
|
||||
* 加入韓文支持。(感謝 crwusiz 提供)
|
||||
* 調整 OFFROAD 主頁翻譯將 "dragonpilot" 改回 "openpilot"。
|
||||
|
||||
2020-03-22
|
||||
========================
|
||||
* [DEVEL] 更新至最新的 testing 分支。
|
||||
|
||||
2020-03-17
|
||||
========================
|
||||
* [DEVEL] 更新至最新的 testing 分支 (commaai:devel-staging 0.7.4)。
|
||||
* [DEVEL] 加入動態調整車距功能。(特別感謝 @ShaneSmiskol 提供 PR)
|
||||
|
||||
2020-03-14
|
||||
========================
|
||||
* [DEVEL] 更新 pt-Br (葡萄牙語) 翻譯。(感謝 berno22 提供)
|
||||
* [DEVEL] 加入自動關機開關。(感謝 Rzxd 建議)
|
||||
* [DEVEL] 調高 Toyota 扭力容錯值。
|
||||
* [DEVEL] 優化讀取 dp 設定值。
|
||||
* [DEVEL] 加入 2019 手動 Civic 指紋。感謝 (AlexNoop 提供)
|
||||
* [DEVEL] dp 功能加入對 Subaru 車系的支援。
|
||||
|
||||
2020-03-06
|
||||
========================
|
||||
* [DEVEL] 加入葡萄牙語支持。(感謝 berno22 提供)
|
||||
* [DEVEL] 加入大陸 2018 Camry、2020 RAV4 指紋。(感謝 笨木匠 提供)
|
||||
* [DEVEL] 建立 devel-i18n 取代 devel-en。
|
||||
* [DEVEL] devel-en is deprecated, please switch to devel-i18n instead.
|
||||
|
||||
2020-03-04
|
||||
========================
|
||||
* [DEVEL] 加入顯示駕駛監控畫面。
|
||||
* [DEVEL] 加入加速模式選項。(特別感謝 @arne182, @cgw1968-5779 提供 PR)
|
||||
* [DEVEL] 修正 shutdownd 在 comma two 可能會不正常關機的錯誤。(感謝 @Wei, @Rzxd 回報)
|
||||
|
||||
2020-02-25
|
||||
========================
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.7.3)。
|
||||
|
||||
2020-02-21
|
||||
========================
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.7.3)。
|
||||
|
||||
2020-02-14
|
||||
========================
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.7.2)。
|
||||
* [DEVEL] 修正錯誤。
|
||||
|
||||
2020-02-08
|
||||
========================
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.7.2)。
|
||||
* [DEVEL] dp 功能加入對現代 (Hyundai) 車系的支援。
|
||||
* [DEVEL] 加入神盾測速照相自動啟動的開關。
|
||||
* [DEVEL] 更新高德地圖至 v4.5.0.600053。
|
||||
* [DEVEL] 使用 0.6.6 版的更新系統。
|
||||
* [DEVEL] 修正急剎問題。(感謝 kumar 提供)
|
||||
|
||||
2020-01-31
|
||||
========================
|
||||
* [DEVEL] 移除行車介面電量、溫度顯示,(修正畫面當機、黑屏問題)
|
||||
|
||||
2020-01-29
|
||||
========================
|
||||
* [DEVEL] 修正行車介面錯誤。(感謝 深鲸希西 測試;eisenheim、HeatNation 反應)
|
||||
|
||||
2020-01-23
|
||||
========================
|
||||
* [DEVEL] 加入 Steer Ratio Learner 關閉。(感謝 eisenheim 建議)
|
||||
* [DEVEL] 行車介面加入電量、溫度。(感謝 eisenheim 建議)
|
||||
* [DEVEL] 優化 appd。
|
||||
|
||||
2020-01-19
|
||||
========================
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.7.1)。
|
||||
* [DEVEL] 調整 appd 和 ALC 邏輯。
|
||||
|
||||
2020-01-14
|
||||
========================
|
||||
* [DEVEL] 加入開機啟動個人熱點。(感謝 eisenheim 建議)
|
||||
|
||||
2020-01-08
|
||||
========================
|
||||
* [DEVEL] 加入大陸版 2018 Lexus RX300 支援。(感謝 cafe 提供)
|
||||
* [DEVEL] 加入 DragonBTG 設定。(感謝 CloudJ、低調哥、歐姓Altis車主 提供)
|
||||
|
||||
2019-12-31
|
||||
========================
|
||||
* [DEVEL-ZHS] 加回第三方應用。
|
||||
|
||||
2019-12-29
|
||||
========================
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.7.0)。
|
||||
* [DEVEL] 輔助/自動變道改為可調整參數 (進階用戶)。(DragonAssistedLCMinMPH、DragonAutoLCMinMPH、DragonAutoLCDelay)
|
||||
* [DEVEL-ZHS] 修正無法運行第三方應用錯誤。(感謝 深鲸希西 反應)
|
||||
|
||||
2019-12-18
|
||||
========================
|
||||
* [DEVEL] 修正自動換道邏輯。
|
||||
* [DEVEL] 更新 offroad 翻譯。
|
||||
* [DEVEL] 錯誤修正。
|
||||
* [DEVEL] 移除美版 2017 Civic Hatchback 指紋。(與其它車型衝突)
|
||||
|
||||
2019-12-17
|
||||
========================
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.7.0)。
|
||||
* [DEVEL] 加入輔助換道開關。(24mph / 40kph 以上)
|
||||
* [DEVEL] 加入自動換道開關。(40mph / 65kph 以上)
|
||||
* [DEVEL] 加入大陸版 2019 雷凌汽油版指紋。 (感謝 Shell 提供)
|
||||
* [DEVEL] 加入大陸版 2019 卡羅拉汽油版指紋。 (感謝 Shell 提供)
|
||||
* [DEVEL] 加入美版 2017 Civic Hatchback 指紋。(感謝 CFranHonda 提供)
|
||||
|
||||
2019-12-10
|
||||
========================
|
||||
* [DEVEL] 加入位智車機模式。 (Waze Mode)
|
||||
|
||||
2019-11-21
|
||||
========================
|
||||
* [DEVEL] 修正 offroad 翻譯。(感謝 鄧育林 回報)
|
||||
* [DEVEL] 調整前車靜止移動偵測參數。
|
||||
* [DEVEL] 前車靜止移動偵測可在未啟用 dp 時運作。
|
||||
|
||||
2019-11-18
|
||||
========================
|
||||
* [DEVEL] 修正 offroad 翻譯。(感謝 Cody、鄧育林 回報)
|
||||
|
||||
2019-11-18
|
||||
========================
|
||||
* [DEVEL] 修正 frame 翻譯。
|
||||
|
||||
2019-11-15
|
||||
========================
|
||||
* [DEVEL] 修正不會充電的錯誤。 (感謝 袁昊 反應)
|
||||
|
||||
2019-11-15
|
||||
========================
|
||||
* [DEVEL] 修正充電控制。 (感謝 KT 反應)
|
||||
* [DEVEL] 更新 frame 翻譯,改為多語言版。 (感謝 深鲸希西、shaoching885、鄧育林 反應)
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.6.6)。
|
||||
|
||||
2019-11-12
|
||||
========================
|
||||
* [DEVEL] 只顯示電量文字 (注意:有時不會更新,需要拔插 USB 線)
|
||||
* [DEVEL] 自動偵測並鎖定硬體 (EON / UNO)。
|
||||
|
||||
2019-11-12
|
||||
========================
|
||||
* [DEVEL] 加入鎖定硬體 (EON / UNO) 的程式碼。
|
||||
|
||||
2019-11-11
|
||||
========================
|
||||
* [DEVEL] 更新高德地圖至 v4.3.0.600310 R2098NSLAE
|
||||
* [DEVEL] 更新 MiXplorer 至 v6.40.3
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.6.6)。
|
||||
* [DEVEL] 前車靜止移動偵測加入偵測警示。
|
||||
|
||||
2019-11-07
|
||||
========================
|
||||
* [DEVEL] 讓 Bosch 系統顯示三角。 (感謝 ching885 回報)
|
||||
* [DEVEL] 更新 offroad 多語言版簡體中文翻譯 (感謝 Rming 提供)
|
||||
|
||||
2019-11-06
|
||||
========================
|
||||
* [DEVEL] 修正 0.6.6 appd 和 dashcamd 錯誤。 (感謝 鄧育林 回報)
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.6.6)。
|
||||
|
||||
2019-11-05
|
||||
========================
|
||||
* [DEVEL] 加入台灣 Lexus 2017 GS450h 支援。 (感謝 簡銘佑 提供指紋)
|
||||
|
||||
2019-11-01
|
||||
========================
|
||||
* [DEVEL] 新增神盾測速照相。 (感謝 Sky Chang 和 Wei Yi Chen)
|
||||
* [DEVEL] 修正 offroad 翻譯。 (感謝 Leo Hsieh)
|
||||
|
||||
2019-11-01
|
||||
========================
|
||||
* [DEVEL] 移除 Miui 字型,縮小 dp 使用空間。
|
||||
* [DEVEL] 更新 offroad 為多語言版
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.6.5)。
|
||||
|
||||
2019-10-29
|
||||
========================
|
||||
* [DEVEL] 加入 SnG 補丁。(感謝 楊雅智)
|
||||
|
||||
2019-10-28
|
||||
========================
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.6.5)。
|
||||
* [DEVEL] 調整 dragon_allow_gas 邏輯 (請回報任何問題,需更新 Panda 韌體)
|
||||
|
||||
2019-10-18
|
||||
========================
|
||||
* [DEVEL] 加入前車靜止移動偵測。(測試版,感謝 ucolchen)
|
||||
* [DEVEL] 移除強迫網路連線提示。(感謝 Shell)
|
||||
* [DEVEL] 修正 allow_gas 功能。
|
||||
|
||||
2019-10-18
|
||||
========================
|
||||
* [DEVEL] 加入彎道減速功能開關。
|
||||
* [DEVEL] 強迫使用 dp 版 Panda 韌體。
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.6.5)。
|
||||
|
||||
2019-10-17
|
||||
========================
|
||||
* [DEVEL] 加入「車型」顯示於 dp 設定畫面。
|
||||
* [DEVEL] 修正充電控制讀取預設值的錯誤。
|
||||
* [DEVEL] 修正無法顯示更新記錄的錯誤。
|
||||
|
||||
2019-10-16
|
||||
========================
|
||||
* [DEVEL] 刷新 Panda 韌體按鈕將會自動重啟 EON。(感謝 鄧育林 建議)
|
||||
* [DEVEL] 下載更新記錄時使用 "no-cache" 標頭。
|
||||
* [DEVEL] 更新高德地圖至 v4.3.0
|
||||
* [DEVEL] 刪除 bs (Branch Switcher)
|
||||
|
||||
2019-10-14
|
||||
========================
|
||||
* [DEVEL] 啟用自動更新功能。(感謝 鄧育林 提供)
|
||||
* [DEVEL] 清除不再使用的 dp params。
|
||||
* [DEVEL] 加入數字電量指示。(感謝 鄧育林 建議)
|
||||
* [DEVEL] 加入刷新 Panda 韌體按鈕。
|
||||
|
||||
2019-10-11
|
||||
========================
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.6.5)。
|
||||
* [DEVEL] 加入台灣 2019 RAV4 汽油版指紋。 (感謝 Max Duan / CloudJ 提供)
|
||||
|
||||
2019-10-09
|
||||
========================
|
||||
* [DEVEL] 加入當 LatCtrl 關閉時,畫面顯示提示訊息。
|
||||
|
||||
2019-10-08
|
||||
========================
|
||||
* [DEVEL] 加回駕駛監控開關。
|
||||
* [DEVEL] 加入 bs (branch switcher) 程式。
|
||||
|
||||
2019-10-07
|
||||
========================
|
||||
* [DEVEL] 加入台灣版 2019 RAV4H 油電版指紋。(感謝 Max Duan 提供)
|
||||
|
||||
2019-10-05
|
||||
========================
|
||||
* [DEVEL] 移除 curvature learner: 轉角明顯比原廠小。
|
||||
* [DEVEL] 更新至最新的 commaai:devel (0.6.4)。
|
||||
|
||||
2019-09-30
|
||||
========================
|
||||
* [DEVEL] 更新 curvature learner 版本至 v4。
|
||||
* [DEVEL] Lexus ISH 使用更精確的 EPS Steering Angle Sensor
|
||||
|
||||
2019-09-27
|
||||
========================
|
||||
* [DEVEL] 加入 Zorrobyte 的 curvature learner (https://github.com/zorrobyte/openpilot)
|
||||
* [DEVEL] 加入可開關駕駛監控的程式碼。
|
||||
* [DEVEL] 取消當 steering 出現錯誤時,自動切斷方向控制 2 秒的機制。
|
||||
* [DEVEL] 讓行車介面的「方向盤」/「轉彎」圖示半透明化。
|
||||
|
||||
2019-09-26
|
||||
========================
|
||||
* [DEVEL] 修正當「啟用記錄服務」關閉時,make 會有問題的錯誤。 (感謝 shaoching885 和 afa 回報)
|
||||
|
||||
2019-09-24
|
||||
========================
|
||||
* [DEVEL] 行車介面加入可開關的「前車」、「路線」、「車道」設定。
|
||||
* [DEVEL] 行車介面加入可開關的「方向燈號」提示。 (感謝 CloudJ 建議,程式碼來源: https://github.com/kegman/openpilot)
|
||||
|
||||
2019-09-23
|
||||
========================
|
||||
* [DEVEL] 優化讀取 params 的次數。
|
||||
* [DEVEL] 加入可開關的車道偏移警示。
|
||||
* [DEVEL] 修正充電控制邏輯。
|
||||
* [DEVEL] 加入台灣 Prius 4.5 指紋。 (感謝 Lin Hsin Hung 提供)
|
||||
|
||||
2019-09-20
|
||||
========================
|
||||
* [DEVEL] 加入充電控制功能。 (感謝 loveloveses 和 KT 建議)
|
||||
|
||||
2019-09-16
|
||||
========================
|
||||
* [DEVEL] 加入台灣 CT200h 指紋。 (感謝 CloudJ 提供)
|
||||
* [DEVEL] 加入美版 CT200h 移植。 (感謝 thomaspich 提供)
|
||||
|
||||
2019-09-13
|
||||
========================
|
||||
* [DEVEL] 行車介面加入可開關的「速度顯示」設定。
|
||||
|
||||
2019-09-09
|
||||
========================
|
||||
* [DEVEL] 加入 GreyPanda 模式。
|
||||
|
||||
2019-08-28
|
||||
========================
|
||||
* [DEVEL] 加入可調警示音量。
|
||||
|
||||
2019-08-27
|
||||
========================
|
||||
* [DEVEL] 自動關機改為可調時長。
|
||||
37
CONTRIBUTORS.md
Normal file
37
CONTRIBUTORS.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# CONTRIBUTORS
|
||||
|
||||
Due to the way we manage the source code, it is not possible to see all the contributors' info, hence we create a list here.
|
||||
If you have contributed to DP project before and your name is not listed here, feel free to send us a PR to update this!
|
||||
|
||||
### TEAM
|
||||
Name | github | Role
|
||||
------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------
|
||||
cafe | [cafe](https://github.com/coffice12) | Resource Provider
|
||||
cgw1968 | [cgw1968](https://github.com/cgw1968-5779) | C2/C3 Toyota Beta Tester
|
||||
kumar | [rav4kumar](https://github.com/rav4kumar) | Release Maintainer
|
||||
loveloveses | [loveloveses](https://github.com/loveloveses) | Wiki Maintainer
|
||||
Rick Lan | [efinilan](https://github.com/efinilan) | Release Maintainer
|
||||
Stupefacient | [Stupefacient](https://github.com/Stupefacient) | C2/C3 Toyota Beta Tester
|
||||
|
||||
### CONTRIBUTORS
|
||||
Name | github
|
||||
------------------------------------------------------------ | ------------------------------------------------------------
|
||||
andy741217 | [andy741217](https://github.com/andy741217)
|
||||
Arne Schwarck | [arne182](https://github.com/arne182)
|
||||
berno22 | [berno22](https://github.com/berno22)
|
||||
Bobbydough | [Bobbydough](https://github.com/bobbydough)
|
||||
Curtis Jenkins | [actuallylemoncurd](https://github.com/actuallylemoncurd)
|
||||
DFyffe | [donfyffe](https://github.com/donfyffe)
|
||||
dinglx | [dingliangxue](https://github.com/dingliangxue)
|
||||
eyezenheim | [eyezenheim](https://github.com/eyezenheim)
|
||||
kegman | [kegman](https://github.com/kegman)
|
||||
lijunhao731 | [lijunhao731](https://github.com/lijunhao731)
|
||||
lirudy | [lirudy](https://github.com/lirudy)
|
||||
LOVEChen | [LOVEChen](https://github.com/LOVEChen)
|
||||
menwenliang | [menwenliang](https://github.com/menwenliang)
|
||||
move-fast | [menwenliang](https://github.com/move-fast)
|
||||
Nelson Chen | [nelsonjchen](https://github.com/nelsonjchen)
|
||||
rming | [Rming](https://github.com/rming)
|
||||
sebastian4k | [sebastian4k](https://github.com/sebastian4k)
|
||||
Shane Smiskol | [sshane](https://github.com/sshane)
|
||||
toyboxZ | [toyboxZ](https://github.com/toyboxZ)
|
||||
25
HOWTO-ONEPLUS.md
Normal file
25
HOWTO-ONEPLUS.md
Normal file
@@ -0,0 +1,25 @@
|
||||
How to install on Oneplus 3t?
|
||||
------
|
||||
1. clone dragonpilot to /data/ and make sure it's named openpilot:
|
||||
(手動安裝切換至 dp)
|
||||
```
|
||||
cd /data/ && rm -fr openpilot ; git clone https://github.com/dragonpilot-community/dragonpilot.git openpilot -b 0.8.8
|
||||
```
|
||||
|
||||
2. run command:
|
||||
(在 ssh 畫面下,輸入)
|
||||
```
|
||||
cd /data/openpilot/scripts/ && ./oneplus_update_neos.sh
|
||||
```
|
||||
|
||||
3. Let it download and complete it update, after a couple of reboot, your screen will then stay in fastboot mode.
|
||||
(等待下載並讓它重新開機,沒錯誤的話會進入 Android 機器人更新畫面,等自動重新開機)
|
||||
|
||||
4. In fastboot mode, select use volume button to select to `Recovery mode` then press power button.
|
||||
(在 fastboot 模式,用音量鍵上下選到 Recovery mode 再按下電源鍵)
|
||||
|
||||
5. In Recovery mode, tap `apply update` -> `Choose from emulated` -> `0/` -> `update.zip` -> `Reboot system now`
|
||||
(在 Recovery mode,點選 `apply update` -> `Choose from emulated` -> `0/` -> `update.zip` -> `Reboot system now`)
|
||||
|
||||
6. You should be able to boot into openpilot, if touch screen is not working, try to reboot again.
|
||||
(你現在應該可以進入 openpilot 畫面,如果點擊畫面沒有反應,請再重新開機一次)
|
||||
18
HOWTO-Translate.md
Normal file
18
HOWTO-Translate.md
Normal file
@@ -0,0 +1,18 @@
|
||||
HOW TO Translate dragonpilot
|
||||
--
|
||||
|
||||
If you would like to help to translate dragonpilot into your native language, please:
|
||||
1. Contact dragonpilot team to generate language files for translation.
|
||||
|
||||
2. Start translation, there will be 2 files: (locale = your language code)
|
||||
* <openpilot>/selfdrive/assets/locales/**locale**/LC_MESSAGES/events.po
|
||||
* This is for alerts messages. (e.g. on road warning messages)
|
||||
* <openpilot>/selfdrive/ui/translations/**locale**.ts
|
||||
* This is for UI. (e.g. settings pages)
|
||||
|
||||
We recommended to use a proper editor such as TextMate (mac) / notepad++ (win) / Intellij pyCharm.
|
||||
|
||||
|
||||
3. Submit a PR for your translation.
|
||||
|
||||
4. dragonpilot team will review your PR and add it in the next release.
|
||||
10
JETSON.md
Normal file
10
JETSON.md
Normal file
@@ -0,0 +1,10 @@
|
||||
set_core_affinity
|
||||
------
|
||||
Jetson Xavier NX has 6 cores running at 1.9 GHz, here is what I've defined
|
||||
|
||||
0 = (not specified)
|
||||
1 = plannerd / radard
|
||||
2 = boardd
|
||||
3 = controlsd
|
||||
4 = camerad
|
||||
5 = modeld
|
||||
1
Jenkinsfile
vendored
1
Jenkinsfile
vendored
@@ -49,7 +49,6 @@ def phone_steps(String device_type, steps) {
|
||||
pipeline {
|
||||
agent none
|
||||
environment {
|
||||
COMMA_JWT = credentials('athena-test-jwt')
|
||||
TEST_DIR = "/data/openpilot"
|
||||
SOURCE_DIR = "/data/openpilot_source/"
|
||||
}
|
||||
|
||||
12
README.md
12
README.md
@@ -67,8 +67,8 @@ Supported Cars
|
||||
| Acura | ILX 2016-19 | AcuraWatch Plus | openpilot | 25mph<sup>1</sup> | 25mph |
|
||||
| Acura | RDX 2016-18 | AcuraWatch Plus | openpilot | 25mph<sup>1</sup> | 12mph |
|
||||
| Acura | RDX 2019-21 | All | Stock | 0mph | 3mph |
|
||||
| Honda | Accord 2018-20 | All | Stock | 0mph | 3mph |
|
||||
| Honda | Accord Hybrid 2018-20 | All | Stock | 0mph | 3mph |
|
||||
| Honda | Accord 2018-21 | All | Stock | 0mph | 3mph |
|
||||
| Honda | Accord Hybrid 2018-21 | All | Stock | 0mph | 3mph |
|
||||
| Honda | Civic Hatchback 2017-21 | Honda Sensing | Stock | 0mph | 12mph |
|
||||
| Honda | Civic Coupe 2016-18 | Honda Sensing | openpilot | 0mph | 12mph |
|
||||
| Honda | Civic Coupe 2019-20 | All | Stock | 0mph | 2mph<sup>2</sup> |
|
||||
@@ -110,7 +110,7 @@ Supported Cars
|
||||
| Toyota | C-HR 2017-20 | All | Stock | 0mph | 0mph |
|
||||
| Toyota | C-HR Hybrid 2017-19 | All | Stock | 0mph | 0mph |
|
||||
| Toyota | Corolla 2017-19 | All | Stock<sup>3</sup>| 20mph<sup>1</sup> | 0mph |
|
||||
| Toyota | Corolla 2020-21 | All | openpilot | 0mph | 0mph |
|
||||
| Toyota | Corolla 2020-22 | All | openpilot | 0mph | 0mph |
|
||||
| Toyota | Corolla Hatchback 2019-21 | All | openpilot | 0mph | 0mph |
|
||||
| Toyota | Corolla Hybrid 2020-21 | All | openpilot | 0mph | 0mph |
|
||||
| Toyota | Highlander 2017-19 | All | Stock<sup>3</sup>| 0mph | 0mph |
|
||||
@@ -163,13 +163,16 @@ Community Maintained Cars and Features
|
||||
| Hyundai | Ioniq PHEV 2020 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
| Hyundai | Kona 2020 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
| Hyundai | Kona EV 2019 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
| Hyundai | Kona Hybrid 2020 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
| Hyundai | Santa Fe 2019-20 | All | Stock | 0mph | 0mph |
|
||||
| Hyundai | Sonata 2018-2019 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
| Hyundai | Sonata Hybrid 2021 | All | Stock | 0mph | 0mph |
|
||||
| Hyundai | Veloster 2019-20 | SCC + LKAS | Stock | 5mph | 0mph |
|
||||
| Jeep | Grand Cherokee 2016-18 | Adaptive Cruise | Stock | 0mph | 9mph |
|
||||
| Jeep | Grand Cherokee 2019-20 | Adaptive Cruise | Stock | 0mph | 39mph |
|
||||
| Kia | Forte 2018-2021 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
| Kia | Niro EV 2020 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
| Kia | Niro Hybrid 2021 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
| Kia | Niro PHEV 2019 | SCC + LKAS | Stock | 10mph | 32mph |
|
||||
| Kia | Optima 2017 | SCC + LKAS | Stock | 0mph | 32mph |
|
||||
| Kia | Optima 2019 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
@@ -177,6 +180,7 @@ Community Maintained Cars and Features
|
||||
| Kia | Sorento 2018-19 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
| Kia | Stinger 2018 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
| Kia | Ceed 2019 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
| Kia | Telluride 2020 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||
| Nissan | Altima 2019-20 | ProPILOT | Stock | 0mph | 0mph |
|
||||
| Nissan | Leaf 2018-20 | ProPILOT | Stock | 0mph | 0mph |
|
||||
| Nissan | Rogue 2018-20 | ProPILOT | Stock | 0mph | 0mph |
|
||||
@@ -184,7 +188,7 @@ Community Maintained Cars and Features
|
||||
| SEAT | Ateca 2018 | Driver Assistance | Stock | 0mph | 0mph |
|
||||
| SEAT | Leon 2014-2020 | Driver Assistance | Stock | 0mph | 0mph |
|
||||
| Škoda | Kodiaq 2018 | Driver Assistance | Stock | 0mph | 0mph |
|
||||
| Škoda | Octavia 2015, 2019 | Driver Assistance | Stock | 0mph | 0mph |
|
||||
| Škoda | Octavia 2015, 2018-19 | Driver Assistance | Stock | 0mph | 0mph |
|
||||
| Škoda | Octavia RS 2016 | Driver Assistance | Stock | 0mph | 0mph |
|
||||
| Škoda | Scala 2020 | Driver Assistance | Stock | 0mph | 0mph |
|
||||
| Škoda | Superb 2015-18 | Driver Assistance | Stock | 0mph | 0mph |
|
||||
|
||||
16
RELEASES.md
16
RELEASES.md
@@ -1,3 +1,19 @@
|
||||
Version 0.8.8 (2021-08-27)
|
||||
========================
|
||||
* New driving model with improved laneless performance
|
||||
* Trained on 5000+ hours of diverse driving data from 3000+ users in 40+ countries
|
||||
* Better anti-cheating methods during simulator training ensure the model hugs less when in laneless mode
|
||||
* All new desire ground-truthing stack makes the model better at lane changes
|
||||
* New driver monitoring model: improved performance on comma three
|
||||
* NEOS 18 for comma two: update packages
|
||||
* AGNOS 1.3 for comma three: fix display init at high temperatures
|
||||
* Improved auto-exposure on comma three
|
||||
* Honda Accord 2021 support thanks to csouers!
|
||||
* Honda Accord Hybrid 2021 support thanks to csouers!
|
||||
* Hyundai Kona Hybrid 2020 support thanks to haram-KONA!
|
||||
* Hyundai Sonata Hybrid 2021 support thanks to Matt-Wash-Burn!
|
||||
* Kia Niro Hybrid 2021 support thanks to tetious!
|
||||
|
||||
Version 0.8.7 (2021-07-31)
|
||||
========================
|
||||
* comma three support!
|
||||
|
||||
@@ -15,7 +15,7 @@ used safely** and openpilot is provided with no warranty of fitness for any purp
|
||||
openpilot is developed in good faith to be compliant with FMVSS requirements and to follow
|
||||
industry standards of safety for Level 2 Driver Assistance Systems. In particular, we observe
|
||||
ISO26262 guidelines, including those from [pertinent documents](https://www.nhtsa.gov/sites/nhtsa.dot.gov/files/documents/13498a_812_573_alcsystemreport.pdf)
|
||||
released by NHTSA. In addition, we impose strict coding guidelines (like [MISRA C : 2012](https://www.misra.org.uk/MISRAHome/MISRAC2012/tabid/196/Default.aspx))
|
||||
released by NHTSA. In addition, we impose strict coding guidelines (like [MISRA C : 2012](https://www.misra.org.uk/what-is-misra/))
|
||||
on parts of openpilot that are safety relevant. We also perform software-in-the-loop,
|
||||
hardware-in-the-loop and in-vehicle tests before each software release.
|
||||
|
||||
|
||||
57
SConstruct
57
SConstruct
@@ -7,6 +7,8 @@ import platform
|
||||
import numpy as np
|
||||
|
||||
TICI = os.path.isfile('/TICI')
|
||||
JETSON = os.path.isfile('/JETSON')
|
||||
|
||||
Decider('MD5-timestamp')
|
||||
|
||||
AddOption('--test',
|
||||
@@ -65,6 +67,10 @@ if arch == "aarch64" and TICI:
|
||||
|
||||
USE_WEBCAM = os.getenv("USE_WEBCAM") is not None
|
||||
|
||||
USE_MIPI = os.getenv("USE_MIPI") is not None
|
||||
if arch == "aarch64" and JETSON:
|
||||
arch = "jarch64"
|
||||
|
||||
lenv = {
|
||||
"PATH": os.environ['PATH'],
|
||||
}
|
||||
@@ -114,8 +120,19 @@ else:
|
||||
cflags = []
|
||||
cxxflags = []
|
||||
cpppath = []
|
||||
rpath = []
|
||||
|
||||
if arch == "Darwin":
|
||||
if arch == "jarch64":
|
||||
libpath = [
|
||||
"#phonelibs/libyuv/larch64/lib",
|
||||
"#selfdrive/common",
|
||||
"/usr/lib",
|
||||
"/usr/local/lib",
|
||||
]
|
||||
cflags = ["-DXNX", "-march=armv8.2-a"]
|
||||
cxxflags = ["-DXNX", "-march=armv8.2-a"]
|
||||
rpath += ["/usr/local/lib"]
|
||||
elif arch == "Darwin":
|
||||
yuv_dir = "mac" if real_arch != "arm64" else "mac_arm64"
|
||||
libpath = [
|
||||
f"#phonelibs/libyuv/{yuv_dir}/lib",
|
||||
@@ -143,8 +160,9 @@ else:
|
||||
"/usr/local/lib",
|
||||
]
|
||||
|
||||
rpath = [
|
||||
"phonelibs/snpe/x86_64-linux-clang",
|
||||
if arch != "jarch64":
|
||||
rpath += ["phonelibs/snpe/x86_64-linux-clang"]
|
||||
rpath += [
|
||||
"cereal",
|
||||
"selfdrive/common"
|
||||
]
|
||||
@@ -166,6 +184,10 @@ else:
|
||||
if arch != "Darwin":
|
||||
ldflags += ["-Wl,--as-needed"]
|
||||
|
||||
# Enable swaglog include in submodules
|
||||
cflags += ["-DSWAGLOG"]
|
||||
cxxflags += ["-DSWAGLOG"]
|
||||
|
||||
# change pythonpath to this
|
||||
lenv["PYTHONPATH"] = Dir("#").path
|
||||
|
||||
@@ -309,7 +331,7 @@ else:
|
||||
qt_dirs += [f"/usr/include/{real_arch}-linux-gnu/qt5/Qt{m}" for m in qt_modules]
|
||||
|
||||
qt_libs = [f"Qt5{m}" for m in qt_modules]
|
||||
if arch == "larch64":
|
||||
if arch == "larch64" or arch == "jarch64":
|
||||
qt_libs += ["GLESv2", "wayland-client"]
|
||||
elif arch != "Darwin":
|
||||
qt_libs += ["GL"]
|
||||
@@ -342,7 +364,19 @@ if GetOption("clazy"):
|
||||
qt_env['ENV']['CLAZY_IGNORE_DIRS'] = qt_dirs[0]
|
||||
qt_env['ENV']['CLAZY_CHECKS'] = ','.join(checks)
|
||||
|
||||
Export('env', 'qt_env', 'arch', 'real_arch', 'SHARED', 'USE_WEBCAM')
|
||||
zmq = 'zmq'
|
||||
Export('env', 'qt_env', 'arch', 'real_arch', 'SHARED', 'USE_WEBCAM', 'zmq', 'USE_MIPI')
|
||||
|
||||
SConscript(['selfdrive/common/SConscript'])
|
||||
Import('_common', '_gpucommon', '_gpu_libs')
|
||||
|
||||
if SHARED:
|
||||
common, gpucommon = abspath(common), abspath(gpucommon)
|
||||
else:
|
||||
common = [_common, 'json11']
|
||||
gpucommon = [_gpucommon] + _gpu_libs
|
||||
|
||||
Export('common', 'gpucommon')
|
||||
|
||||
# cereal and messaging are shared with the system
|
||||
SConscript(['cereal/SConscript'])
|
||||
@@ -354,18 +388,7 @@ else:
|
||||
messaging = [File('#cereal/libmessaging.a')]
|
||||
visionipc = [File('#cereal/libvisionipc.a')]
|
||||
|
||||
Export('cereal', 'messaging')
|
||||
|
||||
SConscript(['selfdrive/common/SConscript'])
|
||||
Import('_common', '_gpucommon', '_gpu_libs')
|
||||
|
||||
if SHARED:
|
||||
common, gpucommon = abspath(common), abspath(gpucommon)
|
||||
else:
|
||||
common = [_common, 'json11']
|
||||
gpucommon = [_gpucommon] + _gpu_libs
|
||||
|
||||
Export('common', 'gpucommon', 'visionipc')
|
||||
Export('cereal', 'messaging', 'visionipc')
|
||||
|
||||
# Build rednose library and ekf models
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Import('env', 'envCython', 'arch')
|
||||
Import('env', 'envCython', 'arch', 'common', 'zmq')
|
||||
|
||||
import shutil
|
||||
|
||||
@@ -8,7 +8,7 @@ messaging_dir = Dir('messaging')
|
||||
|
||||
# Build cereal
|
||||
|
||||
schema_files = ['log.capnp', 'car.capnp', 'legacy.capnp']
|
||||
schema_files = ['log.capnp', 'car.capnp', 'legacy.capnp', 'dp.capnp']
|
||||
env.Command(["gen/c/include/c++.capnp.h", "gen/c/include/java.capnp.h"], [], "mkdir -p " + gen_dir.path + "/c/include && touch $TARGETS")
|
||||
env.Command([f'gen/cpp/{s}.c++' for s in schema_files] + [f'gen/cpp/{s}.h' for s in schema_files],
|
||||
schema_files,
|
||||
@@ -40,10 +40,17 @@ messaging_objects = env.SharedObject([
|
||||
messaging_lib = env.Library('messaging', messaging_objects)
|
||||
Depends('messaging/impl_zmq.cc', services_h)
|
||||
|
||||
env.Program('messaging/bridge', ['messaging/bridge.cc'], LIBS=[messaging_lib, 'zmq'])
|
||||
# note, this rebuilds the deps shared, zmq is statically linked to make APK happy
|
||||
# TODO: get APK to load system zmq to remove the static link
|
||||
if arch == "aarch64":
|
||||
zmq_static = FindFile("libzmq.a", "/usr/lib")
|
||||
shared_lib_shared_lib = [zmq_static, 'm', 'stdc++', "gnustl_shared", "kj", "capnp"]
|
||||
env.SharedLibrary('messaging_shared', messaging_objects, LIBS=shared_lib_shared_lib)
|
||||
|
||||
env.Program('messaging/bridge', ['messaging/bridge.cc'], LIBS=[messaging_lib, common, 'zmq'])
|
||||
Depends('messaging/bridge.cc', services_h)
|
||||
|
||||
envCython.Program('messaging/messaging_pyx.so', 'messaging/messaging_pyx.pyx', LIBS=envCython["LIBS"]+[messaging_lib, "zmq"])
|
||||
envCython.Program('messaging/messaging_pyx.so', 'messaging/messaging_pyx.pyx', LIBS=envCython["LIBS"]+[messaging_lib, "zmq", common])
|
||||
|
||||
|
||||
# Build Vision IPC
|
||||
@@ -63,7 +70,7 @@ vipc_objects = env.SharedObject(vipc_sources)
|
||||
vipc = env.Library('visionipc', vipc_objects)
|
||||
|
||||
|
||||
libs = envCython["LIBS"]+["OpenCL", "zmq", vipc, messaging_lib]
|
||||
libs = envCython["LIBS"]+["OpenCL", "zmq", vipc, messaging_lib, common]
|
||||
if arch == "aarch64":
|
||||
libs += ["adreno_utils"]
|
||||
if arch == "Darwin":
|
||||
@@ -73,5 +80,5 @@ envCython.Program('visionipc/visionipc_pyx.so', 'visionipc/visionipc_pyx.pyx', L
|
||||
|
||||
|
||||
if GetOption('test'):
|
||||
env.Program('messaging/test_runner', ['messaging/test_runner.cc', 'messaging/msgq_tests.cc'], LIBS=[messaging_lib])
|
||||
env.Program('visionipc/test_runner', ['visionipc/test_runner.cc', 'visionipc/visionipc_tests.cc'], LIBS=[vipc, messaging_lib, 'zmq', 'pthread', 'OpenCL'])
|
||||
env.Program('messaging/test_runner', ['messaging/test_runner.cc', 'messaging/msgq_tests.cc'], LIBS=[messaging_lib, common])
|
||||
env.Program('visionipc/test_runner', ['visionipc/test_runner.cc', 'visionipc/visionipc_tests.cc'], LIBS=[vipc, messaging_lib, 'zmq', 'pthread', 'OpenCL', common])
|
||||
|
||||
73
cereal/_SConstruct
Normal file
73
cereal/_SConstruct
Normal file
@@ -0,0 +1,73 @@
|
||||
import os
|
||||
import platform
|
||||
import subprocess
|
||||
import sysconfig
|
||||
|
||||
arch = subprocess.check_output(["uname", "-m"], encoding='utf8').rstrip()
|
||||
if platform.system() == "Darwin":
|
||||
arch = "Darwin"
|
||||
|
||||
cereal_dir = Dir('.')
|
||||
messaging_dir = Dir('./messaging')
|
||||
|
||||
cpppath = [
|
||||
cereal_dir,
|
||||
messaging_dir,
|
||||
'/usr/lib/include',
|
||||
'/opt/homebrew/include',
|
||||
sysconfig.get_paths()['include'],
|
||||
]
|
||||
|
||||
libpath = [
|
||||
'/opt/homebrew/lib',
|
||||
]
|
||||
|
||||
AddOption('--test',
|
||||
action='store_true',
|
||||
help='build test files')
|
||||
|
||||
AddOption('--asan',
|
||||
action='store_true',
|
||||
help='turn on ASAN')
|
||||
|
||||
ccflags_asan = ["-fsanitize=address", "-fno-omit-frame-pointer"] if GetOption('asan') else []
|
||||
ldflags_asan = ["-fsanitize=address"] if GetOption('asan') else []
|
||||
|
||||
env = Environment(
|
||||
ENV=os.environ,
|
||||
CC='clang',
|
||||
CXX='clang++',
|
||||
CCFLAGS=[
|
||||
"-g",
|
||||
"-fPIC",
|
||||
"-O2",
|
||||
"-Wunused",
|
||||
"-Werror",
|
||||
] + ccflags_asan,
|
||||
LDFLAGS=ldflags_asan,
|
||||
LINKFLAGS=ldflags_asan,
|
||||
|
||||
CFLAGS="-std=gnu11",
|
||||
CXXFLAGS="-std=c++1z",
|
||||
CPPPATH=cpppath,
|
||||
LIBPATH=libpath,
|
||||
CYTHONCFILESUFFIX=".cpp",
|
||||
tools=["default", "cython"]
|
||||
)
|
||||
|
||||
Export('env', 'arch')
|
||||
|
||||
envCython = env.Clone(LIBS=[])
|
||||
envCython["CCFLAGS"] += ["-Wno-#warnings", "-Wno-deprecated-declarations"]
|
||||
if arch == "Darwin":
|
||||
envCython["LINKFLAGS"] = ["-bundle", "-undefined", "dynamic_lookup"]
|
||||
elif arch == "aarch64":
|
||||
envCython["LINKFLAGS"] = ["-shared"]
|
||||
envCython["LIBS"] = [os.path.basename(sysconfig.get_paths()['include'])]
|
||||
else:
|
||||
envCython["LINKFLAGS"] = ["-pthread", "-shared"]
|
||||
|
||||
Export('envCython')
|
||||
|
||||
|
||||
SConscript(['SConscript'])
|
||||
@@ -108,6 +108,7 @@ struct CarEvent @0x9b1657f34caf3ad3 {
|
||||
driverCameraError @101;
|
||||
wideRoadCameraError @102;
|
||||
localizerMalfunction @103;
|
||||
highCpuUsage @105;
|
||||
|
||||
driverMonitorLowAccDEPRECATED @68;
|
||||
radarCanErrorDEPRECATED @15;
|
||||
@@ -129,6 +130,23 @@ struct CarEvent @0x9b1657f34caf3ad3 {
|
||||
neosUpdateRequiredDEPRECATED @88;
|
||||
modelLagWarningDEPRECATED @93;
|
||||
startupOneplusDEPRECATED @82;
|
||||
|
||||
#dp
|
||||
preLaneChangeLeftALC @106;
|
||||
preLaneChangeRightALC @107;
|
||||
manualSteeringRequired @108;
|
||||
manualSteeringRequiredBlinkersOn @109;
|
||||
leadCarMoving @110;
|
||||
|
||||
# timebomb assist
|
||||
timebombWarn @111;
|
||||
timebombBypassing @112;
|
||||
timebombBypassed @113;
|
||||
mapdAlert @114;
|
||||
|
||||
#mapd
|
||||
speedLimitActive @115;
|
||||
speedLimitValueChange @116;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,6 +174,7 @@ struct CarState {
|
||||
|
||||
# steering wheel
|
||||
steeringAngleDeg @7 :Float32;
|
||||
steeringAngleOffsetDeg @37 :Float32; # Offset betweens sensors in case there multiple
|
||||
steeringRateDeg @15 :Float32;
|
||||
steeringTorque @8 :Float32; # TODO: standardize units
|
||||
steeringTorqueEps @27 :Float32; # TODO: standardize units
|
||||
@@ -194,6 +213,12 @@ struct CarState {
|
||||
leftBlindspot @33 :Bool; # Is there something blocking the left lane change
|
||||
rightBlindspot @34 :Bool; # Is there something blocking the right lane change
|
||||
|
||||
# dp
|
||||
lkMode @38 :Bool;
|
||||
stopSteering @39 :Bool; # timebomb - stopSteering
|
||||
engineRPM @40 :Float32;
|
||||
cruiseActualEnabled @41 :Bool;
|
||||
|
||||
struct WheelSpeeds {
|
||||
# optional wheel speeds
|
||||
fl @0 :Float32;
|
||||
@@ -209,6 +234,8 @@ struct CarState {
|
||||
speedOffset @3 :Float32;
|
||||
standstill @4 :Bool;
|
||||
nonAdaptive @5 :Bool;
|
||||
#mapd
|
||||
speedLimit @6 :Float32;
|
||||
}
|
||||
|
||||
enum GearShifter {
|
||||
@@ -246,7 +273,7 @@ struct CarState {
|
||||
}
|
||||
|
||||
errorsDEPRECATED @0 :List(CarEvent.EventName);
|
||||
brakeLightsDEPRECATED @19 :Bool;
|
||||
brakeLights @19 :Bool;
|
||||
}
|
||||
|
||||
# ******* radar state @ 20hz *******
|
||||
@@ -302,6 +329,7 @@ struct CarControl {
|
||||
# range from -1.0 - 1.0
|
||||
steer @2: Float32;
|
||||
steeringAngleDeg @3: Float32;
|
||||
accel @4: Float32; # m/s^2
|
||||
}
|
||||
|
||||
struct CruiseControl {
|
||||
|
||||
62
cereal/dp.capnp
Normal file
62
cereal/dp.capnp
Normal file
@@ -0,0 +1,62 @@
|
||||
using Cxx = import "./include/c++.capnp";
|
||||
$Cxx.namespace("cereal");
|
||||
|
||||
using Java = import "./include/java.capnp";
|
||||
$Java.package("ai.comma.openpilot.cereal");
|
||||
$Java.outerClassname("dp");
|
||||
|
||||
@0xbfa7e645486440c7;
|
||||
|
||||
# dp.capnp: a home for deprecated structs
|
||||
|
||||
# dp
|
||||
struct DragonConf {
|
||||
dpThermalStarted @0 :Bool;
|
||||
dpThermalOverheat @1 :Bool;
|
||||
dpAtl @2 :Bool;
|
||||
dpAtlOpLong @3 :Bool;
|
||||
dpDashcamd @4 :Bool;
|
||||
dpAutoShutdown @5 :Bool;
|
||||
dpAthenad @6 :Bool;
|
||||
dpUploader @7 :Bool;
|
||||
dpLateralMode @8 :UInt8;
|
||||
dpSignalOffDelay @9 :Float32;
|
||||
dpLcMinMph @10 :UInt8;
|
||||
dpLcAutoCont @11 :Bool;
|
||||
dpLcAutoMinMph @12 :UInt8;
|
||||
dpLcAutoDelay @13 :Float32;
|
||||
dpAllowGas @14 :Bool;
|
||||
dpFollowingProfileCtrl @15 :Bool;
|
||||
dpFollowingProfile @16 :UInt8;
|
||||
dpAccelProfileCtrl @17 :Bool;
|
||||
dpAccelProfile @18 :UInt8;
|
||||
dpGearCheck @19 :Bool;
|
||||
dpSpeedCheck @20 :Bool;
|
||||
dpUiDisplayMode @21 :UInt8;
|
||||
dpUiSpeed @22 :Bool;
|
||||
dpUiEvent @23 :Bool;
|
||||
dpUiMaxSpeed @24 :Bool;
|
||||
dpUiFace @25 :Bool;
|
||||
dpUiLane @26 :Bool;
|
||||
dpUiLead @27 :Bool;
|
||||
dpUiSide @28 :Bool;
|
||||
dpUiTop @29 :Bool;
|
||||
dpUiBlinker @30 :Bool;
|
||||
dpUiBrightness @31 :UInt8;
|
||||
dpUiVolume @32 :Int8;
|
||||
dpToyotaLdw @33 :Bool;
|
||||
dpToyotaSng @34 :Bool;
|
||||
dpToyotaCruiseOverride @35 :Bool;
|
||||
dpToyotaCruiseOverrideVego @36 :Bool;
|
||||
dpToyotaCruiseOverrideAt @37 :Float32;
|
||||
dpToyotaCruiseOverrideSpeed @38 :Float32;
|
||||
dpVwTimebombAssist @39 :Bool;
|
||||
dpIpAddr @40 :Text;
|
||||
dpCameraOffset @41 :Int8;
|
||||
dpPathOffset @42 :Int8;
|
||||
dpLocale @43 :Text;
|
||||
dpSrLearner @44 :Bool;
|
||||
dpSrCustom @45 :Float32;
|
||||
dpAppd @46 :Bool;
|
||||
dpMapd @47 :Bool;
|
||||
}
|
||||
@@ -7,6 +7,7 @@ $Java.outerClassname("Log");
|
||||
|
||||
using Car = import "car.capnp";
|
||||
using Legacy = import "legacy.capnp";
|
||||
using Dp = import "dp.capnp";
|
||||
|
||||
@0xf3b1f17e25a4285b;
|
||||
|
||||
@@ -49,6 +50,7 @@ struct InitData {
|
||||
chffrIos @3;
|
||||
tici @4;
|
||||
pc @5;
|
||||
jetson @6;
|
||||
}
|
||||
|
||||
struct PandaInfo {
|
||||
@@ -289,15 +291,11 @@ struct CanData {
|
||||
}
|
||||
|
||||
struct DeviceState @0xa4d8b5af2aa492eb {
|
||||
freeSpacePercent @7 :Float32;
|
||||
memoryUsagePercent @19 :Int8;
|
||||
cpuUsagePercent @20 :Int8;
|
||||
gpuUsagePercent @33 :Int8;
|
||||
usbOnline @12 :Bool;
|
||||
networkType @22 :NetworkType;
|
||||
networkInfo @31 :NetworkInfo;
|
||||
offroadPowerUsageUwh @23 :UInt32;
|
||||
networkStrength @24 :NetworkStrength;
|
||||
offroadPowerUsageUwh @23 :UInt32;
|
||||
carBatteryCapacityUwh @25 :UInt32;
|
||||
|
||||
fanSpeedPercentDesired @10 :UInt16;
|
||||
@@ -306,6 +304,12 @@ struct DeviceState @0xa4d8b5af2aa492eb {
|
||||
|
||||
lastAthenaPingTime @32 :UInt64;
|
||||
|
||||
# system utilization
|
||||
freeSpacePercent @7 :Float32;
|
||||
memoryUsagePercent @19 :Int8;
|
||||
gpuUsagePercent @33 :Int8;
|
||||
cpuUsagePercent @34 :List(Int8); # per-core cpu usage
|
||||
|
||||
# power
|
||||
batteryPercent @8 :Int16;
|
||||
batteryStatus @9 :Text;
|
||||
@@ -365,6 +369,7 @@ struct DeviceState @0xa4d8b5af2aa492eb {
|
||||
gpuDEPRECATED @5 :UInt16;
|
||||
batDEPRECATED @6 :UInt32;
|
||||
pa0DEPRECATED @21 :UInt16;
|
||||
cpuUsagePercentDEPRECATED @20 :Int8;
|
||||
}
|
||||
|
||||
struct PandaState @0xa7649e2575e4591e {
|
||||
@@ -432,7 +437,7 @@ struct PandaState @0xa7649e2575e4591e {
|
||||
pedal @4;
|
||||
uno @5;
|
||||
dos @6;
|
||||
red @7;
|
||||
redPanda @7;
|
||||
}
|
||||
|
||||
enum UsbPowerMode {
|
||||
@@ -661,12 +666,12 @@ struct ControlsState @0x97ff69c53601abf1 {
|
||||
decelForTurnDEPRECATED @47 :Bool;
|
||||
decelForModelDEPRECATED @54 :Bool;
|
||||
awarenessStatusDEPRECATED @26 :Float32;
|
||||
angleSteersDEPRECATED @13 :Float32;
|
||||
angleSteers @13 :Float32; # dp
|
||||
vCurvatureDEPRECATED @46 :Float32;
|
||||
mapValidDEPRECATED @49 :Bool;
|
||||
jerkFactorDEPRECATED @12 :Float32;
|
||||
steerOverrideDEPRECATED @20 :Bool;
|
||||
steeringAngleDesiredDegDEPRECATED @29 :Float32;
|
||||
steeringAngleDesiredDeg @29 :Float32; # dp
|
||||
}
|
||||
|
||||
struct ModelDataV2 {
|
||||
@@ -809,12 +814,31 @@ struct LongitudinalPlan @0xe00b5b3eba12876c {
|
||||
speeds @33 :List(Float32);
|
||||
jerks @34 :List(Float32);
|
||||
|
||||
#mapd
|
||||
visionTurnControllerState @35 :VisionTurnControllerState;
|
||||
visionTurnSpeed @36 :Float32;
|
||||
|
||||
speedLimitControlState @37 :SpeedLimitControlState;
|
||||
speedLimit @38 :Float32;
|
||||
speedLimitOffset @39 :Float32;
|
||||
distToSpeedLimit @40 :Float32;
|
||||
isMapSpeedLimit @41 :Bool;
|
||||
|
||||
distToTurn @42 :Float32;
|
||||
turnSpeed @43 :Float32;
|
||||
turnSpeedControlState @44 :SpeedLimitControlState;
|
||||
turnSign @45 :Int16;
|
||||
|
||||
enum LongitudinalPlanSource {
|
||||
cruise @0;
|
||||
lead0 @1;
|
||||
lead1 @2;
|
||||
lead2 @3;
|
||||
e2e @4;
|
||||
#mapd
|
||||
turn @5;
|
||||
limit @6;
|
||||
turnlimit @7;
|
||||
}
|
||||
|
||||
# deprecated
|
||||
@@ -850,6 +874,21 @@ struct LongitudinalPlan @0xe00b5b3eba12876c {
|
||||
x @0 :List(Float32);
|
||||
y @1 :List(Float32);
|
||||
}
|
||||
|
||||
#mapd
|
||||
enum SpeedLimitControlState {
|
||||
inactive @0; # No speed limit set or not enabled by parameter.
|
||||
tempInactive @1; # User wants to ignore speed limit until it changes.
|
||||
adapting @2; # Reducing speed to match new speed limit.
|
||||
active @3; # Cruising at speed limit.
|
||||
}
|
||||
|
||||
enum VisionTurnControllerState {
|
||||
disabled @0; # No predicted substancial turn on vision range or feature disabled.
|
||||
entering @1; # A subsantial turn is predicted ahead, adapting speed to turn confort levels.
|
||||
turning @2; # Actively turning. Managing acceleration to provide a roll on turn feeling.
|
||||
leaving @3; # Road ahead straightens. Start to allow positive acceleration.
|
||||
}
|
||||
}
|
||||
|
||||
struct LateralPlan @0xe1e9318e2ae8b51e {
|
||||
@@ -858,6 +897,9 @@ struct LateralPlan @0xe1e9318e2ae8b51e {
|
||||
rProb @7 :Float32;
|
||||
dPathPoints @20 :List(Float32);
|
||||
dProb @21 :Float32;
|
||||
#mapd
|
||||
dPathWLinesX @30 :List(Float32);
|
||||
dPathWLinesY @31 :List(Float32);
|
||||
|
||||
mpcSolutionValid @9 :Bool;
|
||||
desire @17 :Desire;
|
||||
@@ -870,6 +912,9 @@ struct LateralPlan @0xe1e9318e2ae8b51e {
|
||||
curvatures @27 :List(Float32);
|
||||
curvatureRates @28 :List(Float32);
|
||||
|
||||
# dp
|
||||
dpALCAllowed @29 :Bool;
|
||||
|
||||
enum Desire {
|
||||
none @0;
|
||||
turnLeft @1;
|
||||
@@ -934,7 +979,7 @@ struct LiveLocationKalman {
|
||||
angularVelocityDevice @8 : Measurement;
|
||||
|
||||
# orientationNEDCalibrated transforms to rot matrix: NED_from_calibrated
|
||||
orientationNEDCalibrated @9 : Measurement;
|
||||
calibratedOrientationNED @9 : Measurement;
|
||||
|
||||
# Calibrated frame is simply device frame
|
||||
# aligned with the vehicle
|
||||
@@ -1321,6 +1366,23 @@ struct LiveMapDataDEPRECATED {
|
||||
mapValid @11 :Bool;
|
||||
}
|
||||
|
||||
struct LiveMapData {
|
||||
speedLimitValid @0 :Bool;
|
||||
speedLimit @1 :Float32;
|
||||
speedLimitAheadValid @2 :Bool;
|
||||
speedLimitAhead @3 :Float32;
|
||||
speedLimitAheadDistance @4 :Float32;
|
||||
turnSpeedLimitValid @5 :Bool;
|
||||
turnSpeedLimit @6 :Float32;
|
||||
turnSpeedLimitEndDistance @7 :Float32;
|
||||
turnSpeedLimitSign @8 :Int16;
|
||||
turnSpeedLimitsAhead @9 :List(Float32);
|
||||
turnSpeedLimitsAheadDistances @10 :List(Float32);
|
||||
turnSpeedLimitsAheadSigns @11 :List(Int16);
|
||||
lastGpsTimestamp @12 :Int64; # Milliseconds since January 1, 1970.
|
||||
currentRoadName @13 :Text;
|
||||
}
|
||||
|
||||
struct CameraOdometry {
|
||||
frameId @4 :UInt32;
|
||||
timestampEof @5 :UInt64;
|
||||
@@ -1461,5 +1523,8 @@ struct Event {
|
||||
kalmanOdometryDEPRECATED @65 :Legacy.KalmanOdometry;
|
||||
gpsLocationDEPRECATED @21 :GpsLocationData;
|
||||
uiLayoutStateDEPRECATED @57 :Legacy.UiLayoutState;
|
||||
dragonConf @80 :Dp.DragonConf;
|
||||
#mapd
|
||||
liveMapData @81: LiveMapData;
|
||||
}
|
||||
}
|
||||
|
||||
20
cereal/logger/logger.h
Normal file
20
cereal/logger/logger.h
Normal file
@@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef SWAGLOG
|
||||
#include "selfdrive/common/swaglog.h"
|
||||
#else
|
||||
|
||||
#define CLOUDLOG_DEBUG 10
|
||||
#define CLOUDLOG_INFO 20
|
||||
#define CLOUDLOG_WARNING 30
|
||||
#define CLOUDLOG_ERROR 40
|
||||
#define CLOUDLOG_CRITICAL 50
|
||||
|
||||
#define cloudlog(lvl, fmt, ...) printf(fmt "\n", ## __VA_ARGS__)
|
||||
|
||||
#define LOGD(fmt, ...) cloudlog(CLOUDLOG_DEBUG, fmt, ## __VA_ARGS__)
|
||||
#define LOG(fmt, ...) cloudlog(CLOUDLOG_INFO, fmt, ## __VA_ARGS__)
|
||||
#define LOGW(fmt, ...) cloudlog(CLOUDLOG_WARNING, fmt, ## __VA_ARGS__)
|
||||
#define LOGE(fmt, ...) cloudlog(CLOUDLOG_ERROR, fmt, ## __VA_ARGS__)
|
||||
|
||||
#endif
|
||||
@@ -13,6 +13,7 @@ from cereal.services import service_list
|
||||
assert MultiplePublishersError
|
||||
assert MessagingError
|
||||
|
||||
NO_TRAVERSAL_LIMIT = 2**64-1
|
||||
AVG_FREQ_HISTORY = 100
|
||||
SIMULATION = "SIMULATION" in os.environ
|
||||
|
||||
@@ -26,6 +27,9 @@ except ImportError:
|
||||
|
||||
context = Context()
|
||||
|
||||
def log_from_bytes(dat: bytes) -> capnp.lib.capnp._DynamicStructReader:
|
||||
return log.Event.from_bytes(dat, traversal_limit_in_words=NO_TRAVERSAL_LIMIT)
|
||||
|
||||
def new_message(service: Optional[str] = None, size: Optional[int] = None) -> capnp.lib.capnp._DynamicStructBuilder:
|
||||
dat = log.Event.new_message()
|
||||
dat.logMonoTime = int(sec_since_boot() * 1e9)
|
||||
@@ -83,7 +87,7 @@ def drain_sock(sock: SubSocket, wait_for_one: bool = False) -> List[capnp.lib.ca
|
||||
if dat is None: # Timeout hit
|
||||
break
|
||||
|
||||
dat = log.Event.from_bytes(dat)
|
||||
dat = log_from_bytes(dat)
|
||||
ret.append(dat)
|
||||
|
||||
return ret
|
||||
@@ -106,20 +110,20 @@ def recv_sock(sock: SubSocket, wait: bool = False) -> Union[None, capnp.lib.capn
|
||||
dat = rcv
|
||||
|
||||
if dat is not None:
|
||||
dat = log.Event.from_bytes(dat)
|
||||
dat = log_from_bytes(dat)
|
||||
|
||||
return dat
|
||||
|
||||
def recv_one(sock: SubSocket) -> Union[None, capnp.lib.capnp._DynamicStructReader]:
|
||||
dat = sock.receive()
|
||||
if dat is not None:
|
||||
dat = log.Event.from_bytes(dat)
|
||||
dat = log_from_bytes(dat)
|
||||
return dat
|
||||
|
||||
def recv_one_or_none(sock: SubSocket) -> Union[None, capnp.lib.capnp._DynamicStructReader]:
|
||||
dat = sock.receive(non_blocking=True)
|
||||
if dat is not None:
|
||||
dat = log.Event.from_bytes(dat)
|
||||
dat = log_from_bytes(dat)
|
||||
return dat
|
||||
|
||||
def recv_one_retry(sock: SubSocket) -> capnp.lib.capnp._DynamicStructReader:
|
||||
@@ -127,7 +131,7 @@ def recv_one_retry(sock: SubSocket) -> capnp.lib.capnp._DynamicStructReader:
|
||||
while True:
|
||||
dat = sock.receive()
|
||||
if dat is not None:
|
||||
return log.Event.from_bytes(dat)
|
||||
return log_from_bytes(dat)
|
||||
|
||||
class SubMaster():
|
||||
def __init__(self, services: List[str], poll: Optional[List[str]] = None,
|
||||
|
||||
@@ -69,7 +69,7 @@ public:
|
||||
SubMaster(const std::vector<const char *> &service_list,
|
||||
const char *address = nullptr, const std::vector<const char *> &ignore_alive = {});
|
||||
void update(int timeout = 1000);
|
||||
void update_msgs(uint64_t current_time, std::vector<std::pair<std::string, cereal::Event::Reader>> messages);
|
||||
void update_msgs(uint64_t current_time, const std::vector<std::pair<std::string, cereal::Event::Reader>> &messages);
|
||||
inline bool allAlive(const std::vector<const char *> &service_list = {}) { return all_(service_list, false, true); }
|
||||
inline bool allValid(const std::vector<const char *> &service_list = {}) { return all_(service_list, true, false); }
|
||||
inline bool allAliveAndValid(const std::vector<const char *> &service_list = {}) { return all_(service_list, true, true); }
|
||||
|
||||
@@ -92,7 +92,9 @@ void SubMaster::update(int timeout) {
|
||||
SubMessage *m = messages_.at(s);
|
||||
|
||||
m->msg_reader->~FlatArrayMessageReader();
|
||||
m->msg_reader = new (m->allocated_msg_reader) capnp::FlatArrayMessageReader(m->aligned_buf.align(msg));
|
||||
capnp::ReaderOptions options;
|
||||
options.traversalLimitInWords = kj::maxValue; // Don't limit
|
||||
m->msg_reader = new (m->allocated_msg_reader) capnp::FlatArrayMessageReader(m->aligned_buf.align(msg), options);
|
||||
delete msg;
|
||||
messages.push_back({m->name, m->msg_reader->getRoot<cereal::Event>()});
|
||||
}
|
||||
@@ -100,7 +102,7 @@ void SubMaster::update(int timeout) {
|
||||
update_msgs(current_time, messages);
|
||||
}
|
||||
|
||||
void SubMaster::update_msgs(uint64_t current_time, std::vector<std::pair<std::string, cereal::Event::Reader>> messages){
|
||||
void SubMaster::update_msgs(uint64_t current_time, const std::vector<std::pair<std::string, cereal::Event::Reader>> &messages){
|
||||
if (++frame == UINT64_MAX) frame = 1;
|
||||
|
||||
for(auto &kv : messages) {
|
||||
|
||||
@@ -61,6 +61,16 @@ services = {
|
||||
"modelV2": (True, 20., 40),
|
||||
"managerState": (True, 2., 1),
|
||||
"uploaderState": (True, 0., 1),
|
||||
|
||||
#mapd
|
||||
"liveMapData": (True, 0.),
|
||||
|
||||
# debug
|
||||
"testJoystick": (False, 0.),
|
||||
|
||||
# dp
|
||||
"thermal": (True, 2., 1),
|
||||
"dragonConf": (False, 1.),
|
||||
}
|
||||
service_list = {name: Service(new_port(idx), *vals) for # type: ignore
|
||||
idx, (name, vals) in enumerate(services.items())}
|
||||
|
||||
@@ -55,8 +55,8 @@ class VisionBuf {
|
||||
void init_cl(cl_device_id device_id, cl_context ctx);
|
||||
void init_rgb(size_t width, size_t height, size_t stride);
|
||||
void init_yuv(size_t width, size_t height);
|
||||
void sync(int dir);
|
||||
void free();
|
||||
int sync(int dir);
|
||||
int free();
|
||||
};
|
||||
|
||||
void visionbuf_compute_aligned_width_and_height(int width, int height, int *aligned_w, int *aligned_h);
|
||||
|
||||
@@ -60,27 +60,36 @@ void VisionBuf::import(){
|
||||
}
|
||||
|
||||
|
||||
void VisionBuf::sync(int dir) {
|
||||
int VisionBuf::sync(int dir) {
|
||||
int err = 0;
|
||||
if (!this->buf_cl) return;
|
||||
if (!this->buf_cl) return 0;
|
||||
|
||||
if (dir == VISIONBUF_SYNC_FROM_DEVICE) {
|
||||
err = clEnqueueReadBuffer(this->copy_q, this->buf_cl, CL_FALSE, 0, this->len, this->addr, 0, NULL, NULL);
|
||||
} else {
|
||||
err = clEnqueueWriteBuffer(this->copy_q, this->buf_cl, CL_FALSE, 0, this->len, this->addr, 0, NULL, NULL);
|
||||
}
|
||||
assert(err == 0);
|
||||
clFinish(this->copy_q);
|
||||
}
|
||||
|
||||
void VisionBuf::free() {
|
||||
if (this->buf_cl){
|
||||
int err = clReleaseMemObject(this->buf_cl);
|
||||
assert(err == 0);
|
||||
|
||||
clReleaseCommandQueue(this->copy_q);
|
||||
if (err == 0){
|
||||
err = clFinish(this->copy_q);
|
||||
}
|
||||
|
||||
munmap(this->addr, this->len);
|
||||
close(this->fd);
|
||||
return err;
|
||||
}
|
||||
|
||||
int VisionBuf::free() {
|
||||
int err = 0;
|
||||
if (this->buf_cl){
|
||||
err = clReleaseMemObject(this->buf_cl);
|
||||
if (err != 0) return err;
|
||||
|
||||
err = clReleaseCommandQueue(this->copy_q);
|
||||
if (err != 0) return err;
|
||||
}
|
||||
|
||||
err = munmap(this->addr, this->len);
|
||||
if (err != 0) return err;
|
||||
|
||||
err = close(this->fd);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -104,9 +104,7 @@ void VisionBuf::init_cl(cl_device_id device_id, cl_context ctx) {
|
||||
}
|
||||
|
||||
|
||||
void VisionBuf::sync(int dir) {
|
||||
int err;
|
||||
|
||||
int VisionBuf::sync(int dir) {
|
||||
struct ion_flush_data flush_data = {0};
|
||||
flush_data.handle = this->handle;
|
||||
flush_data.vaddr = this->addr;
|
||||
@@ -124,19 +122,23 @@ void VisionBuf::sync(int dir) {
|
||||
ION_IOC_INV_CACHES : ION_IOC_CLEAN_CACHES;
|
||||
|
||||
custom_data.arg = (unsigned long)&flush_data;
|
||||
err = ioctl(ion_fd, ION_IOC_CUSTOM, &custom_data);
|
||||
assert(err == 0);
|
||||
return ioctl(ion_fd, ION_IOC_CUSTOM, &custom_data);
|
||||
}
|
||||
|
||||
void VisionBuf::free() {
|
||||
int VisionBuf::free() {
|
||||
int err = 0;
|
||||
|
||||
if (this->buf_cl){
|
||||
int err = clReleaseMemObject(this->buf_cl);
|
||||
assert(err == 0);
|
||||
err = clReleaseMemObject(this->buf_cl);
|
||||
if (err != 0) return err;
|
||||
}
|
||||
|
||||
munmap(this->addr, this->mmap_len);
|
||||
close(this->fd);
|
||||
err = munmap(this->addr, this->mmap_len);
|
||||
if (err != 0) return err;
|
||||
|
||||
err = close(this->fd);
|
||||
if (err != 0) return err;
|
||||
|
||||
struct ion_handle_data handle_data = {.handle = this->handle};
|
||||
ioctl(ion_fd, ION_IOC_FREE, &handle_data);
|
||||
return ioctl(ion_fd, ION_IOC_FREE, &handle_data);
|
||||
}
|
||||
|
||||
@@ -3,9 +3,10 @@
|
||||
#include <iostream>
|
||||
#include <thread>
|
||||
|
||||
#include "ipc.h"
|
||||
#include "visionipc_client.h"
|
||||
#include "visionipc_server.h"
|
||||
#include "visionipc/ipc.h"
|
||||
#include "visionipc/visionipc_client.h"
|
||||
#include "visionipc/visionipc_server.h"
|
||||
#include "logger/logger.h"
|
||||
|
||||
VisionIpcClient::VisionIpcClient(std::string name, VisionStreamType type, bool conflate, cl_device_id device_id, cl_context ctx) : name(name), type(type), device_id(device_id), ctx(ctx) {
|
||||
msg_ctx = Context::create();
|
||||
@@ -21,8 +22,11 @@ bool VisionIpcClient::connect(bool blocking){
|
||||
|
||||
// Cleanup old buffers on reconnect
|
||||
for (size_t i = 0; i < num_buffers; i++){
|
||||
buffers[i].free();
|
||||
if (buffers[i].free() != 0) {
|
||||
LOGE("Failed to free buffer %zu", i);
|
||||
}
|
||||
}
|
||||
|
||||
num_buffers = 0;
|
||||
|
||||
// Connect to server socket and ask for all FDs of type
|
||||
@@ -101,7 +105,10 @@ VisionBuf * VisionIpcClient::recv(VisionIpcBufExtra * extra, const int timeout_m
|
||||
*extra = packet->extra;
|
||||
}
|
||||
|
||||
buf->sync(VISIONBUF_SYNC_TO_DEVICE);
|
||||
if (buf->sync(VISIONBUF_SYNC_TO_DEVICE) != 0) {
|
||||
LOGE("Failed to sync buffer");
|
||||
}
|
||||
|
||||
delete r;
|
||||
return buf;
|
||||
}
|
||||
@@ -110,7 +117,9 @@ VisionBuf * VisionIpcClient::recv(VisionIpcBufExtra * extra, const int timeout_m
|
||||
|
||||
VisionIpcClient::~VisionIpcClient(){
|
||||
for (size_t i = 0; i < num_buffers; i++){
|
||||
buffers[i].free();
|
||||
if (buffers[i].free() != 0) {
|
||||
LOGE("Failed to free buffer %zu", i);
|
||||
}
|
||||
}
|
||||
|
||||
delete sock;
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "messaging/messaging.h"
|
||||
#include "visionipc/ipc.h"
|
||||
#include "visionipc/visionipc_server.h"
|
||||
#include "logger/logger.h"
|
||||
|
||||
std::string get_endpoint_name(std::string name, VisionStreamType type){
|
||||
if (messaging_use_zmq()){
|
||||
@@ -145,7 +146,11 @@ VisionBuf * VisionIpcServer::get_buffer(VisionStreamType type){
|
||||
}
|
||||
|
||||
void VisionIpcServer::send(VisionBuf * buf, VisionIpcBufExtra * extra, bool sync){
|
||||
if (sync) buf->sync(VISIONBUF_SYNC_FROM_DEVICE);
|
||||
if (sync) {
|
||||
if (buf->sync(VISIONBUF_SYNC_FROM_DEVICE) != 0) {
|
||||
LOGE("Failed to sync buffer");
|
||||
}
|
||||
}
|
||||
assert(buffers.count(buf->type));
|
||||
assert(buf->idx < buffers[buf->type].size());
|
||||
|
||||
@@ -165,7 +170,9 @@ VisionIpcServer::~VisionIpcServer(){
|
||||
// VisionBuf cleanup
|
||||
for( auto const& [type, buf] : buffers ) {
|
||||
for (VisionBuf* b : buf){
|
||||
b->free();
|
||||
if (b->free() != 0) {
|
||||
LOGE("Failed to free buffer");
|
||||
}
|
||||
delete b;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
import jwt
|
||||
import os
|
||||
import requests
|
||||
from datetime import datetime, timedelta
|
||||
from common.basedir import PERSIST
|
||||
from selfdrive.version import version
|
||||
from common.params import Params
|
||||
|
||||
API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com') if not Params().get_bool("dp_api_custom") else Params().get("dp_api_custom_url", encoding='utf-8')
|
||||
|
||||
class Api():
|
||||
def __init__(self, dongle_id):
|
||||
@@ -34,12 +38,10 @@ class Api():
|
||||
|
||||
|
||||
def api_get(endpoint, method='GET', timeout=None, access_token=None, **params):
|
||||
backend = "https://api.commadotai.com/"
|
||||
|
||||
headers = {}
|
||||
if access_token is not None:
|
||||
headers['Authorization'] = "JWT "+access_token
|
||||
|
||||
headers['User-Agent'] = "openpilot-" + version
|
||||
|
||||
return requests.request(method, backend+endpoint, timeout=timeout, headers=headers, params=params)
|
||||
return requests.request(method, API_HOST + "/" + endpoint, timeout=timeout, headers=headers, params=params)
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
from selfdrive.hardware import PC
|
||||
from selfdrive.hardware import PC, JETSON
|
||||
|
||||
BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../"))
|
||||
|
||||
if PC:
|
||||
if PC or JETSON:
|
||||
PERSIST = os.path.join(str(Path.home()), ".comma", "persist")
|
||||
else:
|
||||
PERSIST = "/persist"
|
||||
|
||||
80
common/dp_common.py
Normal file
80
common/dp_common.py
Normal file
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env python3.7
|
||||
import subprocess
|
||||
from cereal import car
|
||||
from common.params import Params
|
||||
from common.realtime import sec_since_boot
|
||||
import os
|
||||
params = Params()
|
||||
PARAM_PATH = params.get_params_path() + '/d/'
|
||||
LAST_MODIFIED = PARAM_PATH + "dp_last_modified"
|
||||
|
||||
def is_online():
|
||||
try:
|
||||
return not subprocess.call(["ping", "-W", "4", "-c", "1", "117.28.245.92"])
|
||||
except ProcessLookupError:
|
||||
return False
|
||||
|
||||
def common_controller_ctrl(enabled, dragonconf, blinker_on, steer_req, v_ego):
|
||||
if enabled:
|
||||
if dragonconf.dpLateralMode == 0 and blinker_on:
|
||||
steer_req = 0 if isinstance(steer_req, int) else False
|
||||
return steer_req
|
||||
|
||||
def common_interface_atl(ret, atl):
|
||||
# dp
|
||||
enable_acc = ret.cruiseState.enabled
|
||||
if atl and ret.cruiseState.available:
|
||||
enable_acc = True
|
||||
if ret.gearShifter in [car.CarState.GearShifter.reverse, car.CarState.GearShifter.park]:
|
||||
enable_acc = False
|
||||
if ret.seatbeltUnlatched or ret.doorOpen:
|
||||
enable_acc = False
|
||||
return enable_acc
|
||||
|
||||
def common_interface_get_params_lqr(ret):
|
||||
if params.get_bool('dp_lqr'):
|
||||
ret.lateralTuning.init('lqr')
|
||||
ret.lateralTuning.lqr.scale = 1500.0
|
||||
ret.lateralTuning.lqr.ki = 0.05
|
||||
|
||||
ret.lateralTuning.lqr.a = [0., 1., -0.22619643, 1.21822268]
|
||||
ret.lateralTuning.lqr.b = [-1.92006585e-04, 3.95603032e-05]
|
||||
ret.lateralTuning.lqr.c = [1., 0.]
|
||||
ret.lateralTuning.lqr.k = [-110.73572306, 451.22718255]
|
||||
ret.lateralTuning.lqr.l = [0.3233671, 0.3185757]
|
||||
ret.lateralTuning.lqr.dcGain = 0.002237852961363602
|
||||
return ret
|
||||
|
||||
|
||||
def get_last_modified(delay, old_check, old_modified):
|
||||
new_check = sec_since_boot()
|
||||
if old_check is None or new_check - old_check >= delay:
|
||||
return new_check, os.stat(LAST_MODIFIED).st_mtime
|
||||
else:
|
||||
return old_check, old_modified
|
||||
|
||||
def param_get_if_updated(param, type, old_val, old_modified):
|
||||
try:
|
||||
modified = os.stat(PARAM_PATH + param).st_mtime
|
||||
except OSError:
|
||||
return old_val, old_modified
|
||||
if old_modified != modified:
|
||||
new_val = param_get(param, type, old_val)
|
||||
new_modified = modified
|
||||
else:
|
||||
new_val = old_val
|
||||
new_modified = old_modified
|
||||
return new_val, new_modified
|
||||
|
||||
def param_get(param_name, type, default):
|
||||
try:
|
||||
val = params.get(param_name, encoding='utf8').rstrip('\x00')
|
||||
if type == 'bool':
|
||||
val = val == '1'
|
||||
elif type == 'int':
|
||||
val = int(val)
|
||||
elif type == 'float':
|
||||
val = float(val)
|
||||
except (TypeError, ValueError):
|
||||
val = default
|
||||
return val
|
||||
230
common/dp_conf.py
Normal file
230
common/dp_conf.py
Normal file
@@ -0,0 +1,230 @@
|
||||
#!/usr/bin/env python3.7
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import time
|
||||
from math import floor
|
||||
|
||||
'''
|
||||
* type: Bool, Int8, UInt8, UInt16, Float32
|
||||
* conf_type: param, struct
|
||||
* dependencies needs to use struct and loaded prior so we don't have to read the param multiple times.
|
||||
* update_once: True, False (the param will only load up once, need both param and struct defined)
|
||||
'''
|
||||
confs = [
|
||||
# thermald data
|
||||
{'name': 'dp_thermal_started', 'default': False, 'type': 'Bool', 'conf_type': ['struct']},
|
||||
{'name': 'dp_thermal_overheat', 'default': False, 'type': 'Bool', 'conf_type': ['struct']},
|
||||
|
||||
# custom api server
|
||||
{'name': 'dp_api_custom', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_api_custom_url', 'default': 'https://api.retropilot.org', 'type': 'Text', 'depends': [{'name': 'dp_api_custom', 'vals': [True]}], 'conf_type': ['param']},
|
||||
|
||||
{'name': 'dp_atl', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct'], 'update_once': True},
|
||||
{'name': 'dp_atl_op_long', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [True]}], 'conf_type': ['param', 'struct'], 'update_once': True},
|
||||
# dashcam related
|
||||
{'name': 'dp_dashcamd', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
# auto shutdown
|
||||
{'name': 'dp_auto_shutdown', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_auto_shutdown_in', 'default': 90, 'type': 'UInt16', 'min': 0, 'max': 600, 'depends': [{'name': 'dp_auto_shutdown', 'vals': [True]}], 'conf_type': ['param']},
|
||||
# service
|
||||
{'name': 'dp_updated', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_logger', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_athenad', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct'], 'update_once': True},
|
||||
{'name': 'dp_uploader', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct'], 'update_once': True},
|
||||
# {'name': 'dp_gpxd', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_hotspot_on_boot', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
# lat ctrl
|
||||
{'name': 'dp_lateral_mode', 'default': 1, 'type': 'UInt8', 'min': 0, 'max': 2, 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_signal_off_delay', 'default': 3., 'type': 'Float32', 'min': 0., 'max': 10., 'depends': [{'name': 'dp_lateral_mode', 'vals': [0]}], 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_lc_min_mph', 'default': 45, 'type': 'UInt8', 'min': 0, 'max': 255, 'depends': [{'name': 'dp_lateral_mode', 'vals': [1,2]}], 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_lc_auto_cont', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_lateral_mode', 'vals': [2]}], 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_lc_auto_min_mph', 'default': 60, 'type': 'UInt8', 'min': 0, 'max': 255, 'depends': [{'name': 'dp_lateral_mode', 'vals': [2]}], 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_lc_auto_delay', 'default': 3., 'type': 'Float32', 'min': 0., 'max': 10., 'depends': [{'name': 'dp_lateral_mode', 'vals': [2]}], 'conf_type': ['param', 'struct']},
|
||||
# long ctrl
|
||||
{'name': 'dp_allow_gas', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_following_profile_ctrl', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_following_profile', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 2, 'depends': [{'name': 'dp_following_profile_ctrl', 'vals': [True]}], 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_accel_profile_ctrl', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_accel_profile', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 2, 'depends': [{'name': 'dp_accel_profile_ctrl', 'vals': [True]}], 'conf_type': ['param', 'struct']},
|
||||
# safety
|
||||
{'name': 'dp_gear_check', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_speed_check', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_temp_monitor', 'default': True, 'type': 'Bool', 'conf_type': ['param']},
|
||||
# UIs
|
||||
{'name': 'dp_ui_display_mode', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 2, 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_ui_speed', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_ui_event', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_ui_max_speed', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_ui_face', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_ui_lane', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_ui_lead', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_ui_side', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_ui_top', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_ui_blinker', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_ui_brightness', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 100, 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_ui_volume', 'default': -5, 'type': 'Int8', 'min': -5, 'max': 100, 'conf_type': ['param', 'struct']},
|
||||
# toyota
|
||||
{'name': 'dp_lexus_rx_rpm_fix', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_toyota_ldw', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_toyota_sng', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_toyota_zss', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_toyota_fp_btn_link', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_toyota_ap_btn_link', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_toyota_disable_relay', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_toyota_cruise_override', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_toyota_cruise_override_vego', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_toyota_cruise_override', 'vals': [True]}], 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_toyota_cruise_override_at', 'default': 44, 'type': 'Float32', 'depends': [{'name': 'dp_toyota_cruise_override', 'vals': [True]}], 'min': 0, 'max': 50., 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_toyota_cruise_override_speed', 'default': 32, 'type': 'Float32', 'depends': [{'name': 'dp_toyota_cruise_override', 'vals': [True]}], 'min': 0, 'max': 50., 'conf_type': ['param', 'struct']},
|
||||
# hyundai
|
||||
{'name': 'dp_hkg_smart_mdps', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
# honda
|
||||
{'name': 'dp_honda_eps_mod', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_honda_kmh_display', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
# volkswagen
|
||||
{'name': 'dp_vw_panda', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_vw_timebomb_assist', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
#misc
|
||||
{'name': 'dp_ip_addr', 'default': '', 'type': 'Text', 'conf_type': ['struct']},
|
||||
{'name': 'dp_fan_mode', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 2, 'conf_type': ['param']},
|
||||
{'name': 'dp_last_modified', 'default': str(floor(time.time())), 'type': 'Text', 'conf_type': ['param']},
|
||||
{'name': 'dp_camera_offset', 'default': 6, 'type': 'Int8', 'min': -100, 'max': 100, 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_path_offset', 'default': 0, 'type': 'Int8', 'min': -100, 'max': 100, 'conf_type': ['param', 'struct']},
|
||||
|
||||
{'name': 'dp_locale', 'default': 'en-US', 'type': 'Text', 'conf_type': ['param', 'struct'], 'update_once': True},
|
||||
{'name': 'dp_reg', 'default': True, 'type': 'Bool', 'conf_type': ['param']},
|
||||
# sr learner related
|
||||
{'name': 'dp_sr_learner', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_sr_custom', 'default': 9.99, 'min': 9.99, 'max': 30., 'type': 'Float32', 'depends': [{'name': 'dp_sr_learner', 'vals': [False]}], 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_sr_stock', 'default': 9.99, 'min': 9.99, 'max': 100., 'type': 'Float32', 'conf_type': ['param']},
|
||||
|
||||
{'name': 'dp_lqr', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_reset_live_param_on_start', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
|
||||
{'name': 'dp_appd', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
{'name': 'dp_jetson', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_car_assigned', 'default': '', 'type': 'Text', 'conf_type': ['param']},
|
||||
{'name': 'dp_car_list', 'default': '', 'type': 'Text', 'conf_type': ['param']},
|
||||
{'name': 'dp_no_batt', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_last_candidate', 'default': '', 'type': 'Text', 'conf_type': ['param']},
|
||||
{'name': 'dp_prebuilt', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_gpxd', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
|
||||
{'name': 'dp_mapd', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
# custom server support
|
||||
# {'name': 'dp_custom_server', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
|
||||
# {'name': 'dp_custom_server_url', 'default': 'api.retropilot.org', 'type': 'Text', 'depends': [{'name': 'dp_custom_server', 'vals': [True]}], 'conf_type': ['param', 'struct']},
|
||||
]
|
||||
|
||||
def get_definition(name):
|
||||
for conf in confs:
|
||||
if conf['name'] == name:
|
||||
return conf
|
||||
return None
|
||||
|
||||
def to_param_val(name, val):
|
||||
conf = get_definition(name)
|
||||
if conf is not None:
|
||||
type = conf['type'].lower()
|
||||
try:
|
||||
if 'bool' in type:
|
||||
val = '1' if val else '0'
|
||||
elif 'int' in type:
|
||||
val = int(val)
|
||||
elif 'float' in type:
|
||||
val = float(val)
|
||||
return str(val)
|
||||
except (ValueError, TypeError):
|
||||
return ''
|
||||
return ''
|
||||
|
||||
def to_struct_val(name, val):
|
||||
conf = get_definition(name)
|
||||
if conf is not None:
|
||||
try:
|
||||
type = conf['type'].lower()
|
||||
if 'bool' in type:
|
||||
val = True if val == '1' else False
|
||||
elif 'int' in type:
|
||||
val = int(val)
|
||||
elif 'float' in type:
|
||||
val = float(val)
|
||||
return val
|
||||
except (ValueError, TypeError):
|
||||
return None
|
||||
return None
|
||||
|
||||
'''
|
||||
function to convert param name into struct name.
|
||||
'''
|
||||
def get_struct_name(snake_str):
|
||||
components = snake_str.split('_')
|
||||
# We capitalize the first letter of each component except the first one
|
||||
# with the 'title' method and join them together.
|
||||
return components[0] + ''.join(x.title() for x in components[1:])
|
||||
|
||||
'''
|
||||
function to generate struct for log.capnp
|
||||
'''
|
||||
def gen_log_struct():
|
||||
count = 0
|
||||
str = "# dp\n"
|
||||
str += "struct DragonConf {\n"
|
||||
for conf in confs:
|
||||
name = get_struct_name(conf['name'])
|
||||
if 'struct' in conf['conf_type']:
|
||||
str += f" {name} @{count} :{conf['type']};\n"
|
||||
count += 1
|
||||
str += "}"
|
||||
print(str)
|
||||
|
||||
'''
|
||||
function to generate support car list
|
||||
'''
|
||||
def get_support_car_list():
|
||||
attrs = ['FINGERPRINTS', 'FW_VERSIONS']
|
||||
cars = dict({"cars": []})
|
||||
for car_folder in [x[0] for x in os.walk('/data/openpilot/selfdrive/car')]:
|
||||
try:
|
||||
car_name = car_folder.split('/')[-1]
|
||||
if car_name != "mock":
|
||||
names = []
|
||||
for attr in attrs:
|
||||
values = __import__('selfdrive.car.%s.values' % car_name, fromlist=[attr])
|
||||
if hasattr(values, attr):
|
||||
attr_values = getattr(values, attr)
|
||||
else:
|
||||
continue
|
||||
if isinstance(attr_values, dict):
|
||||
for f, v in attr_values.items():
|
||||
if f not in names:
|
||||
names.append(f)
|
||||
names.sort()
|
||||
brand_models = {"brand": car_name.upper(), "models": names }
|
||||
cars["cars"].append(brand_models)
|
||||
except (ImportError, IOError, ValueError):
|
||||
pass
|
||||
return json.dumps(cars)
|
||||
|
||||
'''
|
||||
function to init param value.
|
||||
should add this into manager.py
|
||||
'''
|
||||
def init_params_vals(params):
|
||||
for conf in confs:
|
||||
if 'param' in conf['conf_type']:
|
||||
if conf['name'] == 'dp_car_list':
|
||||
params.put(conf['name'], get_support_car_list())
|
||||
elif params.get(conf['name']) is None:
|
||||
params.put(conf['name'], to_param_val(conf['name'], conf['default']))
|
||||
|
||||
def gen_params_cc_keys():
|
||||
for conf in confs:
|
||||
if 'param' in conf['conf_type']:
|
||||
print(" {\"%s\", PERSISTENT}," % conf['name'])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if (len(sys.argv) > 1) and sys.argv[1] == 'cc':
|
||||
gen_params_cc_keys()
|
||||
else:
|
||||
gen_log_struct()
|
||||
7
common/dp_time.py
Normal file
7
common/dp_time.py
Normal file
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env python3.7
|
||||
|
||||
# delay of reading last modified
|
||||
LAST_MODIFIED_THERMALD = 10.
|
||||
LAST_MODIFIED_SYSTEMD = 1.
|
||||
LAST_MODIFIED_LANE_PLANNER = 3.
|
||||
LAST_MODIFIED_UPLOADER = 10.
|
||||
@@ -79,6 +79,25 @@ class NamedTemporaryDir():
|
||||
self.close()
|
||||
|
||||
|
||||
class CallbackReader:
|
||||
"""Wraps a file, but overrides the read method to also
|
||||
call a callback function with the number of bytes read so far."""
|
||||
def __init__(self, f, callback, *args):
|
||||
self.f = f
|
||||
self.callback = callback
|
||||
self.cb_args = args
|
||||
self.total_read = 0
|
||||
|
||||
def __getattr__(self, attr):
|
||||
return getattr(self.f, attr)
|
||||
|
||||
def read(self, *args, **kwargs):
|
||||
chunk = self.f.read(*args, **kwargs)
|
||||
self.total_read += len(chunk)
|
||||
self.callback(*self.cb_args, self.total_read)
|
||||
return chunk
|
||||
|
||||
|
||||
def _get_fileobject_func(writer, temp_dir):
|
||||
def _get_fileobject():
|
||||
file_obj = writer.get_fileobject(dir=temp_dir)
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
class FirstOrderFilter():
|
||||
class FirstOrderFilter:
|
||||
# first order filter
|
||||
def __init__(self, x0, ts, dt):
|
||||
self.k = (dt / ts) / (1. + dt / ts)
|
||||
def __init__(self, x0, rc, dt):
|
||||
self.x = x0
|
||||
self.dt = dt
|
||||
self.update_alpha(rc)
|
||||
|
||||
def update_alpha(self, rc):
|
||||
self.alpha = self.dt / (rc + self.dt)
|
||||
|
||||
def update(self, x):
|
||||
self.x = (1. - self.k) * self.x + self.k * x
|
||||
self.x = (1. - self.alpha) * self.x + self.alpha * x
|
||||
return self.x
|
||||
|
||||
14
common/i18n.py
Normal file
14
common/i18n.py
Normal file
@@ -0,0 +1,14 @@
|
||||
import gettext
|
||||
from selfdrive.hardware import EON
|
||||
from selfdrive.hardware.eon.hardware import getprop
|
||||
|
||||
locale_dir = '/data/openpilot/selfdrive/assets/locales'
|
||||
supported_language = ['en-US', 'zh-TW', 'zh-CN', 'ja-JP', 'ko-KR']
|
||||
|
||||
def get_locale():
|
||||
return getprop("persist.sys.locale") if EON else 'en-US'
|
||||
|
||||
def events():
|
||||
i18n = gettext.translation('events', localedir=locale_dir, fallback=True, languages=[get_locale()])
|
||||
i18n.install()
|
||||
return i18n.gettext
|
||||
@@ -17,7 +17,7 @@ cdef extern from "selfdrive/common/params.h":
|
||||
ALL
|
||||
|
||||
cdef cppclass Params:
|
||||
Params(bool) nogil
|
||||
Params() nogil
|
||||
Params(string) nogil
|
||||
string get(string, bool) nogil
|
||||
bool getBool(string) nogil
|
||||
@@ -26,3 +26,5 @@ cdef extern from "selfdrive/common/params.h":
|
||||
int putBool(string, bool) nogil
|
||||
bool checkKey(string) nogil
|
||||
void clearAll(ParamKeyType)
|
||||
|
||||
string get_params_path()
|
||||
|
||||
@@ -30,11 +30,11 @@ class UnknownKeyName(Exception):
|
||||
cdef class Params:
|
||||
cdef c_Params* p
|
||||
|
||||
def __cinit__(self, d=None, bool persistent_params=False):
|
||||
def __cinit__(self, d=None):
|
||||
cdef string path
|
||||
if d is None:
|
||||
with nogil:
|
||||
self.p = new c_Params(persistent_params)
|
||||
self.p = new c_Params()
|
||||
else:
|
||||
path = <string>d.encode()
|
||||
with nogil:
|
||||
@@ -106,6 +106,8 @@ cdef class Params:
|
||||
with nogil:
|
||||
self.p.remove(k)
|
||||
|
||||
def get_params_path(self):
|
||||
return self.p.get_params_path().decode("utf-8")
|
||||
|
||||
def put_nonblocking(key, val, d=None):
|
||||
def f(key, val):
|
||||
|
||||
@@ -6,7 +6,7 @@ import multiprocessing
|
||||
from typing import Optional
|
||||
|
||||
from common.clock import sec_since_boot # pylint: disable=no-name-in-module, import-error
|
||||
from selfdrive.hardware import PC, TICI
|
||||
from selfdrive.hardware import PC, TICI, JETSON
|
||||
|
||||
|
||||
# time step for each process
|
||||
@@ -33,12 +33,12 @@ class Priority:
|
||||
|
||||
|
||||
def set_realtime_priority(level: int) -> None:
|
||||
if not PC:
|
||||
if JETSON or not PC:
|
||||
os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(level)) # type: ignore[attr-defined]
|
||||
|
||||
|
||||
def set_core_affinity(core: int) -> None:
|
||||
if not PC:
|
||||
if JETSON or not PC:
|
||||
os.sched_setaffinity(0, [core,])
|
||||
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ class TextWindow:
|
||||
if self.text_proc is not None:
|
||||
while True:
|
||||
if self.get_status() == 1:
|
||||
os.system('/data/openpilot/scripts/reset_update.sh')
|
||||
return
|
||||
time.sleep(0.1)
|
||||
|
||||
|
||||
@@ -5,12 +5,14 @@ from selfdrive.hardware import TICI
|
||||
|
||||
## -- hardcoded hardware params --
|
||||
eon_f_focal_length = 910.0
|
||||
eon_d_focal_length = 650.0
|
||||
eon_d_focal_length = 860.0
|
||||
leon_d_focal_length = 650.0
|
||||
tici_f_focal_length = 2648.0
|
||||
tici_e_focal_length = tici_d_focal_length = 567.0 # probably wrong? magnification is not consistent across frame
|
||||
|
||||
eon_f_frame_size = (1164, 874)
|
||||
eon_d_frame_size = (816, 612)
|
||||
eon_d_frame_size = (1152, 864)
|
||||
leon_d_frame_size = (816, 612)
|
||||
tici_f_frame_size = tici_e_frame_size = tici_d_frame_size = (1928, 1208)
|
||||
|
||||
# aka 'K' aka camera_frame_from_view_frame
|
||||
@@ -20,6 +22,11 @@ eon_fcam_intrinsics = np.array([
|
||||
[0.0, 0.0, 1.0]])
|
||||
eon_intrinsics = eon_fcam_intrinsics # xx
|
||||
|
||||
leon_dcam_intrinsics = np.array([
|
||||
[leon_d_focal_length, 0.0, float(leon_d_frame_size[0])/2],
|
||||
[0.0, leon_d_focal_length, float(leon_d_frame_size[1])/2],
|
||||
[0.0, 0.0, 1.0]])
|
||||
|
||||
eon_dcam_intrinsics = np.array([
|
||||
[eon_d_focal_length, 0.0, float(eon_d_frame_size[0])/2],
|
||||
[0.0, eon_d_focal_length, float(eon_d_frame_size[1])/2],
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
cd /data/openpilot
|
||||
exec ./launch_openpilot.sh
|
||||
34
installer/custom/install_gfortran.sh
Normal file
34
installer/custom/install_gfortran.sh
Normal file
@@ -0,0 +1,34 @@
|
||||
#!/data/data/com.termux/files/usr/bin/sh
|
||||
# Get some needed tools. coreutils for mkdir command, gnugp for the signing key, and apt-transport-https to actually connect to the repo
|
||||
apt-get update
|
||||
apt-get --assume-yes upgrade
|
||||
apt-get --assume-yes install coreutils gnupg
|
||||
|
||||
# Make the sources.list.d directory
|
||||
mkdir -p $PREFIX/etc/apt/sources.list.d
|
||||
|
||||
# Write the needed source file
|
||||
echo "deb https://its-pointless.github.io/files/24 termux extras" > $PREFIX/etc/apt/sources.list.d/pointless.list
|
||||
|
||||
# Add signing key from https://its-pointless.github.io/pointless.gpg
|
||||
curl -sL https://its-pointless.github.io/pointless.gpg | apt-key add -
|
||||
|
||||
# Update apt
|
||||
apt update
|
||||
|
||||
# install gfortran
|
||||
apt install gcc-11 -y
|
||||
setupclang-gfort-11
|
||||
|
||||
# Elf cleaner is needed to remove a DT_ENTRY warning that prints out when gfortran -v is called to get
|
||||
# its version number and this breaks the pip installation script when fortran is used.
|
||||
|
||||
# Build elf cleaner
|
||||
SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
|
||||
ELFCLEANERPATH=$SCRIPTPATH/termux-elf-cleaner/
|
||||
cd $ELFCLEANERPATH
|
||||
make
|
||||
|
||||
# Perform elf cleaner on gfortran
|
||||
./termux-elf-cleaner $(which gfortran)
|
||||
|
||||
674
installer/custom/termux-elf-cleaner/COPYING
Normal file
674
installer/custom/termux-elf-cleaner/COPYING
Normal file
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
{one line to give the program's name and a brief idea of what it does.}
|
||||
Copyright (C) {year} {name of author}
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
{project} Copyright (C) {year} {fullname}
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
16
installer/custom/termux-elf-cleaner/Makefile
Normal file
16
installer/custom/termux-elf-cleaner/Makefile
Normal file
@@ -0,0 +1,16 @@
|
||||
CXXFLAGS += -std=c++11 -Wall -Wextra -pedantic
|
||||
PREFIX ?= /usr/local
|
||||
|
||||
termux-elf-cleaner: termux-elf-cleaner.cpp
|
||||
|
||||
clean:
|
||||
rm -f termux-elf-cleaner
|
||||
|
||||
install: termux-elf-cleaner
|
||||
mkdir -p $(PREFIX)/bin
|
||||
install termux-elf-cleaner $(PREFIX)/bin/termux-elf-cleaner
|
||||
|
||||
uninstall:
|
||||
rm -f $(PREFIX)/bin/termux-elf-cleaner
|
||||
|
||||
.PHONY: clean install uninstall
|
||||
39
installer/custom/termux-elf-cleaner/README.md
Normal file
39
installer/custom/termux-elf-cleaner/README.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# termux-elf-cleaner
|
||||
Utility for Android ELF files to remove unused parts that the linker warns about.
|
||||
|
||||
## Description
|
||||
When loading ELF files, the Android linker warns about unsupported dynamic section entries with warnings such as:
|
||||
|
||||
WARNING: linker: /data/data/org.kost.nmap.android.networkmapper/bin/nmap: unused DT entry: type 0x6ffffffe arg 0x8a7d4
|
||||
WARNING: linker: /data/data/org.kost.nmap.android.networkmapper/bin/nmap: unused DT entry: type 0x6fffffff arg 0x3
|
||||
|
||||
This utility strips away the following dynamic section entries:
|
||||
|
||||
- `DT_RPATH` - not supported in any Android version.
|
||||
- `DT_RUNPATH` - supported from Android 7.0.
|
||||
- `DT_VERDEF` - supported from Android 6.0.
|
||||
- `DT_VERDEFNUM` - supported from Android 6.0.
|
||||
- `DT_VERNEEDED` - supported from Android 6.0.
|
||||
- `DT_VERNEEDNUM` - supported from Android 6.0.
|
||||
- `DT_VERSYM` - supported from Android 6.0.
|
||||
|
||||
It also removes the three ELF sections of type:
|
||||
|
||||
- `SHT_GNU_verdef`
|
||||
- `SHT_GNU_verneed`
|
||||
- `SHT_GNU_versym`
|
||||
|
||||
## Usage
|
||||
```sh
|
||||
usage: termux-elf-cleaner <filenames>
|
||||
|
||||
Processes ELF files to remove unsupported section types and
|
||||
dynamic section entries which the Android linker warns about.
|
||||
```
|
||||
|
||||
## Author
|
||||
Fredrik Fornwall ([@fornwall](https://github.com/fornwall)).
|
||||
|
||||
## License
|
||||
|
||||
SPDX-License-Identifier: [GPL-3.0-or-later](https://spdx.org/licenses/GPL-3.0-or-later.html)
|
||||
211
installer/custom/termux-elf-cleaner/elf.h
Normal file
211
installer/custom/termux-elf-cleaner/elf.h
Normal file
@@ -0,0 +1,211 @@
|
||||
#ifndef ELF_H_INCLUDED
|
||||
#define ELF_H_INCLUDED
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* Type for a 16-bit quantity. */
|
||||
typedef uint16_t Elf32_Half;
|
||||
typedef uint16_t Elf64_Half;
|
||||
|
||||
/* Types for signed and unsigned 32-bit quantities. */
|
||||
typedef uint32_t Elf32_Word;
|
||||
typedef int32_t Elf32_Sword;
|
||||
typedef uint32_t Elf64_Word;
|
||||
typedef int32_t Elf64_Sword;
|
||||
|
||||
/* Types for signed and unsigned 64-bit quantities. */
|
||||
typedef uint64_t Elf32_Xword;
|
||||
typedef int64_t Elf32_Sxword;
|
||||
typedef uint64_t Elf64_Xword;
|
||||
typedef int64_t Elf64_Sxword;
|
||||
|
||||
/* Type of addresses. */
|
||||
typedef uint32_t Elf32_Addr;
|
||||
typedef uint64_t Elf64_Addr;
|
||||
|
||||
/* Type of file offsets. */
|
||||
typedef uint32_t Elf32_Off;
|
||||
typedef uint64_t Elf64_Off;
|
||||
|
||||
/* Type for section indices, which are 16-bit quantities. */
|
||||
typedef uint16_t Elf32_Section;
|
||||
typedef uint16_t Elf64_Section;
|
||||
|
||||
/* Type for version symbol information. */
|
||||
typedef Elf32_Half Elf32_Versym;
|
||||
typedef Elf64_Half Elf64_Versym;
|
||||
|
||||
|
||||
/* The ELF file header. This appears at the start of every ELF file. */
|
||||
typedef struct {
|
||||
unsigned char e_ident[16]; /* Magic number and other info */
|
||||
Elf32_Half e_type; /* Object file type */
|
||||
Elf32_Half e_machine; /* Architecture */
|
||||
Elf32_Word e_version; /* Object file version */
|
||||
Elf32_Addr e_entry; /* Entry point virtual address */
|
||||
Elf32_Off e_phoff; /* Program header table (usually follows elf header directly) file offset */
|
||||
Elf32_Off e_shoff; /* Section header table (at end of file) file offset */
|
||||
Elf32_Word e_flags; /* Processor-specific flags */
|
||||
Elf32_Half e_ehsize; /* ELF header size in bytes */
|
||||
Elf32_Half e_phentsize; /* Program header table entry size */
|
||||
Elf32_Half e_phnum; /* Program header table entry count */
|
||||
Elf32_Half e_shentsize; /* Section header table entry size */
|
||||
Elf32_Half e_shnum; /* Section header table entry count */
|
||||
Elf32_Half e_shstrndx; /* Section header string table index */
|
||||
} Elf32_Ehdr;
|
||||
typedef struct {
|
||||
unsigned char e_ident[16]; /* Magic number and other info */
|
||||
Elf64_Half e_type; /* Object file type */
|
||||
Elf64_Half e_machine; /* Architecture */
|
||||
Elf64_Word e_version; /* Object file version */
|
||||
Elf64_Addr e_entry; /* Entry point virtual address */
|
||||
Elf64_Off e_phoff; /* Program header table file offset */
|
||||
Elf64_Off e_shoff; /* Section header table file offset */
|
||||
Elf64_Word e_flags; /* Processor-specific flags */
|
||||
Elf64_Half e_ehsize; /* ELF header size in bytes */
|
||||
Elf64_Half e_phentsize; /* Program header table entry size */
|
||||
Elf64_Half e_phnum; /* Program header table entry count */
|
||||
Elf64_Half e_shentsize; /* Section header table entry size */
|
||||
Elf64_Half e_shnum; /* Section header table entry count */
|
||||
Elf64_Half e_shstrndx; /* Section header string table index */
|
||||
} Elf64_Ehdr;
|
||||
|
||||
/* Section header entry. The number of section entries in the file are determined by the "e_shnum" field of the ELF header.*/
|
||||
typedef struct {
|
||||
Elf32_Word sh_name; /* Section name (string tbl index) */
|
||||
Elf32_Word sh_type; /* Section type */
|
||||
Elf32_Word sh_flags; /* Section flags */
|
||||
Elf32_Addr sh_addr; /* Section virtual addr at execution */
|
||||
Elf32_Off sh_offset; /* Section file offset */
|
||||
Elf32_Word sh_size; /* Section size in bytes */
|
||||
Elf32_Word sh_link; /* Link to another section */
|
||||
Elf32_Word sh_info; /* Additional section information */
|
||||
Elf32_Word sh_addralign; /* Section alignment */
|
||||
Elf32_Word sh_entsize; /* Entry size if section holds table */
|
||||
} Elf32_Shdr;
|
||||
typedef struct {
|
||||
Elf64_Word sh_name; /* Section name (string tbl index) */
|
||||
Elf64_Word sh_type; /* Section type */
|
||||
Elf64_Xword sh_flags; /* Section flags */
|
||||
Elf64_Addr sh_addr; /* Section virtual addr at execution */
|
||||
Elf64_Off sh_offset; /* Section file offset */
|
||||
Elf64_Xword sh_size; /* Section size in bytes */
|
||||
Elf64_Word sh_link; /* Link to another section */
|
||||
Elf64_Word sh_info; /* Additional section information */
|
||||
Elf64_Xword sh_addralign; /* Section alignment */
|
||||
Elf64_Xword sh_entsize; /* Entry size if section holds table */
|
||||
} Elf64_Shdr;
|
||||
|
||||
/* Legal values for sh_type (section type). */
|
||||
#define SHT_NULL 0 /* Section header table entry unused */
|
||||
#define SHT_PROGBITS 1 /* Program data */
|
||||
#define SHT_SYMTAB 2 /* Symbol table */
|
||||
#define SHT_STRTAB 3 /* String table */
|
||||
#define SHT_RELA 4 /* Relocation entries with addends */
|
||||
#define SHT_HASH 5 /* Symbol hash table */
|
||||
#define SHT_DYNAMIC 6 /* Dynamic linking information. Contains Elf32_Dyn/Elf64_Dyn entries. */
|
||||
#define SHT_NOTE 7 /* Notes */
|
||||
#define SHT_NOBITS 8 /* Program space with no data (bss) */
|
||||
#define SHT_REL 9 /* Relocation entries, no addends */
|
||||
#define SHT_SHLIB 10 /* Reserved */
|
||||
#define SHT_DYNSYM 11 /* Dynamic linker symbol table */
|
||||
#define SHT_INIT_ARRAY 14 /* Array of constructors */
|
||||
#define SHT_FINI_ARRAY 15 /* Array of destructors */
|
||||
#define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */
|
||||
#define SHT_GROUP 17 /* Section group */
|
||||
#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */
|
||||
#define SHT_NUM 19 /* Number of defined types. */
|
||||
#define SHT_LOOS 0x60000000 /* Start OS-specific. */
|
||||
#define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes. */
|
||||
#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */
|
||||
#define SHT_GNU_LIBLIST 0x6ffffff7 /* Prelink library list */
|
||||
#define SHT_CHECKSUM 0x6ffffff8 /* Checksum for DSO content. */
|
||||
#define SHT_LOSUNW 0x6ffffffa /* Sun-specific low bound. */
|
||||
#define SHT_SUNW_move 0x6ffffffa
|
||||
#define SHT_SUNW_COMDAT 0x6ffffffb
|
||||
#define SHT_SUNW_syminfo 0x6ffffffc
|
||||
#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */
|
||||
#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */
|
||||
#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */
|
||||
#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */
|
||||
#define SHT_HIOS 0x6fffffff /* End OS-specific type */
|
||||
#define SHT_LOPROC 0x70000000 /* Start of processor-specific */
|
||||
#define SHT_HIPROC 0x7fffffff /* End of processor-specific */
|
||||
#define SHT_LOUSER 0x80000000 /* Start of application-specific */
|
||||
#define SHT_HIUSER 0x8fffffff /* End of application-specific */
|
||||
|
||||
/* Dynamic section entry. */
|
||||
typedef struct {
|
||||
Elf32_Sword d_tag; /* Dynamic entry type */
|
||||
union { Elf32_Word d_val; Elf32_Addr d_ptr; } d_un; /* Integer or address value */
|
||||
} Elf32_Dyn;
|
||||
typedef struct {
|
||||
Elf64_Sxword d_tag; /* Dynamic entry type */
|
||||
union { Elf64_Xword d_val; Elf64_Addr d_ptr; } d_un; /* Integer or address value */
|
||||
} Elf64_Dyn;
|
||||
|
||||
/* Legal values for d_tag (dynamic entry type). */
|
||||
#define DT_NULL 0 /* Marks end of dynamic section */
|
||||
#define DT_NEEDED 1 /* Name of needed library */
|
||||
#define DT_PLTRELSZ 2 /* Size in bytes of PLT relocs */
|
||||
#define DT_PLTGOT 3 /* Processor defined value */
|
||||
#define DT_HASH 4 /* Address of symbol hash table */
|
||||
#define DT_STRTAB 5 /* Address of string table */
|
||||
#define DT_SYMTAB 6 /* Address of symbol table */
|
||||
#define DT_RELA 7 /* Address of Rela relocs */
|
||||
#define DT_RELASZ 8 /* Total size of Rela relocs */
|
||||
#define DT_RELAENT 9 /* Size of one Rela reloc */
|
||||
#define DT_STRSZ 10 /* Size of string table */
|
||||
#define DT_SYMENT 11 /* Size of one symbol table entry */
|
||||
#define DT_INIT 12 /* Address of init function */
|
||||
#define DT_FINI 13 /* Address of termination function */
|
||||
#define DT_SONAME 14 /* Name of shared object */
|
||||
#define DT_RPATH 15 /* Library search path (deprecated) */
|
||||
#define DT_SYMBOLIC 16 /* Start symbol search here */
|
||||
#define DT_REL 17 /* Address of Rel relocs */
|
||||
#define DT_RELSZ 18 /* Total size of Rel relocs */
|
||||
#define DT_RELENT 19 /* Size of one Rel reloc */
|
||||
#define DT_PLTREL 20 /* Type of reloc in PLT */
|
||||
#define DT_DEBUG 21 /* For debugging; unspecified */
|
||||
#define DT_TEXTREL 22 /* Reloc might modify .text */
|
||||
#define DT_JMPREL 23 /* Address of PLT relocs */
|
||||
#define DT_BIND_NOW 24 /* Process relocations of object */
|
||||
#define DT_INIT_ARRAY 25 /* Array with addresses of init fct */
|
||||
#define DT_FINI_ARRAY 26 /* Array with addresses of fini fct */
|
||||
#define DT_INIT_ARRAYSZ 27 /* Size in bytes of DT_INIT_ARRAY */
|
||||
#define DT_FINI_ARRAYSZ 28 /* Size in bytes of DT_FINI_ARRAY */
|
||||
#define DT_RUNPATH 29 /* Library search path */
|
||||
#define DT_FLAGS 30 /* Flags for the object being loaded */
|
||||
#define DT_ENCODING 32 /* Start of encoded range */
|
||||
#define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/
|
||||
#define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */
|
||||
#define DT_NUM 34 /* Number used */
|
||||
#define DT_LOOS 0x6000000d /* Start of OS-specific */
|
||||
#define DT_HIOS 0x6ffff000 /* End of OS-specific */
|
||||
#define DT_VERDEF 0x6ffffffc
|
||||
#define DT_VERDEFNUM 0x6ffffffd
|
||||
#define DT_LOPROC 0x70000000 /* Start of processor-specific */
|
||||
#define DT_HIPROC 0x7fffffff /* End of processor-specific */
|
||||
|
||||
|
||||
/* Symbol table entry. */
|
||||
typedef struct {
|
||||
Elf32_Word st_name; /* Symbol name (string tbl index) */
|
||||
Elf32_Addr st_value; /* Symbol value */
|
||||
Elf32_Word st_size; /* Symbol size */
|
||||
unsigned char st_info; /* Symbol type and binding */
|
||||
unsigned char st_other; /* Symbol visibility */
|
||||
Elf32_Section st_shndx; /* Section index */
|
||||
} Elf32_Sym;
|
||||
|
||||
typedef struct {
|
||||
Elf64_Word st_name; /* Symbol name (string tbl index) */
|
||||
unsigned char st_info; /* Symbol type and binding */
|
||||
unsigned char st_other; /* Symbol visibility */
|
||||
Elf64_Section st_shndx; /* Section index */
|
||||
Elf64_Addr st_value; /* Symbol value */
|
||||
Elf64_Xword st_size; /* Symbol size */
|
||||
} Elf64_Sym;
|
||||
|
||||
|
||||
#endif
|
||||
191
installer/custom/termux-elf-cleaner/termux-elf-cleaner.cpp
Normal file
191
installer/custom/termux-elf-cleaner/termux-elf-cleaner.cpp
Normal file
@@ -0,0 +1,191 @@
|
||||
#include <algorithm>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifndef __ANDROID_API__
|
||||
#define __ANDROID_API__ 21
|
||||
#endif
|
||||
|
||||
// Include a local elf.h copy as not all platforms have it.
|
||||
#include "elf.h"
|
||||
|
||||
#define DT_GNU_HASH 0x6ffffef5
|
||||
#define DT_VERSYM 0x6ffffff0
|
||||
#define DT_FLAGS_1 0x6ffffffb
|
||||
#define DT_VERNEEDED 0x6ffffffe
|
||||
#define DT_VERNEEDNUM 0x6fffffff
|
||||
|
||||
#define DF_1_NOW 0x00000001 /* Set RTLD_NOW for this object. */
|
||||
#define DF_1_GLOBAL 0x00000002 /* Set RTLD_GLOBAL for this object. */
|
||||
#define DF_1_NODELETE 0x00000008 /* Set RTLD_NODELETE for this object.*/
|
||||
|
||||
#if __ANDROID_API__ < 23
|
||||
#define SUPPORTED_DT_FLAGS_1 (DF_1_NOW | DF_1_GLOBAL)
|
||||
#else
|
||||
// The supported DT_FLAGS_1 values as of Android 6.0.
|
||||
#define SUPPORTED_DT_FLAGS_1 (DF_1_NOW | DF_1_GLOBAL | DF_1_NODELETE)
|
||||
#endif
|
||||
|
||||
template<typename ElfHeaderType /*Elf{32,64}_Ehdr*/,
|
||||
typename ElfSectionHeaderType /*Elf{32,64}_Shdr*/,
|
||||
typename ElfDynamicSectionEntryType /* Elf{32,64}_Dyn */>
|
||||
bool process_elf(uint8_t* bytes, size_t elf_file_size, char const* file_name)
|
||||
{
|
||||
if (sizeof(ElfSectionHeaderType) > elf_file_size) {
|
||||
fprintf(stderr, "termux-elf-cleaner: Elf header for '%s' would end at %zu but file size only %zu\n", file_name, sizeof(ElfSectionHeaderType), elf_file_size);
|
||||
return false;
|
||||
}
|
||||
ElfHeaderType* elf_hdr = reinterpret_cast<ElfHeaderType*>(bytes);
|
||||
|
||||
size_t last_section_header_byte = elf_hdr->e_shoff + sizeof(ElfSectionHeaderType) * elf_hdr->e_shnum;
|
||||
if (last_section_header_byte > elf_file_size) {
|
||||
fprintf(stderr, "termux-elf-cleaner: Section header for '%s' would end at %zu but file size only %zu\n", file_name, last_section_header_byte, elf_file_size);
|
||||
return false;
|
||||
}
|
||||
ElfSectionHeaderType* section_header_table = reinterpret_cast<ElfSectionHeaderType*>(bytes + elf_hdr->e_shoff);
|
||||
|
||||
for (unsigned int i = 1; i < elf_hdr->e_shnum; i++) {
|
||||
ElfSectionHeaderType* section_header_entry = section_header_table + i;
|
||||
if (section_header_entry->sh_type == SHT_DYNAMIC) {
|
||||
size_t const last_dynamic_section_byte = section_header_entry->sh_offset + section_header_entry->sh_size;
|
||||
if (last_dynamic_section_byte > elf_file_size) {
|
||||
fprintf(stderr, "termux-elf-cleaner: Dynamic section for '%s' would end at %zu but file size only %zu\n", file_name, last_dynamic_section_byte, elf_file_size);
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t const dynamic_section_entries = section_header_entry->sh_size / sizeof(ElfDynamicSectionEntryType);
|
||||
ElfDynamicSectionEntryType* const dynamic_section =
|
||||
reinterpret_cast<ElfDynamicSectionEntryType*>(bytes + section_header_entry->sh_offset);
|
||||
|
||||
unsigned int last_nonnull_entry_idx = 0;
|
||||
for (unsigned int j = dynamic_section_entries - 1; j > 0; j--) {
|
||||
ElfDynamicSectionEntryType* dynamic_section_entry = dynamic_section + j;
|
||||
if (dynamic_section_entry->d_tag != DT_NULL) {
|
||||
last_nonnull_entry_idx = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned int j = 0; j < dynamic_section_entries; j++) {
|
||||
ElfDynamicSectionEntryType* dynamic_section_entry = dynamic_section + j;
|
||||
char const* removed_name = nullptr;
|
||||
switch (dynamic_section_entry->d_tag) {
|
||||
#if __ANDROID_API__ <= 21
|
||||
case DT_GNU_HASH: removed_name = "DT_GNU_HASH"; break;
|
||||
#endif
|
||||
#if __ANDROID_API__ < 23
|
||||
case DT_VERSYM: removed_name = "DT_VERSYM"; break;
|
||||
case DT_VERNEEDED: removed_name = "DT_VERNEEDED"; break;
|
||||
case DT_VERNEEDNUM: removed_name = "DT_VERNEEDNUM"; break;
|
||||
case DT_VERDEF: removed_name = "DT_VERDEF"; break;
|
||||
case DT_VERDEFNUM: removed_name = "DT_VERDEFNUM"; break;
|
||||
#endif
|
||||
case DT_RPATH: removed_name = "DT_RPATH"; break;
|
||||
#if __ANDROID_API__ < 24
|
||||
case DT_RUNPATH: removed_name = "DT_RUNPATH"; break;
|
||||
#endif
|
||||
}
|
||||
if (removed_name != nullptr) {
|
||||
printf("termux-elf-cleaner: Removing the %s dynamic section entry from '%s'\n", removed_name, file_name);
|
||||
// Tag the entry with DT_NULL and put it last:
|
||||
dynamic_section_entry->d_tag = DT_NULL;
|
||||
// Decrease j to process new entry index:
|
||||
std::swap(dynamic_section[j--], dynamic_section[last_nonnull_entry_idx--]);
|
||||
} else if (dynamic_section_entry->d_tag == DT_FLAGS_1) {
|
||||
// Remove unsupported DF_1_* flags to avoid linker warnings.
|
||||
decltype(dynamic_section_entry->d_un.d_val) orig_d_val =
|
||||
dynamic_section_entry->d_un.d_val;
|
||||
decltype(dynamic_section_entry->d_un.d_val) new_d_val =
|
||||
(orig_d_val & SUPPORTED_DT_FLAGS_1);
|
||||
if (new_d_val != orig_d_val) {
|
||||
printf("termux-elf-cleaner: Replacing unsupported DF_1_* flags %llu with %llu in '%s'\n",
|
||||
(unsigned long long) orig_d_val,
|
||||
(unsigned long long) new_d_val,
|
||||
file_name);
|
||||
dynamic_section_entry->d_un.d_val = new_d_val;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#if __ANDROID_API__ < 23
|
||||
else if (section_header_entry->sh_type == SHT_GNU_verdef ||
|
||||
section_header_entry->sh_type == SHT_GNU_verneed ||
|
||||
section_header_entry->sh_type == SHT_GNU_versym) {
|
||||
printf("termux-elf-cleaner: Removing version section from '%s'\n", file_name);
|
||||
section_header_entry->sh_type = SHT_NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char const** argv)
|
||||
{
|
||||
if (argc < 2 || (argc == 2 && strcmp(argv[1], "-h")==0)) {
|
||||
fprintf(stderr, "usage: %s <filenames>\n", argv[0]);
|
||||
fprintf(stderr, "\nProcesses ELF files to remove unsupported section types\n"
|
||||
"and dynamic section entries which the Android linker (API %d)\nwarns about.\n",
|
||||
__ANDROID_API__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (int i = 1; i < argc; i++) {
|
||||
char const* file_name = argv[i];
|
||||
int fd = open(file_name, O_RDWR);
|
||||
if (fd < 0) {
|
||||
char* error_message;
|
||||
if (asprintf(&error_message, "open(\"%s\")", file_name) == -1) error_message = (char*) "open()";
|
||||
perror(error_message);
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct stat st;
|
||||
if (fstat(fd, &st) < 0) { perror("fstat()"); return 1; }
|
||||
|
||||
if (st.st_size < (long long) sizeof(Elf32_Ehdr)) {
|
||||
close(fd);
|
||||
continue;
|
||||
}
|
||||
|
||||
void* mem = mmap(0, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||
if (mem == MAP_FAILED) { perror("mmap()"); return 1; }
|
||||
|
||||
uint8_t* bytes = reinterpret_cast<uint8_t*>(mem);
|
||||
if (!(bytes[0] == 0x7F && bytes[1] == 'E' && bytes[2] == 'L' && bytes[3] == 'F')) {
|
||||
// Not the ELF magic number.
|
||||
munmap(mem, st.st_size);
|
||||
close(fd);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (bytes[/*EI_DATA*/5] != 1) {
|
||||
fprintf(stderr, "termux-elf-cleaner: Not little endianness in '%s'\n", file_name);
|
||||
munmap(mem, st.st_size);
|
||||
close(fd);
|
||||
continue;
|
||||
}
|
||||
|
||||
uint8_t const bit_value = bytes[/*EI_CLASS*/4];
|
||||
if (bit_value == 1) {
|
||||
if (!process_elf<Elf32_Ehdr, Elf32_Shdr, Elf32_Dyn>(bytes, st.st_size, file_name)) return 1;
|
||||
} else if (bit_value == 2) {
|
||||
if (!process_elf<Elf64_Ehdr, Elf64_Shdr, Elf64_Dyn>(bytes, st.st_size, file_name)) return 1;
|
||||
} else {
|
||||
printf("termux-elf-cleaner: Incorrect bit value %d in '%s'\n", bit_value, file_name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (msync(mem, st.st_size, MS_SYNC) < 0) { perror("msync()"); return 1; }
|
||||
|
||||
munmap(mem, st.st_size);
|
||||
close(fd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
7
installer/updater/oneplus.json
Normal file
7
installer/updater/oneplus.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"ota_url": "https://commadist.azureedge.net/neosupdate/ota-signed-5dc2575d713977666a8e14ae1b43a04d7f63123934c80fa10751d949a107653e.zip",
|
||||
"ota_hash": "5dc2575d713977666a8e14ae1b43a04d7f63123934c80fa10751d949a107653e",
|
||||
"recovery_url": "https://commadist.azureedge.net/neosupdate/recovery-db31ffe79dfd60be966fba6d1525a5081a920062b883644dc8f5734bcc6806bb.img",
|
||||
"recovery_len": 15926572,
|
||||
"recovery_hash": "db31ffe79dfd60be966fba6d1525a5081a920062b883644dc8f5734bcc6806bb"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ota_url": "https://commadist.azureedge.net/neosupdate/ota-signed-c4f56c62c5603c86e2ae9d83008a8d42a91319979661d0c42fb97b85d9112266.zip",
|
||||
"ota_hash": "c4f56c62c5603c86e2ae9d83008a8d42a91319979661d0c42fb97b85d9112266",
|
||||
"recovery_url": "https://commadist.azureedge.net/neosupdate/recovery-c5db3790c3b09756e8e896187ddb3f1258315eb0a86030468baa187b84a3bbf5.img",
|
||||
"recovery_len": 15209772,
|
||||
"recovery_hash": "c5db3790c3b09756e8e896187ddb3f1258315eb0a86030468baa187b84a3bbf5"
|
||||
"ota_url": "https://commadist.azureedge.net/neosupdate/ota-signed-5dc2575d713977666a8e14ae1b43a04d7f63123934c80fa10751d949a107653e.zip",
|
||||
"ota_hash": "5dc2575d713977666a8e14ae1b43a04d7f63123934c80fa10751d949a107653e",
|
||||
"recovery_url": "https://commadist.azureedge.net/neosupdate/recovery-f01a55c9ba52ca57668d1684c6bf4118efd31916b04f8c1fcd8495013d3677eb.img",
|
||||
"recovery_len": 15222060,
|
||||
"recovery_hash": "f01a55c9ba52ca57668d1684c6bf4118efd31916b04f8c1fcd8495013d3677eb"
|
||||
}
|
||||
|
||||
BIN
installer/updater/update.zip
Normal file
BIN
installer/updater/update.zip
Normal file
Binary file not shown.
Binary file not shown.
@@ -125,10 +125,20 @@ int battery_current() {
|
||||
return atoi(current_now_s.c_str());
|
||||
}
|
||||
|
||||
bool has_no_battery() {
|
||||
if (FILE *file = fopen("/data/params/d/dp_no_batt", "r")) {
|
||||
fclose(file);
|
||||
std::string has_no_batt = util::read_file("/data/params/d/dp_no_batt");
|
||||
return atoi(has_no_batt.c_str()) == 1;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool check_battery() {
|
||||
int bat_cap = battery_capacity();
|
||||
int current_now = battery_current();
|
||||
return bat_cap > 35 || (current_now < 0 && bat_cap > 10);
|
||||
return (has_no_battery())? true : bat_cap > 35 || (current_now < 0 && bat_cap > 10);
|
||||
}
|
||||
|
||||
bool check_space() {
|
||||
|
||||
@@ -6,15 +6,37 @@ fi
|
||||
|
||||
source "$BASEDIR/launch_env.sh"
|
||||
|
||||
if ! $(grep -q "letv" /proc/cmdline); then
|
||||
mount -o remount,rw /system
|
||||
sed -i -e 's#/dev/input/event1#/dev/input/event2#g' ~/.bash_profile
|
||||
touch /ONEPLUS
|
||||
mount -o remount,r /system
|
||||
fi
|
||||
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
|
||||
|
||||
function two_init {
|
||||
if [ -f "/sdcard/dp_patcher.py" ]; then
|
||||
/data/data/com.termux/files/usr/bin/python /sdcard/dp_patcher.py
|
||||
fi
|
||||
/data/data/com.termux/files/usr/bin/python /data/openpilot/scripts/installers/font_installer.py
|
||||
/data/data/com.termux/files/usr/bin/python /data/openpilot/scripts/installers/sshkey_installer.py
|
||||
|
||||
# Wifi scan
|
||||
wpa_cli IFNAME=wlan0 SCAN
|
||||
# set IO scheduler
|
||||
setprop sys.io.scheduler noop
|
||||
for f in /sys/block/*/queue/scheduler; do
|
||||
echo noop > $f
|
||||
done
|
||||
|
||||
# *** shield cores 2-3 ***
|
||||
|
||||
# TODO: should we enable this?
|
||||
# offline cores 2-3 to force recurring timers onto the other cores
|
||||
#echo 0 > /sys/devices/system/cpu/cpu2/online
|
||||
#echo 0 > /sys/devices/system/cpu/cpu3/online
|
||||
#echo 1 > /sys/devices/system/cpu/cpu2/online
|
||||
#echo 1 > /sys/devices/system/cpu/cpu3/online
|
||||
|
||||
# android gets two cores
|
||||
echo 0-1 > /dev/cpuset/background/cpus
|
||||
echo 0-1 > /dev/cpuset/system-background/cpus
|
||||
@@ -56,6 +78,7 @@ function two_init {
|
||||
|
||||
# USB traffic needs realtime handling on cpu 3
|
||||
[ -d "/proc/irq/733" ] && echo 3 > /proc/irq/733/smp_affinity_list
|
||||
[ -d "/proc/irq/736" ] && echo 3 > /proc/irq/736/smp_affinity_list # USB for OP3T
|
||||
|
||||
# GPU and camera get cpu 2
|
||||
CAM_IRQS="177 178 179 180 181 182 183 184 185 186 192"
|
||||
@@ -75,20 +98,37 @@ function two_init {
|
||||
# disable bluetooth
|
||||
service call bluetooth_manager 8
|
||||
|
||||
# wifi scan
|
||||
wpa_cli IFNAME=wlan0 SCAN
|
||||
|
||||
# Check for NEOS update
|
||||
if [ $(< /VERSION) != "$REQUIRED_NEOS_VERSION" ]; then
|
||||
if [ -f "$DIR/scripts/continue.sh" ]; then
|
||||
cp "$DIR/scripts/continue.sh" "/data/data/com.termux/files/continue.sh"
|
||||
fi
|
||||
if $(grep -q "letv" /proc/cmdline); then
|
||||
if [ $(< /VERSION) != "$REQUIRED_NEOS_VERSION" ]; then
|
||||
if [ -f "$DIR/scripts/continue.sh" ]; then
|
||||
cp "$DIR/scripts/continue.sh" "/data/data/com.termux/files/continue.sh"
|
||||
fi
|
||||
|
||||
if [ ! -f "$BASEDIR/prebuilt" ]; then
|
||||
# Clean old build products, but preserve the scons cache
|
||||
cd $DIR
|
||||
git clean -xdf
|
||||
git submodule foreach --recursive git clean -xdf
|
||||
fi
|
||||
if [ ! -f "$BASEDIR/prebuilt" ]; then
|
||||
# Clean old build products, but preserve the scons cache
|
||||
cd $DIR
|
||||
git clean -xdf
|
||||
git submodule foreach --recursive git clean -xdf
|
||||
fi
|
||||
|
||||
"$DIR/installer/updater/updater" "file://$DIR/installer/updater/update.json"
|
||||
"$DIR/installer/updater/updater" "file://$DIR/installer/updater/update.json"
|
||||
fi
|
||||
fi
|
||||
|
||||
# One-time fix for a subset of OP3T with gyro orientation offsets.
|
||||
# Remove and regenerate qcom sensor registry. Only done on OP3T mainboards.
|
||||
# Performed exactly once. The old registry is preserved just-in-case, and
|
||||
# doubles as a flag denoting we've already done the reset.
|
||||
if ! $(grep -q "letv" /proc/cmdline) && [ ! -f "/persist/comma/op3t-sns-reg-backup" ]; then
|
||||
echo "Performing OP3T sensor registry reset"
|
||||
mv /persist/sensors/sns.reg /persist/comma/op3t-sns-reg-backup &&
|
||||
rm -f /persist/sensors/sensors_settings /persist/sensors/error_log /persist/sensors/gyro_sensitity_cal &&
|
||||
echo "restart" > /sys/kernel/debug/msm_subsys/slpi &&
|
||||
sleep 5 # Give Android sensor subsystem a moment to recover
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -134,10 +174,10 @@ function launch {
|
||||
# that completed successfully and synced to disk.
|
||||
|
||||
if [ -f "${BASEDIR}/.overlay_init" ]; then
|
||||
find ${BASEDIR}/.git -newer ${BASEDIR}/.overlay_init | grep -q '.' 2> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "${BASEDIR} has been modified, skipping overlay update installation"
|
||||
else
|
||||
# find ${BASEDIR}/.git -newer ${BASEDIR}/.overlay_init | grep -q '.' 2> /dev/null
|
||||
# if [ $? -eq 0 ]; then
|
||||
# echo "${BASEDIR} has been modified, skipping overlay update installation"
|
||||
# else
|
||||
if [ -f "${STAGING_ROOT}/finalized/.overlay_consistent" ]; then
|
||||
if [ ! -d /data/safe_staging/old_openpilot ]; then
|
||||
echo "Valid overlay update found, installing"
|
||||
@@ -161,13 +201,16 @@ function launch {
|
||||
# TODO: restore backup? This means the updater didn't start after swapping
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
# fi
|
||||
fi
|
||||
|
||||
# handle pythonpath
|
||||
ln -sfn $(pwd) /data/pythonpath
|
||||
export PYTHONPATH="$PWD:$PWD/pyextra"
|
||||
|
||||
# dp - ignore chmod changes
|
||||
git -C $DIR config core.fileMode false
|
||||
|
||||
# hardware specific init
|
||||
if [ -f /EON ]; then
|
||||
two_init
|
||||
@@ -180,7 +223,21 @@ function launch {
|
||||
|
||||
# start manager
|
||||
cd selfdrive/manager
|
||||
./build.py && ./manager.py
|
||||
if [ -f /EON ]; then
|
||||
if [ ! -f "/system/comma/usr/lib/libgfortran.so.5.0.0" ]; then
|
||||
mount -o remount,rw /system
|
||||
tar -zxvf /data/openpilot/selfdrive/mapd/assets/libgfortran.tar.gz -C /system/comma/usr/lib/
|
||||
mount -o remount,r /system
|
||||
fi
|
||||
if [ ! -d "/system/comma/usr/lib/python3.8/site-packages/opspline" ]; then
|
||||
mount -o remount,rw /system
|
||||
tar -zxvf /data/openpilot/selfdrive/mapd/assets/opspline.tar.gz -C /system/comma/usr/lib/python3.8/site-packages/
|
||||
mount -o remount,r /system
|
||||
fi
|
||||
./build.py && ./manager.py
|
||||
else
|
||||
./custom_dep.py && ./build.py && ./manager.py
|
||||
fi
|
||||
|
||||
# if broken, keep on screen error
|
||||
while true; do sleep 1; done
|
||||
|
||||
@@ -7,11 +7,11 @@ export OPENBLAS_NUM_THREADS=1
|
||||
export VECLIB_MAXIMUM_THREADS=1
|
||||
|
||||
if [ -z "$REQUIRED_NEOS_VERSION" ]; then
|
||||
export REQUIRED_NEOS_VERSION="17"
|
||||
export REQUIRED_NEOS_VERSION="18"
|
||||
fi
|
||||
|
||||
if [ -z "$AGNOS_VERSION" ]; then
|
||||
export AGNOS_VERSION="1.2"
|
||||
export AGNOS_VERSION="1.3"
|
||||
fi
|
||||
|
||||
if [ -z "$PASSIVE" ]; then
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
#!/usr/bin/bash
|
||||
size=$(du -sb .git/index 2>/dev/null|awk '{print $1}')
|
||||
echo $size|grep -E '^[0-9]+$' >/dev/null || size=0
|
||||
if [ $size -le 1024 ];then
|
||||
rm .git/index 2>/dev/null
|
||||
git reset
|
||||
fi
|
||||
|
||||
export PASSIVE="0"
|
||||
exec ./launch_chffrplus.sh
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -36,6 +36,8 @@ cdef class CANParser:
|
||||
def __init__(self, dbc_name, signals, checks=None, bus=0, enforce_checks=True):
|
||||
if checks is None:
|
||||
checks = []
|
||||
checks = []
|
||||
enforce_checks = False
|
||||
self.can_valid = True
|
||||
self.dbc_name = dbc_name
|
||||
self.dbc = dbc_lookup(dbc_name)
|
||||
|
||||
@@ -461,13 +461,15 @@ BO_ 892 CRUISE_PARAMS: 8 PCM
|
||||
BO_ 927 RADAR_HUD: 8 RADAR
|
||||
SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY
|
||||
SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY
|
||||
SG_ ZEROS_BOH3 : 31|32@0+ (1,0) [0|4294967295] "" XXX
|
||||
SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY
|
||||
SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX
|
||||
SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY
|
||||
SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ BOH : 40|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ BOH_2 : 30|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
|
||||
|
||||
|
||||
@@ -448,13 +448,15 @@ BO_ 432 STANDSTILL: 7 VSA
|
||||
BO_ 927 RADAR_HUD: 8 RADAR
|
||||
SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY
|
||||
SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY
|
||||
SG_ ZEROS_BOH3 : 31|32@0+ (1,0) [0|4294967295] "" XXX
|
||||
SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY
|
||||
SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX
|
||||
SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY
|
||||
SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ BOH : 40|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ BOH_2 : 30|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX
|
||||
|
||||
|
||||
414
opendbc/lexus_is300h_2017_pt_generated.dbc
Normal file
414
opendbc/lexus_is300h_2017_pt_generated.dbc
Normal file
@@ -0,0 +1,414 @@
|
||||
CM_ "AUTOGENERATED FILE, DO NOT EDIT"
|
||||
|
||||
|
||||
CM_ "Imported file _comma.dbc starts here"
|
||||
BO_ 359 STEERING_IPAS_COMMA: 8 IPAS
|
||||
SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
|
||||
SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
|
||||
SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_X00 : 55|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
CM BO_ STEERING_IPAS_COMMA "Copy of msg 614 so we can do angle control while the Park Assist ECU is connected (Panda spoofs 614 with 359 on connector J70). Note that addresses 0x266 and 0x167 are checksum-invariant";
|
||||
|
||||
BO_ 512 GAS_COMMAND: 6 EON
|
||||
SG_ GAS_COMMAND : 7|16@0+ (0.159375,-75.555) [0|1] "" INTERCEPTOR
|
||||
SG_ GAS_COMMAND2 : 23|16@0+ (0.159375,-151.111) [0|1] "" INTERCEPTOR
|
||||
SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
|
||||
SG_ COUNTER_PEDAL : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
|
||||
SG_ CHECKSUM_PEDAL : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
|
||||
|
||||
BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
|
||||
SG_ INTERCEPTOR_GAS : 7|16@0+ (0.159375,-75.555) [0|1] "" EON
|
||||
SG_ INTERCEPTOR_GAS2 : 23|16@0+ (0.159375,-151.111) [0|1] "" EON
|
||||
SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
|
||||
SG_ COUNTER_PEDAL : 35|4@0+ (1,0) [0|15] "" EON
|
||||
SG_ CHECKSUM_PEDAL : 47|8@0+ (1,0) [0|255] "" EON
|
||||
|
||||
VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
|
||||
|
||||
|
||||
CM_ "Imported file _toyota_2017.dbc starts here"
|
||||
VERSION ""
|
||||
|
||||
|
||||
NS_ :
|
||||
NS_DESC_
|
||||
CM_
|
||||
BA_DEF_
|
||||
BA_
|
||||
VAL_
|
||||
CAT_DEF_
|
||||
CAT_
|
||||
FILTER
|
||||
BA_DEF_DEF_
|
||||
EV_DATA_
|
||||
ENVVAR_DATA_
|
||||
SGTYPE_
|
||||
SGTYPE_VAL_
|
||||
BA_DEF_SGTYPE_
|
||||
BA_SGTYPE_
|
||||
SIG_TYPE_REF_
|
||||
VAL_TABLE_
|
||||
SIG_GROUP_
|
||||
SIG_VALTYPE_
|
||||
SIGTYPE_VALTYPE_
|
||||
BO_TX_BU_
|
||||
BA_DEF_REL_
|
||||
BA_REL_
|
||||
BA_DEF_DEF_REL_
|
||||
BU_SG_REL_
|
||||
BU_EV_REL_
|
||||
BU_BO_REL_
|
||||
SG_MUL_VAL_
|
||||
|
||||
BS_:
|
||||
|
||||
BU_: XXX DSU HCU EPS IPAS CGW
|
||||
|
||||
BO_ 36 KINEMATICS: 8 XXX
|
||||
SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
|
||||
SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/sec" XXX
|
||||
SG_ STEERING_TORQUE : 17|10@0+ (1,-512) [0|65535] "" XXX
|
||||
|
||||
BO_ 37 STEER_ANGLE_SENSOR: 8 XXX
|
||||
SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX
|
||||
SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX
|
||||
SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX
|
||||
|
||||
BO_ 166 BRAKE: 8 XXX
|
||||
SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ BRAKE_PEDAL : 23|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 170 WHEEL_SPEEDS: 8 XXX
|
||||
SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "kph" XXX
|
||||
SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "kph" XXX
|
||||
SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "kph" XXX
|
||||
SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "kph" XXX
|
||||
|
||||
BO_ 180 SPEED: 8 XXX
|
||||
SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "kph" XXX
|
||||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 353 DSU_SPEED: 7 XXX
|
||||
SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "kph" XXX
|
||||
|
||||
BO_ 452 ENGINE_RPM: 8 CGW
|
||||
SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS
|
||||
|
||||
BO_ 466 PCM_CRUISE: 8 XXX
|
||||
SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ STANDSTILL_ON : 12|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ ACCEL_NET : 23|16@0- (0.001,0) [-20|20] "m/s2" XXX
|
||||
SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX
|
||||
SG_ CANCEL_REQ : 49|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 467 PCM_CRUISE_2: 8 XXX
|
||||
SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "kph" XXX
|
||||
SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "kph" XXX
|
||||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 552 ACCELEROMETER: 8 XXX
|
||||
SG_ ACCEL_Z : 22|15@0- (1,0) [0|32767] "" XXX
|
||||
SG_ ACCEL_X : 6|15@0- (0.001,0) [-20|20] "m/s2" XXX
|
||||
|
||||
BO_ 560 BRAKE_MODULE2: 7 XXX
|
||||
SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 614 STEERING_IPAS: 8 IPAS
|
||||
SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
|
||||
SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
|
||||
SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 643 PRE_COLLISION: 7 DSU
|
||||
SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_X00 : 15|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ FORCE : 23|16@0- (2,0) [0|255] "N" XXX
|
||||
SG_ SET_ME_X002 : 33|8@0+ (1,0) [0|3] "" XXX
|
||||
SG_ BRAKE_STATUS : 39|3@0+ (1,0) [0|255] "" XXX
|
||||
SG_ STATE : 36|3@0+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_X003 : 40|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ PRECOLLISION_ACTIVE : 41|1@0+ (1,0) [0|255] "" XXX
|
||||
SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 740 STEERING_LKA: 5 XXX
|
||||
SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX
|
||||
SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX
|
||||
SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 742 LEAD_INFO: 8 DSU
|
||||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU
|
||||
SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU
|
||||
SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU
|
||||
|
||||
BO_ 835 ACC_CONTROL: 8 DSU
|
||||
SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s2" HCU
|
||||
SG_ SET_ME_X01 : 23|2@0+ (1,0) [0|3] "" HCU
|
||||
SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_X3 : 19|4@0+ (1,0) [0|15] "" XXX
|
||||
SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU
|
||||
SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU
|
||||
SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU
|
||||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX
|
||||
|
||||
BO_ 836 PRE_COLLISION_2: 8 DSU
|
||||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
|
||||
|
||||
BO_ 869 DSU_CRUISE : 7 DSU
|
||||
SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX
|
||||
SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX
|
||||
SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX
|
||||
SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX
|
||||
SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX
|
||||
|
||||
BO_ 921 PCM_CRUISE_SM: 8 XXX
|
||||
SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX
|
||||
SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 951 ESP_CONTROL: 8 ESP
|
||||
SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX
|
||||
SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 1041 ACC_HUD: 8 DSU
|
||||
SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_X80 : 55|8@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 1042 LKAS_HUD: 8 XXX
|
||||
SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ SET_ME_X01 : 7|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ SET_ME_X01_2 : 11|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_X0C : 23|8@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_X2C : 47|8@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_X38 : 55|8@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 1043 TIME : 8 CGW
|
||||
SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX
|
||||
SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX
|
||||
SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX
|
||||
SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX
|
||||
SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX
|
||||
SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX
|
||||
SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX
|
||||
SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX
|
||||
SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX
|
||||
|
||||
BO_ 1408 VIN_PART_1: 8 CGW
|
||||
SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX
|
||||
|
||||
BO_ 1409 VIN_PART_2: 8 CGW
|
||||
SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX
|
||||
|
||||
BO_ 1410 VIN_PART_3: 8 CGW
|
||||
SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX
|
||||
|
||||
BO_ 1553 UI_SETTING: 8 XXX
|
||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||
|
||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||
|
||||
BO_ 1568 SEATS_DOORS: 8 XXX
|
||||
SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 1570 LIGHT_STALK: 8 SCM
|
||||
SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 1161 RSA1: 8 FCM
|
||||
SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "kph" XXX
|
||||
SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX
|
||||
|
||||
BO_ 1162 RSA2: 8 FCM
|
||||
SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX
|
||||
|
||||
BO_ 1163 RSA3: 8 FCM
|
||||
SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX
|
||||
SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX
|
||||
SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX
|
||||
SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX
|
||||
SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX
|
||||
|
||||
CM_ SG_ 36 ACCEL_Y "unit is tbd";
|
||||
CM_ SG_ 36 YAW_RATE "verify";
|
||||
CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||
CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque";
|
||||
CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value";
|
||||
CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active";
|
||||
CM_ SG_ 643 COUNTER "only used on cars that use this msg for cruise control";
|
||||
CM_ SG_ 643 BRAKE_STATUS "only used on cars that use this msg for cruise control";
|
||||
CM_ SG_ 643 PRECOLLISION_ACTIVE "set 0.5s before any braking";
|
||||
CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was "SET_ME_1" and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG.";
|
||||
CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
|
||||
CM_ SG_ 921 UI_SET_SPEED "set speed shown in UI with user set unit";
|
||||
CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel";
|
||||
CM_ SG_ 1042 SET_ME_1 "unclear what this is, but it's always 1 in drive traces";
|
||||
CM_ SG_ 1042 REPEATED_BEEPS "recommended for fcw and other important alerts";
|
||||
CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit.";
|
||||
CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz";
|
||||
CM_ SG_ 1161 SPDVAL2 "conditional speed value 70"
|
||||
CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0";
|
||||
CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz";
|
||||
CM_ SG_ 1163 TSREQPD "always 1";
|
||||
CM_ SG_ 1163 TSRMSW "always 1";
|
||||
CM_ SG_ 1163 OTSGNNTM "always 3";
|
||||
CM_ SG_ 1163 NTLVLSPD "always 3";
|
||||
CM_ SG_ 1163 OVSPNTM "always 3";
|
||||
CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||
CM_ SG_ 1163 TSRSPU "always 1";
|
||||
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||
|
||||
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||
VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking";
|
||||
VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted";
|
||||
VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none";
|
||||
VAL_ 1042 BARRIERS 3 "both" 2 "right" 1 "left" 0 "none";
|
||||
VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
|
||||
VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
|
||||
VAL_ 1553 UNITS 1 "km" 2 "miles";
|
||||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
||||
CM_ "lexus_is_2018_pt.dbc starts here"
|
||||
|
||||
|
||||
|
||||
BO_ 550 BRAKE_MODULE: 8 XXX
|
||||
SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX
|
||||
SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX
|
||||
SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 581 GAS_PEDAL_ALT: 5 XXX
|
||||
SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX
|
||||
|
||||
BO_ 705 GAS_PEDAL: 8 XXX
|
||||
SG_ GAS_RELEASED : 3|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ GAS_PEDAL : 55|8@0+ (0.005,0) [0|1] "" XXX
|
||||
|
||||
BO_ 608 STEER_TORQUE_SENSOR: 8 XXX
|
||||
SG_ STEER_TORQUE_EPS : 47|16@0- (1.30,0) [-20000|20000] "" XXX
|
||||
SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX
|
||||
SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX
|
||||
|
||||
BO_ 610 EPS_STATUS: 5 EPS
|
||||
SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX
|
||||
SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX
|
||||
SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 956 GEAR_PACKET: 8 XXX
|
||||
SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
|
||||
|
||||
BO_ 1009 PCM_CRUISE_ALT: 8 XXX
|
||||
SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX
|
||||
SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
|
||||
|
||||
BO_ 1599 LIGHT_STALK_ISH: 8 SCM
|
||||
SG_ AUTO_HIGH_BEAM : 19|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force";
|
||||
CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8";
|
||||
CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others";
|
||||
CM_ SG_ 1009 SET_SPEED "units seem to be whatever the car is set to";
|
||||
VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P";
|
||||
VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled";
|
||||
VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "standby";
|
||||
@@ -350,6 +350,14 @@ BO_ 1163 RSA3: 8 FCM
|
||||
SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX
|
||||
SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX
|
||||
|
||||
BO_ 956 GEAR_PACKET2: 8 XXX
|
||||
SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
|
||||
SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX
|
||||
SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
CM_ SG_ 36 ACCEL_Y "unit is tbd";
|
||||
CM_ SG_ 36 YAW_RATE "verify";
|
||||
CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||
@@ -396,15 +404,17 @@ VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||
VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking";
|
||||
VAL_ 835 ACC_TYPE 2 "permanent low speed lockout" 1 "ok";
|
||||
VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted";
|
||||
VAL_ 956 SPORT_ON 0 "off" 1 "on";
|
||||
VAL_ 956 ECON_ON 0 "off" 1 "on";
|
||||
VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none";
|
||||
VAL_ 1042 BARRIERS 3 "both" 2 "right" 1 "left" 0 "none";
|
||||
VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
|
||||
VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
|
||||
VAL_ 1553 UNITS 1 "km" 2 "miles";
|
||||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN1 36 "speed sign mph" 1 "speed sign kph" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 6 "snow" 5 "rain" 4 "wet road" 5 "rain" 3 "left" 2 "right" 1 "time" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 81 "no right turn" 97 "stop" 105 "yield" 113 "stop" 114 "yield us" 129 "no entry" 138 "no entry tss2" 145 "do not enter";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
@@ -442,6 +442,7 @@ BO_ 956 GEAR_PACKET: 8 XXX
|
||||
SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
|
||||
SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SPORT_ON_2 : 55|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
CM_ SG_ 548 BRAKE_PRESSURE "seems prop to pedal force";
|
||||
CM_ SG_ 548 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8";
|
||||
@@ -451,3 +452,4 @@ VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "stand
|
||||
VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P";
|
||||
VAL_ 956 SPORT_ON 0 "off" 1 "on";
|
||||
VAL_ 956 ECON_ON 0 "off" 1 "on";
|
||||
VAL_ 956 SPORT_ON_2 0 "off" 1 "on";
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
v1.7.5
|
||||
@@ -1,3 +1,9 @@
|
||||
# flake8: noqa
|
||||
# pylint: skip-file
|
||||
from .python import Panda, PandaWifiStreaming, PandaDFU, flash_release, BASEDIR, ensure_st_up_to_date, PandaSerial
|
||||
from .python import Panda, PandaWifiStreaming, PandaDFU, flash_release, \
|
||||
BASEDIR, ensure_st_up_to_date, PandaSerial, \
|
||||
DEFAULT_FW_FN, DEFAULT_H7_FW_FN, MCU_TYPE_H7, MCU_TYPE_F4
|
||||
|
||||
from .python.config import BOOTSTUB_ADDRESS, BLOCK_SIZE_FX, APP_ADDRESS_FX, \
|
||||
BLOCK_SIZE_H7, APP_ADDRESS_H7, DEVICE_SERIAL_NUMBER_ADDR_H7, \
|
||||
DEVICE_SERIAL_NUMBER_ADDR_FX
|
||||
|
||||
0
panda/board/Makefile
Normal file
0
panda/board/Makefile
Normal file
@@ -8,6 +8,7 @@ if os.getenv("PEDAL"):
|
||||
PROJECT = "pedal"
|
||||
STARTUP_FILE = "stm32fx/startup_stm32f205xx.s"
|
||||
LINKER_SCRIPT = "stm32fx/stm32fx_flash.ld"
|
||||
APP_START_ADDRESS = "0x8004000"
|
||||
MAIN = "pedal/main.c"
|
||||
PROJECT_FLAGS = [
|
||||
"-mcpu=cortex-m3",
|
||||
@@ -18,12 +19,32 @@ if os.getenv("PEDAL"):
|
||||
"-DPEDAL",
|
||||
]
|
||||
if os.getenv("PEDAL_USB"):
|
||||
PROJECT = "pedal_usb"
|
||||
PROJECT_FLAGS.append("-DPEDAL_USB")
|
||||
|
||||
elif os.getenv("PANDA_H7"):
|
||||
PROJECT = "panda_h7"
|
||||
STARTUP_FILE = "stm32h7/startup_stm32h7x5xx.s"
|
||||
LINKER_SCRIPT = "stm32h7/stm32h7x5_flash.ld"
|
||||
APP_START_ADDRESS = "0x8020000"
|
||||
MAIN = "main.c"
|
||||
PROJECT_FLAGS = [
|
||||
"-mcpu=cortex-m7",
|
||||
"-mhard-float",
|
||||
"-DSTM32H7",
|
||||
"-DSTM32H725xx",
|
||||
"-mfpu=fpv5-d16",
|
||||
"-fsingle-precision-constant",
|
||||
"-Os",
|
||||
"-g",
|
||||
"-DPANDA",
|
||||
]
|
||||
|
||||
else:
|
||||
PROJECT = "panda"
|
||||
STARTUP_FILE = "stm32fx/startup_stm32f413xx.s"
|
||||
LINKER_SCRIPT = "stm32fx/stm32fx_flash.ld"
|
||||
APP_START_ADDRESS = "0x8004000"
|
||||
MAIN = "main.c"
|
||||
PROJECT_FLAGS = [
|
||||
"-mcpu=cortex-m4",
|
||||
@@ -37,15 +58,18 @@ else:
|
||||
"-DPANDA",
|
||||
]
|
||||
|
||||
if FindFile('dp_vw_panda', '/data/params/d') != None:
|
||||
with open('/data/params/d/dp_vw_panda') as f:
|
||||
if (int(f.read().strip())) == 1:
|
||||
PROJECT_FLAGS += ['-Dvw']
|
||||
|
||||
|
||||
def get_version(builder, build_type):
|
||||
version_file = File('../VERSION').srcnode().abspath
|
||||
version = open(version_file).read()
|
||||
try:
|
||||
git = subprocess.check_output(["git", "rev-parse", "--short=8", "HEAD"], encoding='utf8').strip()
|
||||
except subprocess.CalledProcessError:
|
||||
git = "unknown"
|
||||
return f"{version}-{builder}-{git}-{build_type}"
|
||||
return f"{builder}-{git}-{build_type}"
|
||||
|
||||
|
||||
def to_c_uint32(x):
|
||||
@@ -110,6 +134,7 @@ else:
|
||||
|
||||
includes = [
|
||||
"stm32fx/inc",
|
||||
"stm32h7/inc",
|
||||
"..",
|
||||
".",
|
||||
]
|
||||
@@ -150,7 +175,7 @@ bootstub_bin = panda_env.Objcopy(f"obj/bootstub.{PROJECT}.bin", bootstub_elf)
|
||||
|
||||
# Build main
|
||||
main_elf = panda_env.Program(f"obj/{PROJECT}.elf", [startup, MAIN],
|
||||
LINKFLAGS=["-Wl,--section-start,.isr_vector=0x8004000"] + flags)
|
||||
LINKFLAGS=[f"-Wl,--section-start,.isr_vector={APP_START_ADDRESS}"] + flags)
|
||||
main_bin = panda_env.Objcopy(f"obj/{PROJECT}.bin", main_elf)
|
||||
|
||||
# Sign main
|
||||
|
||||
@@ -127,41 +127,11 @@ void black_set_can_mode(uint8_t mode){
|
||||
}
|
||||
}
|
||||
|
||||
void black_usb_power_mode_tick(uint32_t uptime){
|
||||
UNUSED(uptime);
|
||||
// Not applicable
|
||||
}
|
||||
|
||||
bool black_check_ignition(void){
|
||||
// ignition is checked through harness
|
||||
return harness_check_ignition();
|
||||
}
|
||||
|
||||
uint32_t black_read_current(void){
|
||||
// No current sense on black panda
|
||||
return 0U;
|
||||
}
|
||||
|
||||
void black_set_ir_power(uint8_t percentage){
|
||||
UNUSED(percentage);
|
||||
}
|
||||
|
||||
void black_set_fan_power(uint8_t percentage){
|
||||
UNUSED(percentage);
|
||||
}
|
||||
|
||||
void black_set_phone_power(bool enabled){
|
||||
UNUSED(enabled);
|
||||
}
|
||||
|
||||
void black_set_clock_source_mode(uint8_t mode){
|
||||
UNUSED(mode);
|
||||
}
|
||||
|
||||
void black_set_siren(bool enabled){
|
||||
UNUSED(enabled);
|
||||
}
|
||||
|
||||
void black_init(void) {
|
||||
common_init_gpio();
|
||||
|
||||
@@ -244,12 +214,12 @@ const board board_black = {
|
||||
.set_usb_power_mode = black_set_usb_power_mode,
|
||||
.set_gps_mode = black_set_gps_mode,
|
||||
.set_can_mode = black_set_can_mode,
|
||||
.usb_power_mode_tick = black_usb_power_mode_tick,
|
||||
.usb_power_mode_tick = unused_usb_power_mode_tick,
|
||||
.check_ignition = black_check_ignition,
|
||||
.read_current = black_read_current,
|
||||
.set_fan_power = black_set_fan_power,
|
||||
.set_ir_power = black_set_ir_power,
|
||||
.set_phone_power = black_set_phone_power,
|
||||
.set_clock_source_mode = black_set_clock_source_mode,
|
||||
.set_siren = black_set_siren
|
||||
.read_current = unused_read_current,
|
||||
.set_fan_power = unused_set_fan_power,
|
||||
.set_ir_power = unused_set_ir_power,
|
||||
.set_phone_power = unused_set_phone_power,
|
||||
.set_clock_source_mode = unused_set_clock_source_mode,
|
||||
.set_siren = unused_set_siren
|
||||
};
|
||||
|
||||
@@ -49,6 +49,7 @@ struct board {
|
||||
#define HW_TYPE_PEDAL 4U
|
||||
#define HW_TYPE_UNO 5U
|
||||
#define HW_TYPE_DOS 6U
|
||||
#define HW_TYPE_RED_PANDA 7U
|
||||
|
||||
// LED colors
|
||||
#define LED_RED 0U
|
||||
|
||||
@@ -49,18 +49,10 @@ void dos_set_led(uint8_t color, bool enabled) {
|
||||
}
|
||||
}
|
||||
|
||||
void dos_set_gps_load_switch(bool enabled) {
|
||||
UNUSED(enabled);
|
||||
}
|
||||
|
||||
void dos_set_bootkick(bool enabled){
|
||||
set_gpio_output(GPIOC, 4, !enabled);
|
||||
}
|
||||
|
||||
void dos_set_phone_power(bool enabled){
|
||||
UNUSED(enabled);
|
||||
}
|
||||
|
||||
void dos_set_usb_power_mode(uint8_t mode) {
|
||||
bool valid = false;
|
||||
switch (mode) {
|
||||
@@ -81,10 +73,6 @@ void dos_set_usb_power_mode(uint8_t mode) {
|
||||
}
|
||||
}
|
||||
|
||||
void dos_set_gps_mode(uint8_t mode) {
|
||||
UNUSED(mode);
|
||||
}
|
||||
|
||||
void dos_set_can_mode(uint8_t mode){
|
||||
switch (mode) {
|
||||
case CAN_MODE_NORMAL:
|
||||
@@ -113,10 +101,6 @@ void dos_set_can_mode(uint8_t mode){
|
||||
}
|
||||
}
|
||||
|
||||
void dos_usb_power_mode_tick(uint32_t uptime){
|
||||
UNUSED(uptime);
|
||||
}
|
||||
|
||||
bool dos_check_ignition(void){
|
||||
// ignition is checked through harness
|
||||
return harness_check_ignition();
|
||||
@@ -136,11 +120,6 @@ void dos_set_fan_power(uint8_t percentage){
|
||||
fan_set_power(percentage);
|
||||
}
|
||||
|
||||
uint32_t dos_read_current(void){
|
||||
// No current sense on Dos
|
||||
return 0U;
|
||||
}
|
||||
|
||||
void dos_set_clock_source_mode(uint8_t mode){
|
||||
clock_source_init(mode);
|
||||
}
|
||||
@@ -235,14 +214,14 @@ const board board_dos = {
|
||||
.enable_can_transceivers = dos_enable_can_transceivers,
|
||||
.set_led = dos_set_led,
|
||||
.set_usb_power_mode = dos_set_usb_power_mode,
|
||||
.set_gps_mode = dos_set_gps_mode,
|
||||
.set_gps_mode = unused_set_gps_mode,
|
||||
.set_can_mode = dos_set_can_mode,
|
||||
.usb_power_mode_tick = dos_usb_power_mode_tick,
|
||||
.usb_power_mode_tick = unused_usb_power_mode_tick,
|
||||
.check_ignition = dos_check_ignition,
|
||||
.read_current = dos_read_current,
|
||||
.read_current = unused_read_current,
|
||||
.set_fan_power = dos_set_fan_power,
|
||||
.set_ir_power = dos_set_ir_power,
|
||||
.set_phone_power = dos_set_phone_power,
|
||||
.set_phone_power = unused_set_phone_power,
|
||||
.set_clock_source_mode = dos_set_clock_source_mode,
|
||||
.set_siren = dos_set_siren
|
||||
};
|
||||
|
||||
@@ -48,12 +48,12 @@ const board board_grey = {
|
||||
.set_usb_power_mode = white_set_usb_power_mode,
|
||||
.set_gps_mode = grey_set_gps_mode,
|
||||
.set_can_mode = white_set_can_mode,
|
||||
.usb_power_mode_tick = white_usb_power_mode_tick,
|
||||
.usb_power_mode_tick = unused_usb_power_mode_tick,
|
||||
.check_ignition = white_check_ignition,
|
||||
.read_current = white_read_current,
|
||||
.set_fan_power = white_set_fan_power,
|
||||
.set_ir_power = white_set_ir_power,
|
||||
.set_phone_power = white_set_phone_power,
|
||||
.set_clock_source_mode = white_set_clock_source_mode,
|
||||
.set_siren = white_set_siren
|
||||
.set_fan_power = unused_set_fan_power,
|
||||
.set_ir_power = unused_set_ir_power,
|
||||
.set_phone_power = unused_set_phone_power,
|
||||
.set_clock_source_mode = unused_set_clock_source_mode,
|
||||
.set_siren = unused_set_siren
|
||||
};
|
||||
|
||||
@@ -50,41 +50,11 @@ void pedal_set_can_mode(uint8_t mode){
|
||||
}
|
||||
}
|
||||
|
||||
void pedal_usb_power_mode_tick(uint32_t uptime){
|
||||
UNUSED(uptime);
|
||||
// Not applicable
|
||||
}
|
||||
|
||||
bool pedal_check_ignition(void){
|
||||
// not supported on pedal
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t pedal_read_current(void){
|
||||
// No current sense on pedal
|
||||
return 0U;
|
||||
}
|
||||
|
||||
void pedal_set_ir_power(uint8_t percentage){
|
||||
UNUSED(percentage);
|
||||
}
|
||||
|
||||
void pedal_set_fan_power(uint8_t percentage){
|
||||
UNUSED(percentage);
|
||||
}
|
||||
|
||||
void pedal_set_phone_power(bool enabled){
|
||||
UNUSED(enabled);
|
||||
}
|
||||
|
||||
void pedal_set_clock_source_mode(uint8_t mode){
|
||||
UNUSED(mode);
|
||||
}
|
||||
|
||||
void pedal_set_siren(bool enabled){
|
||||
UNUSED(enabled);
|
||||
}
|
||||
|
||||
void pedal_init(void) {
|
||||
common_init_gpio();
|
||||
|
||||
@@ -121,12 +91,12 @@ const board board_pedal = {
|
||||
.set_usb_power_mode = pedal_set_usb_power_mode,
|
||||
.set_gps_mode = pedal_set_gps_mode,
|
||||
.set_can_mode = pedal_set_can_mode,
|
||||
.usb_power_mode_tick = pedal_usb_power_mode_tick,
|
||||
.usb_power_mode_tick = unused_usb_power_mode_tick,
|
||||
.check_ignition = pedal_check_ignition,
|
||||
.read_current = pedal_read_current,
|
||||
.set_fan_power = pedal_set_fan_power,
|
||||
.set_ir_power = pedal_set_ir_power,
|
||||
.set_phone_power = pedal_set_phone_power,
|
||||
.set_clock_source_mode = pedal_set_clock_source_mode,
|
||||
.set_siren = pedal_set_siren
|
||||
.read_current = unused_read_current,
|
||||
.set_fan_power = unused_set_fan_power,
|
||||
.set_ir_power = unused_set_ir_power,
|
||||
.set_phone_power = unused_set_phone_power,
|
||||
.set_clock_source_mode = unused_set_clock_source_mode,
|
||||
.set_siren = unused_set_siren
|
||||
};
|
||||
|
||||
202
panda/board/boards/red.h
Normal file
202
panda/board/boards/red.h
Normal file
@@ -0,0 +1,202 @@
|
||||
// ///////////////////// //
|
||||
// Red Panda + Harness //
|
||||
// ///////////////////// //
|
||||
|
||||
void red_enable_can_transceiver(uint8_t transceiver, bool enabled) {
|
||||
switch (transceiver) {
|
||||
case 1U:
|
||||
set_gpio_output(GPIOG, 11, !enabled);
|
||||
break;
|
||||
case 2U:
|
||||
set_gpio_output(GPIOB, 3, !enabled);
|
||||
break;
|
||||
case 3U:
|
||||
set_gpio_output(GPIOD, 7, !enabled);
|
||||
break;
|
||||
case 4U:
|
||||
set_gpio_output(GPIOB, 4, !enabled);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void red_enable_can_transceivers(bool enabled) {
|
||||
uint8_t main_bus = (car_harness_status == HARNESS_STATUS_FLIPPED) ? 3U : 1U;
|
||||
for (uint8_t i=1U; i<=4U; i++) {
|
||||
// Leave main CAN always on for CAN-based ignition detection
|
||||
if (i == main_bus) {
|
||||
red_enable_can_transceiver(i, true);
|
||||
} else {
|
||||
red_enable_can_transceiver(i, enabled);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void red_set_led(uint8_t color, bool enabled) {
|
||||
switch (color) {
|
||||
case LED_RED:
|
||||
set_gpio_output(GPIOE, 4, !enabled);
|
||||
break;
|
||||
case LED_GREEN:
|
||||
set_gpio_output(GPIOE, 3, !enabled);
|
||||
break;
|
||||
case LED_BLUE:
|
||||
set_gpio_output(GPIOE, 2, !enabled);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void red_set_usb_load_switch(bool enabled) {
|
||||
set_gpio_output(GPIOB, 14, !enabled);
|
||||
}
|
||||
|
||||
void red_set_usb_power_mode(uint8_t mode) {
|
||||
bool valid = false;
|
||||
switch (mode) {
|
||||
case USB_POWER_CLIENT:
|
||||
red_set_usb_load_switch(false);
|
||||
valid = true;
|
||||
break;
|
||||
case USB_POWER_CDP:
|
||||
red_set_usb_load_switch(true);
|
||||
valid = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (valid) {
|
||||
usb_power_mode = mode;
|
||||
}
|
||||
}
|
||||
|
||||
void red_set_can_mode(uint8_t mode) {
|
||||
switch (mode) {
|
||||
case CAN_MODE_NORMAL:
|
||||
case CAN_MODE_OBD_CAN2:
|
||||
if ((bool)(mode == CAN_MODE_NORMAL) != (bool)(car_harness_status == HARNESS_STATUS_FLIPPED)) {
|
||||
// B12,B13: disable normal mode
|
||||
set_gpio_pullup(GPIOB, 12, PULL_NONE);
|
||||
set_gpio_mode(GPIOB, 12, MODE_ANALOG);
|
||||
|
||||
set_gpio_pullup(GPIOB, 13, PULL_NONE);
|
||||
set_gpio_mode(GPIOB, 13, MODE_ANALOG);
|
||||
|
||||
// B5,B6: FDCAN2 mode
|
||||
set_gpio_pullup(GPIOB, 5, PULL_NONE);
|
||||
set_gpio_alternate(GPIOB, 5, GPIO_AF9_FDCAN2);
|
||||
|
||||
set_gpio_pullup(GPIOB, 6, PULL_NONE);
|
||||
set_gpio_alternate(GPIOB, 6, GPIO_AF9_FDCAN2);
|
||||
} else {
|
||||
// B5,B6: disable normal mode
|
||||
set_gpio_pullup(GPIOB, 5, PULL_NONE);
|
||||
set_gpio_mode(GPIOB, 5, MODE_ANALOG);
|
||||
|
||||
set_gpio_pullup(GPIOB, 6, PULL_NONE);
|
||||
set_gpio_mode(GPIOB, 6, MODE_ANALOG);
|
||||
// B12,B13: FDCAN2 mode
|
||||
set_gpio_pullup(GPIOB, 12, PULL_NONE);
|
||||
set_gpio_alternate(GPIOB, 12, GPIO_AF9_FDCAN2);
|
||||
|
||||
set_gpio_pullup(GPIOB, 13, PULL_NONE);
|
||||
set_gpio_alternate(GPIOB, 13, GPIO_AF9_FDCAN2);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool red_check_ignition(void) {
|
||||
// ignition is checked through harness
|
||||
return harness_check_ignition();
|
||||
}
|
||||
|
||||
void red_init(void) {
|
||||
common_init_gpio();
|
||||
|
||||
//C4,A1: OBD_SBU1, OBD_SBU2
|
||||
set_gpio_pullup(GPIOC, 4, PULL_NONE);
|
||||
set_gpio_mode(GPIOC, 4, MODE_ANALOG);
|
||||
|
||||
set_gpio_pullup(GPIOA, 1, PULL_NONE);
|
||||
set_gpio_mode(GPIOA, 1, MODE_ANALOG);
|
||||
|
||||
//C10,C11 : OBD_SBU1_RELAY, OBD_SBU2_RELAY
|
||||
set_gpio_output_type(GPIOC, 10, OUTPUT_TYPE_OPEN_DRAIN);
|
||||
set_gpio_pullup(GPIOC, 10, PULL_NONE);
|
||||
set_gpio_mode(GPIOC, 10, MODE_OUTPUT);
|
||||
set_gpio_output(GPIOC, 10, 1);
|
||||
|
||||
set_gpio_output_type(GPIOC, 11, OUTPUT_TYPE_OPEN_DRAIN);
|
||||
set_gpio_pullup(GPIOC, 11, PULL_NONE);
|
||||
set_gpio_mode(GPIOC, 11, MODE_OUTPUT);
|
||||
set_gpio_output(GPIOC, 11, 1);
|
||||
|
||||
// Turn on USB load switch.
|
||||
red_set_usb_load_switch(true);
|
||||
|
||||
// Set right power mode
|
||||
red_set_usb_power_mode(USB_POWER_CDP);
|
||||
|
||||
// Initialize harness
|
||||
harness_init();
|
||||
|
||||
// Enable CAN transceivers
|
||||
red_enable_can_transceivers(true);
|
||||
|
||||
// Disable LEDs
|
||||
red_set_led(LED_RED, false);
|
||||
red_set_led(LED_GREEN, false);
|
||||
red_set_led(LED_BLUE, false);
|
||||
|
||||
// Set normal CAN mode
|
||||
red_set_can_mode(CAN_MODE_NORMAL);
|
||||
|
||||
// flip CAN0 and CAN2 if we are flipped
|
||||
if (car_harness_status == HARNESS_STATUS_FLIPPED) {
|
||||
can_flip_buses(0, 2);
|
||||
}
|
||||
}
|
||||
|
||||
const harness_configuration red_harness_config = {
|
||||
.has_harness = true,
|
||||
.GPIO_SBU1 = GPIOC,
|
||||
.GPIO_SBU2 = GPIOA,
|
||||
.GPIO_relay_SBU1 = GPIOC,
|
||||
.GPIO_relay_SBU2 = GPIOC,
|
||||
.pin_SBU1 = 4,
|
||||
.pin_SBU2 = 1,
|
||||
.pin_relay_SBU1 = 10,
|
||||
.pin_relay_SBU2 = 11,
|
||||
.adc_channel_SBU1 = 4, //ADC12_INP4
|
||||
.adc_channel_SBU2 = 17 //ADC1_INP17
|
||||
};
|
||||
|
||||
const board board_red = {
|
||||
.board_type = "Red",
|
||||
.harness_config = &red_harness_config,
|
||||
.has_gps = false,
|
||||
.has_hw_gmlan = false,
|
||||
.has_obd = true,
|
||||
.has_lin = false,
|
||||
.has_rtc = false,
|
||||
.init = red_init,
|
||||
.enable_can_transceiver = red_enable_can_transceiver,
|
||||
.enable_can_transceivers = red_enable_can_transceivers,
|
||||
.set_led = red_set_led,
|
||||
.set_usb_power_mode = red_set_usb_power_mode,
|
||||
.set_gps_mode = unused_set_gps_mode,
|
||||
.set_can_mode = red_set_can_mode,
|
||||
.usb_power_mode_tick = unused_usb_power_mode_tick,
|
||||
.check_ignition = red_check_ignition,
|
||||
.read_current = unused_read_current,
|
||||
.set_fan_power = unused_set_fan_power,
|
||||
.set_ir_power = unused_set_ir_power,
|
||||
.set_phone_power = unused_set_phone_power,
|
||||
.set_clock_source_mode = unused_set_clock_source_mode,
|
||||
.set_siren = unused_set_siren
|
||||
};
|
||||
@@ -56,12 +56,7 @@ void uno_set_gps_load_switch(bool enabled) {
|
||||
}
|
||||
|
||||
void uno_set_bootkick(bool enabled){
|
||||
if(enabled){
|
||||
set_gpio_output(GPIOB, 14, false);
|
||||
} else {
|
||||
// We want the pin to be floating, not forced high!
|
||||
set_gpio_mode(GPIOB, 14, MODE_INPUT);
|
||||
}
|
||||
set_gpio_output(GPIOB, 14, !enabled);
|
||||
}
|
||||
|
||||
void uno_bootkick(void) {
|
||||
@@ -77,9 +72,11 @@ void uno_set_usb_power_mode(uint8_t mode) {
|
||||
bool valid = false;
|
||||
switch (mode) {
|
||||
case USB_POWER_CLIENT:
|
||||
uno_set_phone_power(false);
|
||||
valid = true;
|
||||
break;
|
||||
case USB_POWER_CDP:
|
||||
uno_set_phone_power(true);
|
||||
uno_bootkick();
|
||||
valid = true;
|
||||
break;
|
||||
@@ -173,19 +170,6 @@ void uno_set_fan_power(uint8_t percentage){
|
||||
fan_set_power(percentage);
|
||||
}
|
||||
|
||||
uint32_t uno_read_current(void){
|
||||
// No current sense on Uno
|
||||
return 0U;
|
||||
}
|
||||
|
||||
void uno_set_clock_source_mode(uint8_t mode){
|
||||
UNUSED(mode);
|
||||
}
|
||||
|
||||
void uno_set_siren(bool enabled){
|
||||
UNUSED(enabled);
|
||||
}
|
||||
|
||||
void uno_init(void) {
|
||||
common_init_gpio();
|
||||
|
||||
@@ -292,10 +276,10 @@ const board board_uno = {
|
||||
.set_can_mode = uno_set_can_mode,
|
||||
.usb_power_mode_tick = uno_usb_power_mode_tick,
|
||||
.check_ignition = uno_check_ignition,
|
||||
.read_current = uno_read_current,
|
||||
.read_current = unused_read_current,
|
||||
.set_fan_power = uno_set_fan_power,
|
||||
.set_ir_power = uno_set_ir_power,
|
||||
.set_phone_power = uno_set_phone_power,
|
||||
.set_clock_source_mode = uno_set_clock_source_mode,
|
||||
.set_siren = uno_set_siren
|
||||
.set_clock_source_mode = unused_set_clock_source_mode,
|
||||
.set_siren = unused_set_siren
|
||||
};
|
||||
|
||||
31
panda/board/boards/unused_funcs.h
Normal file
31
panda/board/boards/unused_funcs.h
Normal file
@@ -0,0 +1,31 @@
|
||||
void unused_set_gps_mode(uint8_t mode) {
|
||||
UNUSED(mode);
|
||||
}
|
||||
|
||||
void unused_usb_power_mode_tick(uint32_t uptime) {
|
||||
UNUSED(uptime);
|
||||
}
|
||||
|
||||
void unused_set_ir_power(uint8_t percentage) {
|
||||
UNUSED(percentage);
|
||||
}
|
||||
|
||||
void unused_set_fan_power(uint8_t percentage) {
|
||||
UNUSED(percentage);
|
||||
}
|
||||
|
||||
void unused_set_phone_power(bool enabled) {
|
||||
UNUSED(enabled);
|
||||
}
|
||||
|
||||
void unused_set_clock_source_mode(uint8_t mode) {
|
||||
UNUSED(mode);
|
||||
}
|
||||
|
||||
void unused_set_siren(bool enabled) {
|
||||
UNUSED(enabled);
|
||||
}
|
||||
|
||||
uint32_t unused_read_current(void) {
|
||||
return 0U;
|
||||
}
|
||||
@@ -151,35 +151,11 @@ uint32_t white_read_current(void){
|
||||
return adc_get(ADCCHAN_CURRENT);
|
||||
}
|
||||
|
||||
void white_usb_power_mode_tick(uint32_t uptime){
|
||||
UNUSED(uptime);
|
||||
}
|
||||
|
||||
void white_set_ir_power(uint8_t percentage){
|
||||
UNUSED(percentage);
|
||||
}
|
||||
|
||||
void white_set_fan_power(uint8_t percentage){
|
||||
UNUSED(percentage);
|
||||
}
|
||||
|
||||
bool white_check_ignition(void){
|
||||
// ignition is on PA1
|
||||
return !get_gpio_input(GPIOA, 1);
|
||||
}
|
||||
|
||||
void white_set_phone_power(bool enabled){
|
||||
UNUSED(enabled);
|
||||
}
|
||||
|
||||
void white_set_clock_source_mode(uint8_t mode){
|
||||
UNUSED(mode);
|
||||
}
|
||||
|
||||
void white_set_siren(bool enabled){
|
||||
UNUSED(enabled);
|
||||
}
|
||||
|
||||
void white_grey_common_init(void) {
|
||||
common_init_gpio();
|
||||
|
||||
@@ -277,12 +253,12 @@ const board board_white = {
|
||||
.set_usb_power_mode = white_set_usb_power_mode,
|
||||
.set_gps_mode = white_set_gps_mode,
|
||||
.set_can_mode = white_set_can_mode,
|
||||
.usb_power_mode_tick = white_usb_power_mode_tick,
|
||||
.usb_power_mode_tick = unused_usb_power_mode_tick,
|
||||
.check_ignition = white_check_ignition,
|
||||
.read_current = white_read_current,
|
||||
.set_fan_power = white_set_fan_power,
|
||||
.set_ir_power = white_set_ir_power,
|
||||
.set_phone_power = white_set_phone_power,
|
||||
.set_clock_source_mode = white_set_clock_source_mode,
|
||||
.set_siren = white_set_siren
|
||||
.set_fan_power = unused_set_fan_power,
|
||||
.set_ir_power = unused_set_ir_power,
|
||||
.set_phone_power = unused_set_phone_power,
|
||||
.set_clock_source_mode = unused_set_clock_source_mode,
|
||||
.set_siren = unused_set_siren
|
||||
};
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
#include "obj/cert.h"
|
||||
#include "obj/gitversion.h"
|
||||
#include "spi_flasher.h"
|
||||
#include "flasher.h"
|
||||
|
||||
void __initialize_hardware_early(void) {
|
||||
early_initialization();
|
||||
|
||||
7
panda/board/build_all.sh
Executable file
7
panda/board/build_all.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env sh
|
||||
set -e
|
||||
|
||||
scons -u
|
||||
PANDA_H7=1 scons -u
|
||||
PEDAL=1 scons -u
|
||||
PEDAL=1 PEDAL_USB=1 scons -u
|
||||
@@ -34,7 +34,21 @@
|
||||
|
||||
#define MAX_RESP_LEN 0x40U
|
||||
|
||||
#define GET_BUS(msg) (((msg)->RDTR >> 4) & 0xFF)
|
||||
#define GET_LEN(msg) ((msg)->RDTR & 0xF)
|
||||
#define GET_ADDR(msg) ((((msg)->RIR & 4) != 0) ? ((msg)->RIR >> 3) : ((msg)->RIR >> 21))
|
||||
#define GET_BYTE(msg, b) (((int)(b) > 3) ? (((msg)->RDHR >> (8U * ((unsigned int)(b) % 4U))) & 0xFFU) : (((msg)->RDLR >> (8U * (unsigned int)(b))) & 0xFFU))
|
||||
#define GET_BYTES_04(msg) ((msg)->RDLR)
|
||||
#define GET_BYTES_48(msg) ((msg)->RDHR)
|
||||
#define GET_FLAG(value, mask) (((__typeof__(mask))(value) & (mask)) == (mask))
|
||||
|
||||
#define CAN_INIT_TIMEOUT_MS 500U
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "stm32fx/stm32fx_config.h"
|
||||
#ifdef STM32H7
|
||||
#include "stm32h7/stm32h7_config.h"
|
||||
#else
|
||||
#include "stm32fx/stm32fx_config.h"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,163 +2,7 @@
|
||||
// CAN2_TX, CAN2_RX0, CAN2_SCE
|
||||
// CAN3_TX, CAN3_RX0, CAN3_SCE
|
||||
|
||||
typedef struct {
|
||||
volatile uint32_t w_ptr;
|
||||
volatile uint32_t r_ptr;
|
||||
uint32_t fifo_size;
|
||||
CAN_FIFOMailBox_TypeDef *elems;
|
||||
} can_ring;
|
||||
|
||||
#define CAN_BUS_RET_FLAG 0x80U
|
||||
#define CAN_BUS_NUM_MASK 0x7FU
|
||||
|
||||
#define BUS_MAX 4U
|
||||
|
||||
uint32_t can_rx_errs = 0;
|
||||
uint32_t can_send_errs = 0;
|
||||
uint32_t can_fwd_errs = 0;
|
||||
uint32_t gmlan_send_errs = 0;
|
||||
|
||||
extern int can_live;
|
||||
extern int pending_can_live;
|
||||
|
||||
// must reinit after changing these
|
||||
extern int can_loopback;
|
||||
extern int can_silent;
|
||||
extern uint32_t can_speed[4];
|
||||
|
||||
void can_set_forwarding(int from, int to);
|
||||
|
||||
bool can_init(uint8_t can_number);
|
||||
void can_init_all(void);
|
||||
bool can_tx_check_min_slots_free(uint32_t min);
|
||||
void can_send(CAN_FIFOMailBox_TypeDef *to_push, uint8_t bus_number, bool skip_tx_hook);
|
||||
bool can_pop(can_ring *q, CAN_FIFOMailBox_TypeDef *elem);
|
||||
|
||||
// Ignition detected from CAN meessages
|
||||
bool ignition_can = false;
|
||||
bool ignition_cadillac = false;
|
||||
uint32_t ignition_can_cnt = 0U;
|
||||
|
||||
// end API
|
||||
|
||||
#define ALL_CAN_SILENT 0xFF
|
||||
#define ALL_CAN_LIVE 0
|
||||
|
||||
int can_live = 0;
|
||||
int pending_can_live = 0;
|
||||
int can_loopback = 0;
|
||||
int can_silent = ALL_CAN_SILENT;
|
||||
|
||||
// ********************* instantiate queues *********************
|
||||
#define can_buffer(x, size) \
|
||||
CAN_FIFOMailBox_TypeDef elems_##x[size]; \
|
||||
can_ring can_##x = { .w_ptr = 0, .r_ptr = 0, .fifo_size = (size), .elems = (CAN_FIFOMailBox_TypeDef *)&(elems_##x) };
|
||||
|
||||
can_buffer(rx_q, 0x1000)
|
||||
can_buffer(tx1_q, 0x100)
|
||||
can_buffer(tx2_q, 0x100)
|
||||
can_buffer(tx3_q, 0x100)
|
||||
can_buffer(txgmlan_q, 0x100)
|
||||
// FIXME:
|
||||
// cppcheck-suppress misra-c2012-9.3
|
||||
can_ring *can_queues[] = {&can_tx1_q, &can_tx2_q, &can_tx3_q, &can_txgmlan_q};
|
||||
|
||||
// global CAN stats
|
||||
int can_rx_cnt = 0;
|
||||
int can_tx_cnt = 0;
|
||||
int can_txd_cnt = 0;
|
||||
int can_err_cnt = 0;
|
||||
int can_overflow_cnt = 0;
|
||||
|
||||
// ********************* interrupt safe queue *********************
|
||||
bool can_pop(can_ring *q, CAN_FIFOMailBox_TypeDef *elem) {
|
||||
bool ret = 0;
|
||||
|
||||
ENTER_CRITICAL();
|
||||
if (q->w_ptr != q->r_ptr) {
|
||||
*elem = q->elems[q->r_ptr];
|
||||
if ((q->r_ptr + 1U) == q->fifo_size) {
|
||||
q->r_ptr = 0;
|
||||
} else {
|
||||
q->r_ptr += 1U;
|
||||
}
|
||||
ret = 1;
|
||||
}
|
||||
EXIT_CRITICAL();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool can_push(can_ring *q, CAN_FIFOMailBox_TypeDef *elem) {
|
||||
bool ret = false;
|
||||
uint32_t next_w_ptr;
|
||||
|
||||
ENTER_CRITICAL();
|
||||
if ((q->w_ptr + 1U) == q->fifo_size) {
|
||||
next_w_ptr = 0;
|
||||
} else {
|
||||
next_w_ptr = q->w_ptr + 1U;
|
||||
}
|
||||
if (next_w_ptr != q->r_ptr) {
|
||||
q->elems[q->w_ptr] = *elem;
|
||||
q->w_ptr = next_w_ptr;
|
||||
ret = true;
|
||||
}
|
||||
EXIT_CRITICAL();
|
||||
if (!ret) {
|
||||
can_overflow_cnt++;
|
||||
#ifdef DEBUG
|
||||
puts("can_push failed!\n");
|
||||
#endif
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint32_t can_slots_empty(can_ring *q) {
|
||||
uint32_t ret = 0;
|
||||
|
||||
ENTER_CRITICAL();
|
||||
if (q->w_ptr >= q->r_ptr) {
|
||||
ret = q->fifo_size - 1U - q->w_ptr + q->r_ptr;
|
||||
} else {
|
||||
ret = q->r_ptr - q->w_ptr - 1U;
|
||||
}
|
||||
EXIT_CRITICAL();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void can_clear(can_ring *q) {
|
||||
ENTER_CRITICAL();
|
||||
q->w_ptr = 0;
|
||||
q->r_ptr = 0;
|
||||
EXIT_CRITICAL();
|
||||
}
|
||||
|
||||
// assign CAN numbering
|
||||
// bus num: Can bus number on ODB connector. Sent to/from USB
|
||||
// Min: 0; Max: 127; Bit 7 marks message as receipt (bus 129 is receipt for but 1)
|
||||
// cans: Look up MCU can interface from bus number
|
||||
// can number: numeric lookup for MCU CAN interfaces (0 = CAN1, 1 = CAN2, etc);
|
||||
// bus_lookup: Translates from 'can number' to 'bus number'.
|
||||
// can_num_lookup: Translates from 'bus number' to 'can number'.
|
||||
// can_forwarding: Given a bus num, lookup bus num to forward to. -1 means no forward.
|
||||
|
||||
// Panda: Bus 0=CAN1 Bus 1=CAN2 Bus 2=CAN3
|
||||
CAN_TypeDef *cans[] = {CAN1, CAN2, CAN3};
|
||||
uint8_t bus_lookup[] = {0,1,2};
|
||||
uint8_t can_num_lookup[] = {0,1,2,-1};
|
||||
int8_t can_forwarding[] = {-1,-1,-1,-1};
|
||||
uint32_t can_speed[] = {5000, 5000, 5000, 333};
|
||||
#define CAN_MAX 3U
|
||||
|
||||
#define CANIF_FROM_CAN_NUM(num) (cans[num])
|
||||
#define CAN_NUM_FROM_CANIF(CAN) ((CAN)==CAN1 ? 0 : ((CAN) == CAN2 ? 1 : 2))
|
||||
#define BUS_NUM_FROM_CAN_NUM(num) (bus_lookup[num])
|
||||
#define CAN_NUM_FROM_BUS_NUM(num) (can_num_lookup[num])
|
||||
|
||||
void process_can(uint8_t can_number);
|
||||
|
||||
bool can_set_speed(uint8_t can_number) {
|
||||
bool ret = true;
|
||||
@@ -169,22 +13,6 @@ bool can_set_speed(uint8_t can_number) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
void can_init_all(void) {
|
||||
bool ret = true;
|
||||
for (uint8_t i=0U; i < CAN_MAX; i++) {
|
||||
can_clear(can_queues[i]);
|
||||
ret &= can_init(i);
|
||||
}
|
||||
UNUSED(ret);
|
||||
}
|
||||
|
||||
void can_flip_buses(uint8_t bus1, uint8_t bus2){
|
||||
bus_lookup[bus1] = bus2;
|
||||
bus_lookup[bus2] = bus1;
|
||||
can_num_lookup[bus1] = bus2;
|
||||
can_num_lookup[bus2] = bus1;
|
||||
}
|
||||
|
||||
// TODO: Cleanup with new abstraction
|
||||
void can_set_gmlan(uint8_t bus) {
|
||||
if(current_board->has_hw_gmlan){
|
||||
@@ -323,34 +151,6 @@ void process_can(uint8_t can_number) {
|
||||
}
|
||||
}
|
||||
|
||||
void ignition_can_hook(CAN_FIFOMailBox_TypeDef *to_push) {
|
||||
int bus = GET_BUS(to_push);
|
||||
int addr = GET_ADDR(to_push);
|
||||
int len = GET_LEN(to_push);
|
||||
|
||||
ignition_can_cnt = 0U; // reset counter
|
||||
|
||||
if (bus == 0) {
|
||||
// TODO: verify on all supported GM models that we can reliably detect ignition using only this signal,
|
||||
// since the 0x1F1 signal can briefly go low immediately after ignition
|
||||
if ((addr == 0x160) && (len == 5)) {
|
||||
// this message isn't all zeros when ignition is on
|
||||
ignition_cadillac = GET_BYTES_04(to_push) != 0;
|
||||
}
|
||||
// GM exception
|
||||
if ((addr == 0x1F1) && (len == 8)) {
|
||||
// Bit 5 is ignition "on"
|
||||
bool ignition_gm = ((GET_BYTE(to_push, 0) & 0x20) != 0);
|
||||
ignition_can = ignition_gm || ignition_cadillac;
|
||||
}
|
||||
// Tesla exception
|
||||
if ((addr == 0x348) && (len == 8)) {
|
||||
// GTW_status
|
||||
ignition_can = (GET_BYTE(to_push, 0) & 0x1) != 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// CAN receive handlers
|
||||
// blink blue when we are receiving CAN messages
|
||||
void can_rx(uint8_t can_number) {
|
||||
@@ -406,34 +206,6 @@ void CAN3_TX_IRQ_Handler(void) { process_can(2); }
|
||||
void CAN3_RX0_IRQ_Handler(void) { can_rx(2); }
|
||||
void CAN3_SCE_IRQ_Handler(void) { can_sce(CAN3); }
|
||||
|
||||
bool can_tx_check_min_slots_free(uint32_t min) {
|
||||
return
|
||||
(can_slots_empty(&can_tx1_q) >= min) &&
|
||||
(can_slots_empty(&can_tx2_q) >= min) &&
|
||||
(can_slots_empty(&can_tx3_q) >= min) &&
|
||||
(can_slots_empty(&can_txgmlan_q) >= min);
|
||||
}
|
||||
|
||||
void can_send(CAN_FIFOMailBox_TypeDef *to_push, uint8_t bus_number, bool skip_tx_hook) {
|
||||
if (skip_tx_hook || safety_tx_hook(to_push) != 0) {
|
||||
if (bus_number < BUS_MAX) {
|
||||
// add CAN packet to send queue
|
||||
// bus number isn't passed through
|
||||
to_push->RDTR &= 0xF;
|
||||
if ((bus_number == 3U) && (can_num_lookup[3] == 0xFFU)) {
|
||||
gmlan_send_errs += bitbang_gmlan(to_push) ? 0U : 1U;
|
||||
} else {
|
||||
can_fwd_errs += can_push(can_queues[bus_number], to_push) ? 0U : 1U;
|
||||
process_can(CAN_NUM_FROM_BUS_NUM(bus_number));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void can_set_forwarding(int from, int to) {
|
||||
can_forwarding[from] = to;
|
||||
}
|
||||
|
||||
bool can_init(uint8_t can_number) {
|
||||
bool ret = false;
|
||||
|
||||
222
panda/board/drivers/can_common.h
Normal file
222
panda/board/drivers/can_common.h
Normal file
@@ -0,0 +1,222 @@
|
||||
typedef struct {
|
||||
volatile uint32_t w_ptr;
|
||||
volatile uint32_t r_ptr;
|
||||
uint32_t fifo_size;
|
||||
CAN_FIFOMailBox_TypeDef *elems;
|
||||
} can_ring;
|
||||
|
||||
#define CAN_BUS_RET_FLAG 0x80U
|
||||
#define CAN_BUS_NUM_MASK 0x7FU
|
||||
|
||||
#define BUS_MAX 4U
|
||||
|
||||
uint32_t can_rx_errs = 0;
|
||||
uint32_t can_send_errs = 0;
|
||||
uint32_t can_fwd_errs = 0;
|
||||
uint32_t gmlan_send_errs = 0;
|
||||
|
||||
extern int can_live;
|
||||
extern int pending_can_live;
|
||||
|
||||
// must reinit after changing these
|
||||
extern int can_loopback;
|
||||
extern int can_silent;
|
||||
extern uint32_t can_speed[4];
|
||||
extern uint32_t can_data_speed[3];
|
||||
|
||||
// Ignition detected from CAN meessages
|
||||
bool ignition_can = false;
|
||||
bool ignition_cadillac = false;
|
||||
uint32_t ignition_can_cnt = 0U;
|
||||
|
||||
#define ALL_CAN_SILENT 0xFF
|
||||
#define ALL_CAN_LIVE 0
|
||||
|
||||
int can_live = 0;
|
||||
int pending_can_live = 0;
|
||||
int can_loopback = 0;
|
||||
int can_silent = ALL_CAN_SILENT;
|
||||
|
||||
// ******************* functions prototypes *********************
|
||||
bool can_init(uint8_t can_number);
|
||||
void process_can(uint8_t can_number);
|
||||
|
||||
// ********************* instantiate queues *********************
|
||||
#define can_buffer(x, size) \
|
||||
CAN_FIFOMailBox_TypeDef elems_##x[size]; \
|
||||
can_ring can_##x = { .w_ptr = 0, .r_ptr = 0, .fifo_size = (size), .elems = (CAN_FIFOMailBox_TypeDef *)&(elems_##x) };
|
||||
|
||||
can_buffer(rx_q, 0x1000)
|
||||
can_buffer(tx1_q, 0x100)
|
||||
can_buffer(tx2_q, 0x100)
|
||||
can_buffer(tx3_q, 0x100)
|
||||
can_buffer(txgmlan_q, 0x100)
|
||||
// FIXME:
|
||||
// cppcheck-suppress misra-c2012-9.3
|
||||
can_ring *can_queues[] = {&can_tx1_q, &can_tx2_q, &can_tx3_q, &can_txgmlan_q};
|
||||
|
||||
// global CAN stats
|
||||
int can_rx_cnt = 0;
|
||||
int can_tx_cnt = 0;
|
||||
int can_txd_cnt = 0;
|
||||
int can_err_cnt = 0;
|
||||
int can_overflow_cnt = 0;
|
||||
|
||||
// ********************* interrupt safe queue *********************
|
||||
bool can_pop(can_ring *q, CAN_FIFOMailBox_TypeDef *elem) {
|
||||
bool ret = 0;
|
||||
|
||||
ENTER_CRITICAL();
|
||||
if (q->w_ptr != q->r_ptr) {
|
||||
*elem = q->elems[q->r_ptr];
|
||||
if ((q->r_ptr + 1U) == q->fifo_size) {
|
||||
q->r_ptr = 0;
|
||||
} else {
|
||||
q->r_ptr += 1U;
|
||||
}
|
||||
ret = 1;
|
||||
}
|
||||
EXIT_CRITICAL();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool can_push(can_ring *q, CAN_FIFOMailBox_TypeDef *elem) {
|
||||
bool ret = false;
|
||||
uint32_t next_w_ptr;
|
||||
|
||||
ENTER_CRITICAL();
|
||||
if ((q->w_ptr + 1U) == q->fifo_size) {
|
||||
next_w_ptr = 0;
|
||||
} else {
|
||||
next_w_ptr = q->w_ptr + 1U;
|
||||
}
|
||||
if (next_w_ptr != q->r_ptr) {
|
||||
q->elems[q->w_ptr] = *elem;
|
||||
q->w_ptr = next_w_ptr;
|
||||
ret = true;
|
||||
}
|
||||
EXIT_CRITICAL();
|
||||
if (!ret) {
|
||||
can_overflow_cnt++;
|
||||
#ifdef DEBUG
|
||||
puts("can_push failed!\n");
|
||||
#endif
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint32_t can_slots_empty(can_ring *q) {
|
||||
uint32_t ret = 0;
|
||||
|
||||
ENTER_CRITICAL();
|
||||
if (q->w_ptr >= q->r_ptr) {
|
||||
ret = q->fifo_size - 1U - q->w_ptr + q->r_ptr;
|
||||
} else {
|
||||
ret = q->r_ptr - q->w_ptr - 1U;
|
||||
}
|
||||
EXIT_CRITICAL();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void can_clear(can_ring *q) {
|
||||
ENTER_CRITICAL();
|
||||
q->w_ptr = 0;
|
||||
q->r_ptr = 0;
|
||||
EXIT_CRITICAL();
|
||||
}
|
||||
|
||||
// assign CAN numbering
|
||||
// bus num: Can bus number on ODB connector. Sent to/from USB
|
||||
// Min: 0; Max: 127; Bit 7 marks message as receipt (bus 129 is receipt for but 1)
|
||||
// cans: Look up MCU can interface from bus number
|
||||
// can number: numeric lookup for MCU CAN interfaces (0 = CAN1, 1 = CAN2, etc);
|
||||
// bus_lookup: Translates from 'can number' to 'bus number'.
|
||||
// can_num_lookup: Translates from 'bus number' to 'can number'.
|
||||
// can_forwarding: Given a bus num, lookup bus num to forward to. -1 means no forward.
|
||||
|
||||
// Helpers
|
||||
// Panda: Bus 0=CAN1 Bus 1=CAN2 Bus 2=CAN3
|
||||
uint8_t bus_lookup[] = {0,1,2};
|
||||
uint8_t can_num_lookup[] = {0,1,2,-1};
|
||||
int8_t can_forwarding[] = {-1,-1,-1,-1};
|
||||
uint32_t can_speed[] = {5000, 5000, 5000, 333};
|
||||
uint32_t can_data_speed[] = {5000, 5000, 5000}; //For CAN FD with BRS only
|
||||
#define CAN_MAX 3U
|
||||
|
||||
#define CANIF_FROM_CAN_NUM(num) (cans[num])
|
||||
#define BUS_NUM_FROM_CAN_NUM(num) (bus_lookup[num])
|
||||
#define CAN_NUM_FROM_BUS_NUM(num) (can_num_lookup[num])
|
||||
|
||||
void can_init_all(void) {
|
||||
bool ret = true;
|
||||
for (uint8_t i=0U; i < CAN_MAX; i++) {
|
||||
can_clear(can_queues[i]);
|
||||
ret &= can_init(i);
|
||||
}
|
||||
UNUSED(ret);
|
||||
}
|
||||
|
||||
void can_flip_buses(uint8_t bus1, uint8_t bus2){
|
||||
bus_lookup[bus1] = bus2;
|
||||
bus_lookup[bus2] = bus1;
|
||||
can_num_lookup[bus1] = bus2;
|
||||
can_num_lookup[bus2] = bus1;
|
||||
}
|
||||
|
||||
void ignition_can_hook(CAN_FIFOMailBox_TypeDef *to_push) {
|
||||
int bus = GET_BUS(to_push);
|
||||
int addr = GET_ADDR(to_push);
|
||||
int len = GET_LEN(to_push);
|
||||
|
||||
ignition_can_cnt = 0U; // reset counter
|
||||
|
||||
if (bus == 0) {
|
||||
// TODO: verify on all supported GM models that we can reliably detect ignition using only this signal,
|
||||
// since the 0x1F1 signal can briefly go low immediately after ignition
|
||||
if ((addr == 0x160) && (len == 5)) {
|
||||
// this message isn't all zeros when ignition is on
|
||||
ignition_cadillac = GET_BYTES_04(to_push) != 0;
|
||||
}
|
||||
// GM exception
|
||||
if ((addr == 0x1F1) && (len == 8)) {
|
||||
// Bit 5 is ignition "on"
|
||||
bool ignition_gm = ((GET_BYTE(to_push, 0) & 0x20) != 0);
|
||||
ignition_can = ignition_gm || ignition_cadillac;
|
||||
}
|
||||
// Tesla exception
|
||||
if ((addr == 0x348) && (len == 8)) {
|
||||
// GTW_status
|
||||
ignition_can = (GET_BYTE(to_push, 0) & 0x1) != 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool can_tx_check_min_slots_free(uint32_t min) {
|
||||
return
|
||||
(can_slots_empty(&can_tx1_q) >= min) &&
|
||||
(can_slots_empty(&can_tx2_q) >= min) &&
|
||||
(can_slots_empty(&can_tx3_q) >= min) &&
|
||||
(can_slots_empty(&can_txgmlan_q) >= min);
|
||||
}
|
||||
|
||||
void can_send(CAN_FIFOMailBox_TypeDef *to_push, uint8_t bus_number, bool skip_tx_hook) {
|
||||
if (skip_tx_hook || safety_tx_hook(to_push) != 0) {
|
||||
if (bus_number < BUS_MAX) {
|
||||
// add CAN packet to send queue
|
||||
// bus number isn't passed through
|
||||
to_push->RDTR &= 0xF;
|
||||
if ((bus_number == 3U) && (can_num_lookup[3] == 0xFFU)) {
|
||||
gmlan_send_errs += bitbang_gmlan(to_push) ? 0U : 1U;
|
||||
} else {
|
||||
can_fwd_errs += can_push(can_queues[bus_number], to_push) ? 0U : 1U;
|
||||
process_can(CAN_NUM_FROM_BUS_NUM(bus_number));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void can_set_forwarding(int from, int to) {
|
||||
can_forwarding[from] = to;
|
||||
}
|
||||
203
panda/board/drivers/fdcan.h
Normal file
203
panda/board/drivers/fdcan.h
Normal file
@@ -0,0 +1,203 @@
|
||||
// IRQs: FDCAN1_IT0, FDCAN1_IT1
|
||||
// FDCAN2_IT0, FDCAN2_IT1
|
||||
// FDCAN3_IT0, FDCAN3_IT1
|
||||
|
||||
#define BUS_OFF_FAIL_LIMIT 2U
|
||||
uint8_t bus_off_err[] = {0U, 0U, 0U};
|
||||
|
||||
FDCAN_GlobalTypeDef *cans[] = {FDCAN1, FDCAN2, FDCAN3};
|
||||
|
||||
bool can_set_speed(uint8_t can_number) {
|
||||
bool ret = true;
|
||||
FDCAN_GlobalTypeDef *CANx = CANIF_FROM_CAN_NUM(can_number);
|
||||
uint8_t bus_number = BUS_NUM_FROM_CAN_NUM(can_number);
|
||||
|
||||
ret &= llcan_set_speed(CANx, can_speed[bus_number], can_data_speed[bus_number], can_loopback, (unsigned int)(can_silent) & (1U << can_number));
|
||||
return ret;
|
||||
}
|
||||
|
||||
void can_set_gmlan(uint8_t bus) {
|
||||
UNUSED(bus);
|
||||
puts("GMLAN not available on red panda\n");
|
||||
}
|
||||
|
||||
void cycle_transceiver(uint8_t can_number) {
|
||||
// FDCAN1 = trans 1, FDCAN3 = trans 3, FDCAN2 = trans 2 normal or 4 flipped harness
|
||||
uint8_t transceiver_number = can_number;
|
||||
if (can_number == 2U) {
|
||||
uint8_t flip = (car_harness_status == HARNESS_STATUS_FLIPPED) ? 2U : 0U;
|
||||
transceiver_number += flip;
|
||||
}
|
||||
current_board->enable_can_transceiver(transceiver_number, false);
|
||||
delay(20000);
|
||||
current_board->enable_can_transceiver(transceiver_number, true);
|
||||
bus_off_err[can_number] = 0U;
|
||||
puts("Cycled transceiver number: "); puth(transceiver_number); puts("\n");
|
||||
}
|
||||
|
||||
// ***************************** CAN *****************************
|
||||
void process_can(uint8_t can_number) {
|
||||
if (can_number != 0xffU) {
|
||||
ENTER_CRITICAL();
|
||||
|
||||
FDCAN_GlobalTypeDef *CANx = CANIF_FROM_CAN_NUM(can_number);
|
||||
uint8_t bus_number = BUS_NUM_FROM_CAN_NUM(can_number);
|
||||
|
||||
CANx->IR |= FDCAN_IR_TFE; // Clear Tx FIFO Empty flag
|
||||
|
||||
if ((CANx->TXFQS & FDCAN_TXFQS_TFQF) == 0) {
|
||||
CAN_FIFOMailBox_TypeDef to_send;
|
||||
if (can_pop(can_queues[bus_number], &to_send)) {
|
||||
can_tx_cnt += 1;
|
||||
uint32_t TxFIFOSA = FDCAN_START_ADDRESS + (can_number * FDCAN_OFFSET) + (FDCAN_RX_FIFO_0_EL_CNT * FDCAN_RX_FIFO_0_EL_SIZE);
|
||||
uint8_t tx_index = (CANx->TXFQS >> FDCAN_TXFQS_TFQPI_Pos) & 0x1F;
|
||||
// only send if we have received a packet
|
||||
CAN_FIFOMailBox_TypeDef *fifo;
|
||||
fifo = (CAN_FIFOMailBox_TypeDef *)(TxFIFOSA + (tx_index * FDCAN_TX_FIFO_EL_SIZE));
|
||||
|
||||
// Convert from "mailbox type"
|
||||
fifo->RIR = ((to_send.RIR & 0x6) << 28) | (to_send.RIR >> 3); // identifier format and frame type | identifier
|
||||
//REDEBUG: enable CAN FD and BRS for test purposes
|
||||
//fifo->RDTR = ((to_send.RDTR & 0xF) << 16) | ((to_send.RDTR) >> 16) | (1U << 21) | (1U << 20); // DLC (length) | timestamp | enable CAN FD | enable BRS
|
||||
fifo->RDTR = ((to_send.RDTR & 0xF) << 16) | ((to_send.RDTR) >> 16); // DLC (length) | timestamp
|
||||
fifo->RDLR = to_send.RDLR;
|
||||
fifo->RDHR = to_send.RDHR;
|
||||
|
||||
CANx->TXBAR = (1UL << tx_index);
|
||||
|
||||
// Send back to USB
|
||||
can_txd_cnt += 1;
|
||||
CAN_FIFOMailBox_TypeDef to_push;
|
||||
to_push.RIR = to_send.RIR;
|
||||
to_push.RDTR = (to_send.RDTR & 0xFFFF000FU) | ((CAN_BUS_RET_FLAG | bus_number) << 4);
|
||||
to_push.RDLR = to_send.RDLR;
|
||||
to_push.RDHR = to_send.RDHR;
|
||||
can_send_errs += can_push(&can_rx_q, &to_push) ? 0U : 1U;
|
||||
|
||||
if (can_tx_check_min_slots_free(MAX_CAN_MSGS_PER_BULK_TRANSFER)) {
|
||||
usb_outep3_resume_if_paused();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Recover after Bus-off state
|
||||
if (((CANx->PSR & FDCAN_PSR_BO) != 0) && ((CANx->CCCR & FDCAN_CCCR_INIT) != 0)) {
|
||||
bus_off_err[can_number] += 1U;
|
||||
puts("CAN is in Bus_Off state! Resetting... CAN number: "); puth(can_number); puts("\n");
|
||||
if (bus_off_err[can_number] > BUS_OFF_FAIL_LIMIT) {
|
||||
cycle_transceiver(can_number);
|
||||
}
|
||||
CANx->IR = 0xFFC60000U; // Reset all flags(Only errors!)
|
||||
CANx->CCCR &= ~(FDCAN_CCCR_INIT);
|
||||
uint32_t timeout_counter = 0U;
|
||||
while((CANx->CCCR & FDCAN_CCCR_INIT) != 0) {
|
||||
// Delay for about 1ms
|
||||
delay(10000);
|
||||
timeout_counter++;
|
||||
|
||||
if(timeout_counter >= CAN_INIT_TIMEOUT_MS){
|
||||
puts(CAN_NAME_FROM_CANIF(CANx)); puts(" Bus_Off reset timed out!\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
EXIT_CRITICAL();
|
||||
}
|
||||
}
|
||||
|
||||
// CAN receive handlers
|
||||
// blink blue when we are receiving CAN messages
|
||||
void can_rx(uint8_t can_number) {
|
||||
FDCAN_GlobalTypeDef *CANx = CANIF_FROM_CAN_NUM(can_number);
|
||||
uint8_t bus_number = BUS_NUM_FROM_CAN_NUM(can_number);
|
||||
uint8_t rx_fifo_idx;
|
||||
|
||||
// Rx FIFO 0 new message
|
||||
if((CANx->IR & FDCAN_IR_RF0N) != 0) {
|
||||
CANx->IR |= FDCAN_IR_RF0N;
|
||||
while((CANx->RXF0S & FDCAN_RXF0S_F0FL) != 0) {
|
||||
can_rx_cnt += 1;
|
||||
|
||||
// can is live
|
||||
pending_can_live = 1;
|
||||
|
||||
// getting new message index (0 to 63)
|
||||
rx_fifo_idx = (uint8_t)((CANx->RXF0S >> FDCAN_RXF0S_F0GI_Pos) & 0x3F);
|
||||
|
||||
uint32_t RxFIFO0SA = FDCAN_START_ADDRESS + (can_number * FDCAN_OFFSET);
|
||||
CAN_FIFOMailBox_TypeDef to_push;
|
||||
CAN_FIFOMailBox_TypeDef *fifo;
|
||||
|
||||
// getting address
|
||||
fifo = (CAN_FIFOMailBox_TypeDef *)(RxFIFO0SA + (rx_fifo_idx * FDCAN_RX_FIFO_0_EL_SIZE));
|
||||
|
||||
// Need to convert real CAN frame format to mailbox "type"
|
||||
to_push.RIR = ((fifo->RIR >> 28) & 0x6) | (fifo->RIR << 3); // identifier format and frame type | identifier
|
||||
to_push.RDTR = ((fifo->RDTR >> 16) & 0xF) | (fifo->RDTR << 16); // DLC (length) | timestamp
|
||||
to_push.RDLR = fifo->RDLR;
|
||||
to_push.RDHR = fifo->RDHR;
|
||||
|
||||
// modify RDTR for our API
|
||||
to_push.RDTR = (to_push.RDTR & 0xFFFF000F) | (bus_number << 4);
|
||||
|
||||
// forwarding (panda only)
|
||||
int bus_fwd_num = (can_forwarding[bus_number] != -1) ? can_forwarding[bus_number] : safety_fwd_hook(bus_number, &to_push);
|
||||
if (bus_fwd_num != -1) {
|
||||
CAN_FIFOMailBox_TypeDef to_send;
|
||||
to_send.RIR = to_push.RIR;
|
||||
to_send.RDTR = to_push.RDTR;
|
||||
to_send.RDLR = to_push.RDLR;
|
||||
to_send.RDHR = to_push.RDHR;
|
||||
can_send(&to_send, bus_fwd_num, true);
|
||||
}
|
||||
|
||||
can_rx_errs += safety_rx_hook(&to_push) ? 0U : 1U;
|
||||
ignition_can_hook(&to_push);
|
||||
|
||||
current_board->set_led(LED_BLUE, true);
|
||||
can_send_errs += can_push(&can_rx_q, &to_push) ? 0U : 1U;
|
||||
|
||||
// update read index
|
||||
CANx->RXF0A = rx_fifo_idx;
|
||||
}
|
||||
|
||||
} else if((CANx->IR & (FDCAN_IR_PEA | FDCAN_IR_PED | FDCAN_IR_RF0L | FDCAN_IR_RF0F | FDCAN_IR_EW | FDCAN_IR_MRAF | FDCAN_IR_TOO)) != 0) {
|
||||
#ifdef DEBUG
|
||||
puts("FDCAN error, FDCAN_IR: ");puth(CANx->IR);puts("\n");
|
||||
#endif
|
||||
CANx->IR |= (FDCAN_IR_PEA | FDCAN_IR_PED | FDCAN_IR_RF0L | FDCAN_IR_RF0F | FDCAN_IR_EW | FDCAN_IR_MRAF | FDCAN_IR_TOO); // Clean all error flags
|
||||
can_err_cnt += 1;
|
||||
} else {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void FDCAN1_IT0_IRQ_Handler(void) { can_rx(0); }
|
||||
void FDCAN1_IT1_IRQ_Handler(void) { process_can(0); }
|
||||
|
||||
void FDCAN2_IT0_IRQ_Handler(void) { can_rx(1); }
|
||||
void FDCAN2_IT1_IRQ_Handler(void) { process_can(1); }
|
||||
|
||||
void FDCAN3_IT0_IRQ_Handler(void) { can_rx(2); }
|
||||
void FDCAN3_IT1_IRQ_Handler(void) { process_can(2); }
|
||||
|
||||
bool can_init(uint8_t can_number) {
|
||||
bool ret = false;
|
||||
|
||||
REGISTER_INTERRUPT(FDCAN1_IT0_IRQn, FDCAN1_IT0_IRQ_Handler, CAN_INTERRUPT_RATE, FAULT_INTERRUPT_RATE_CAN_1)
|
||||
REGISTER_INTERRUPT(FDCAN1_IT1_IRQn, FDCAN1_IT1_IRQ_Handler, CAN_INTERRUPT_RATE, FAULT_INTERRUPT_RATE_CAN_1)
|
||||
REGISTER_INTERRUPT(FDCAN2_IT0_IRQn, FDCAN2_IT0_IRQ_Handler, CAN_INTERRUPT_RATE, FAULT_INTERRUPT_RATE_CAN_2)
|
||||
REGISTER_INTERRUPT(FDCAN2_IT1_IRQn, FDCAN2_IT1_IRQ_Handler, CAN_INTERRUPT_RATE, FAULT_INTERRUPT_RATE_CAN_2)
|
||||
REGISTER_INTERRUPT(FDCAN3_IT0_IRQn, FDCAN3_IT0_IRQ_Handler, CAN_INTERRUPT_RATE, FAULT_INTERRUPT_RATE_CAN_3)
|
||||
REGISTER_INTERRUPT(FDCAN3_IT1_IRQn, FDCAN3_IT1_IRQ_Handler, CAN_INTERRUPT_RATE, FAULT_INTERRUPT_RATE_CAN_3)
|
||||
|
||||
if (can_number != 0xffU) {
|
||||
FDCAN_GlobalTypeDef *CANx = CANIF_FROM_CAN_NUM(can_number);
|
||||
ret &= can_set_speed(can_number);
|
||||
ret &= llcan_init(CANx);
|
||||
// in case there are queued up messages
|
||||
process_can(can_number);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -38,6 +38,7 @@ typedef struct uart_ring {
|
||||
// ***************************** Function prototypes *****************************
|
||||
void debug_ring_callback(uart_ring *ring);
|
||||
void uart_tx_ring(uart_ring *q);
|
||||
void uart_send_break(uart_ring *u);
|
||||
|
||||
// ******************************** UART buffers ********************************
|
||||
|
||||
@@ -138,11 +139,6 @@ void uart_flush_sync(uart_ring *q) {
|
||||
}
|
||||
}
|
||||
|
||||
void uart_send_break(uart_ring *u) {
|
||||
while ((u->uart->CR1 & USART_CR1_SBK) != 0);
|
||||
u->uart->CR1 |= USART_CR1_SBK;
|
||||
}
|
||||
|
||||
void clear_uart_buff(uart_ring *q) {
|
||||
ENTER_CRITICAL();
|
||||
q->w_ptr_tx = 0;
|
||||
|
||||
@@ -123,7 +123,7 @@ uint8_t device_desc[] = {
|
||||
0xFF, 0xFF, 0xFF, 0x40, // Class, Subclass, Protocol, Max Packet Size
|
||||
TOUSBORDER(USB_VID), // idVendor
|
||||
TOUSBORDER(USB_PID), // idProduct
|
||||
0x00, 0x23, // bcdDevice
|
||||
0x00, 0x00, // bcdDevice
|
||||
0x01, 0x02, // Manufacturer, Product
|
||||
0x03, 0x01 // Serial Number, Num Configurations
|
||||
};
|
||||
@@ -526,6 +526,8 @@ void usb_setup(void) {
|
||||
case USB_DESC_TYPE_DEVICE:
|
||||
//puts(" writing device descriptor\n");
|
||||
|
||||
// set bcdDevice to hardware type
|
||||
device_desc[13] = hw_type;
|
||||
// setup transfer
|
||||
USB_WritePacket(device_desc, MIN(sizeof(device_desc), setup.b.wLength.w), 0);
|
||||
USBx_OUTEP(0)->DOEPCTL |= USB_OTG_DOEPCTL_CNAK;
|
||||
|
||||
5
panda/board/flash_h7.sh
Executable file
5
panda/board/flash_h7.sh
Executable file
@@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env sh
|
||||
set -e
|
||||
|
||||
PANDA_GEN3=1 scons -u
|
||||
PYTHONPATH=.. python3 -c "from python import Panda; Panda().flash('obj/panda_h7.bin.signed')"
|
||||
@@ -1,6 +1,6 @@
|
||||
// flasher state variables
|
||||
uint32_t *prog_ptr = NULL;
|
||||
int unlocked = 0;
|
||||
bool unlocked = false;
|
||||
|
||||
#ifdef uart_ring
|
||||
void debug_ring_callback(uart_ring *ring) {}
|
||||
@@ -26,32 +26,27 @@ int usb_cb_control_msg(USB_Setup_TypeDef *setup, uint8_t *resp, bool hardwired)
|
||||
break;
|
||||
// **** 0xb1: unlock flash
|
||||
case 0xb1:
|
||||
if (FLASH->CR & FLASH_CR_LOCK) {
|
||||
FLASH->KEYR = 0x45670123;
|
||||
FLASH->KEYR = 0xCDEF89AB;
|
||||
if (flash_is_locked()) {
|
||||
flash_unlock();
|
||||
resp[1] = 0xff;
|
||||
}
|
||||
current_board->set_led(LED_GREEN, 1);
|
||||
unlocked = 1;
|
||||
prog_ptr = (uint32_t *)0x8004000;
|
||||
unlocked = true;
|
||||
prog_ptr = (uint32_t *)APP_START_ADDRESS;
|
||||
break;
|
||||
// **** 0xb2: erase sector
|
||||
case 0xb2:
|
||||
sec = setup->b.wValue.w;
|
||||
// don't erase the bootloader
|
||||
if (sec != 0 && sec < 12 && unlocked) {
|
||||
FLASH->CR = (sec << 3) | FLASH_CR_SER;
|
||||
FLASH->CR |= FLASH_CR_STRT;
|
||||
while (FLASH->SR & FLASH_SR_BSY);
|
||||
if (flash_erase_sector(sec, unlocked)) {
|
||||
resp[1] = 0xff;
|
||||
}
|
||||
break;
|
||||
// **** 0xd0: fetch serial number
|
||||
case 0xd0:
|
||||
#ifdef STM32F4
|
||||
#ifndef STM32F2
|
||||
// addresses are OTP
|
||||
if (setup->b.wValue.w == 1) {
|
||||
memcpy(resp, (void *)0x1fff79c0, 0x10);
|
||||
memcpy(resp, (void *)DEVICE_SERIAL_NUMBER_ADDRESS, 0x10);
|
||||
resp_len = 0x10;
|
||||
} else {
|
||||
get_provision_chunk(resp);
|
||||
@@ -93,6 +88,7 @@ int usb_cb_control_msg(USB_Setup_TypeDef *setup, uint8_t *resp, bool hardwired)
|
||||
break;
|
||||
// **** 0xd8: reset ST
|
||||
case 0xd8:
|
||||
flush_write_buffer();
|
||||
NVIC_SystemReset();
|
||||
break;
|
||||
}
|
||||
@@ -122,11 +118,7 @@ void usb_cb_ep2_out(void *usbdata, int len, bool hardwired) {
|
||||
UNUSED(hardwired);
|
||||
current_board->set_led(LED_RED, 0);
|
||||
for (int i = 0; i < len/4; i++) {
|
||||
// program byte 1
|
||||
FLASH->CR = FLASH_CR_PSIZE_1 | FLASH_CR_PG;
|
||||
|
||||
*prog_ptr = *(uint32_t*)(usbdata+(i*4));
|
||||
while (FLASH->SR & FLASH_SR_BSY);
|
||||
flash_write_word(prog_ptr, *(uint32_t*)(usbdata+(i*4)));
|
||||
|
||||
//*(uint64_t*)(&spi_tx_buf[0x30+(i*4)]) = *prog_ptr;
|
||||
prog_ptr++;
|
||||
@@ -153,7 +145,7 @@ int spi_cb_rx(uint8_t *data, int len, uint8_t *data_out) {
|
||||
|
||||
#ifdef PEDAL
|
||||
|
||||
#include "stm32fx/llcan.h"
|
||||
#include "stm32fx/llbxcan.h"
|
||||
#define CAN CAN1
|
||||
|
||||
#define CAN_BL_INPUT 0x1
|
||||
@@ -278,10 +270,7 @@ void soft_flasher_start(void) {
|
||||
|
||||
enter_bootloader_mode = 0;
|
||||
|
||||
RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;
|
||||
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
|
||||
RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
|
||||
RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
|
||||
flasher_peripherals_init();
|
||||
|
||||
// pedal has the canloader
|
||||
#ifdef PEDAL
|
||||
@@ -297,23 +286,8 @@ void soft_flasher_start(void) {
|
||||
llcan_init(CAN1);
|
||||
#endif
|
||||
|
||||
// A4,A5,A6,A7: setup SPI
|
||||
set_gpio_alternate(GPIOA, 4, GPIO_AF5_SPI1);
|
||||
set_gpio_alternate(GPIOA, 5, GPIO_AF5_SPI1);
|
||||
set_gpio_alternate(GPIOA, 6, GPIO_AF5_SPI1);
|
||||
set_gpio_alternate(GPIOA, 7, GPIO_AF5_SPI1);
|
||||
|
||||
// A2,A3: USART 2 for debugging
|
||||
set_gpio_alternate(GPIOA, 2, GPIO_AF7_USART2);
|
||||
set_gpio_alternate(GPIOA, 3, GPIO_AF7_USART2);
|
||||
|
||||
// A11,A12: USB
|
||||
set_gpio_alternate(GPIOA, 11, GPIO_AF10_OTG_FS);
|
||||
set_gpio_alternate(GPIOA, 12, GPIO_AF10_OTG_FS);
|
||||
GPIOA->OSPEEDR = GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR12;
|
||||
|
||||
// flasher
|
||||
//spi_init();
|
||||
gpio_usart2_init();
|
||||
gpio_usb_init();
|
||||
|
||||
// enable USB
|
||||
usb_init();
|
||||
@@ -12,7 +12,13 @@
|
||||
#include "power_saving.h"
|
||||
#include "safety.h"
|
||||
|
||||
#include "drivers/can.h"
|
||||
#include "drivers/can_common.h"
|
||||
|
||||
#ifdef STM32H7
|
||||
#include "drivers/fdcan.h"
|
||||
#else
|
||||
#include "drivers/bxcan.h"
|
||||
#endif
|
||||
|
||||
#include "obj/gitversion.h"
|
||||
|
||||
@@ -103,10 +109,24 @@ void set_safety_mode(uint16_t mode, int16_t param) {
|
||||
switch (mode_copy) {
|
||||
case SAFETY_SILENT:
|
||||
set_intercept_relay(false);
|
||||
#ifdef vw
|
||||
// Volkswagen community port:
|
||||
// J533 integrations with White/Grey Panda really need Panda to respond
|
||||
// at all times. Let the CAN transceivers ACK traffic unless this is
|
||||
// BP/Uno where the physical relay makes it irrelevant. This makes
|
||||
// SILENT identical to NOOUTPUT for White/Grey Panda.
|
||||
if (current_board->has_obd) {
|
||||
current_board->set_can_mode(CAN_MODE_NORMAL);
|
||||
can_silent = ALL_CAN_SILENT;
|
||||
} else {
|
||||
can_silent = ALL_CAN_LIVE;
|
||||
}
|
||||
#else
|
||||
if (current_board->has_obd) {
|
||||
current_board->set_can_mode(CAN_MODE_NORMAL);
|
||||
}
|
||||
can_silent = ALL_CAN_SILENT;
|
||||
#endif
|
||||
break;
|
||||
case SAFETY_NOOUTPUT:
|
||||
set_intercept_relay(false);
|
||||
@@ -464,6 +484,7 @@ int usb_cb_control_msg(USB_Setup_TypeDef *setup, uint8_t *resp, bool hardwired)
|
||||
// **** 0xde: set can bitrate
|
||||
case 0xde:
|
||||
if (setup->b.wValue.w < BUS_MAX) {
|
||||
// TODO: add sanity check, ideally check if value is correct(from array of correct values)
|
||||
can_speed[setup->b.wValue.w] = setup->b.wIndex.w;
|
||||
bool ret = can_init(CAN_NUM_FROM_BUS_NUM(setup->b.wValue.w));
|
||||
UNUSED(ret);
|
||||
@@ -617,6 +638,15 @@ int usb_cb_control_msg(USB_Setup_TypeDef *setup, uint8_t *resp, bool hardwired)
|
||||
heartbeat_disabled = true;
|
||||
break;
|
||||
#endif
|
||||
// **** 0xde: set CAN FD data bitrate
|
||||
case 0xf9:
|
||||
if (setup->b.wValue.w < CAN_MAX) {
|
||||
// TODO: add sanity check, ideally check if value is correct(from array of correct values)
|
||||
can_data_speed[setup->b.wValue.w] = setup->b.wIndex.w;
|
||||
bool ret = can_init(CAN_NUM_FROM_BUS_NUM(setup->b.wValue.w));
|
||||
UNUSED(ret);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
puts("NO HANDLER ");
|
||||
puth(setup->b.bRequest);
|
||||
|
||||
@@ -28,7 +28,14 @@ void set_power_save_state(int state) {
|
||||
enable = true;
|
||||
}
|
||||
|
||||
#ifdef vw
|
||||
// Volkswagen community port:
|
||||
// If this is a White or Grey Panda, always keep the CAN transceivers
|
||||
// powered up so that transparent forwarding is maintained.
|
||||
current_board->enable_can_transceivers(current_board->has_obd ? enable : true);
|
||||
#else
|
||||
current_board->enable_can_transceivers(enable);
|
||||
#endif
|
||||
|
||||
// Switch EPS/GPS
|
||||
if (enable) {
|
||||
|
||||
11
panda/board/recover_h7.sh
Executable file
11
panda/board/recover_h7.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env sh
|
||||
set -e
|
||||
|
||||
DFU_UTIL="dfu-util"
|
||||
|
||||
PANDA_H7=1 scons -u
|
||||
|
||||
PYTHONPATH=.. python3 -c "from python import Panda; Panda().reset(enter_bootstub=True); Panda().reset(enter_bootloader=True)" || true
|
||||
sleep 1
|
||||
$DFU_UTIL -d 0483:df11 -a 0 -s 0x08020000 -D obj/panda_h7.bin.signed
|
||||
$DFU_UTIL -d 0483:df11 -a 0 -s 0x08000000:leave -D obj/bootstub.panda_h7.bin
|
||||
@@ -24,9 +24,32 @@ static int nooutput_tx_lin_hook(int lin_num, uint8_t *data, int len) {
|
||||
}
|
||||
|
||||
static int default_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
||||
UNUSED(bus_num);
|
||||
UNUSED(to_fwd);
|
||||
#ifdef vw
|
||||
// Volkswagen community port: Advanced Virtual Relay Technology!
|
||||
// Make Panda fully transparent from bus 0->2 and bus 2->0 if not otherwise
|
||||
// instructed by EON/OP, returning the car to stock behavior under NOOUTPUT.
|
||||
// Don't do this for BP/C2, where we have Advanced Actual Relay Technology.
|
||||
int bus_fwd = -1;
|
||||
|
||||
if(hw_type == HW_TYPE_WHITE_PANDA || hw_type == HW_TYPE_GREY_PANDA) {
|
||||
switch (bus_num) {
|
||||
case 0:
|
||||
bus_fwd = 2;
|
||||
break;
|
||||
case 2:
|
||||
bus_fwd = 0;
|
||||
break;
|
||||
default:
|
||||
bus_fwd = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return bus_fwd;
|
||||
#else
|
||||
UNUSED(bus_num);
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
const safety_hooks nooutput_hooks = {
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
// brake rising edge
|
||||
// brake > 0mph
|
||||
const CanMsg HONDA_N_TX_MSGS[] = {{0xE4, 0, 5}, {0x194, 0, 4}, {0x1FA, 0, 8}, {0x200, 0, 6}, {0x30C, 0, 8}, {0x33D, 0, 5}};
|
||||
const CanMsg HONDA_BG_TX_MSGS[] = {{0xE4, 2, 5}, {0xE5, 2, 8}, {0x296, 0, 4}, {0x33D, 2, 5}}; // Bosch Giraffe
|
||||
const CanMsg HONDA_BH_TX_MSGS[] = {{0xE4, 0, 5}, {0xE5, 0, 8}, {0x296, 1, 4}, {0x33D, 0, 5}}; // Bosch Harness
|
||||
const CanMsg HONDA_BG_TX_MSGS[] = {{0xE4, 2, 5}, {0xE5, 2, 8}, {0x296, 0, 4}, {0x33D, 2, 5}, {0x33DA, 2, 5}, {0x33DB, 2, 8}}; // Bosch Giraffe
|
||||
const CanMsg HONDA_BH_TX_MSGS[] = {{0xE4, 0, 5}, {0xE5, 0, 8}, {0x296, 1, 4}, {0x33D, 0, 5}, {0x33DA, 0, 5}, {0x33DB, 0, 8}}; // Bosch Harness
|
||||
const CanMsg HONDA_BG_LONG_TX_MSGS[] = {{0xE4, 0, 5}, {0x1DF, 0, 8}, {0x1EF, 0, 8}, {0x1FA, 0, 8}, {0x30C, 0, 8}, {0x33D, 0, 5}, {0x39F, 0, 8}, {0x18DAB0F1, 0, 8}}; // Bosch Giraffe w/ gas and brakes
|
||||
const CanMsg HONDA_BH_LONG_TX_MSGS[] = {{0xE4, 1, 5}, {0x1DF, 1, 8}, {0x1EF, 1, 8}, {0x1FA, 1, 8}, {0x30C, 1, 8}, {0x33D, 1, 5}, {0x39F, 1, 8}, {0x18DAB0F1, 1, 8}}; // Bosch Harness w/ gas and brakes
|
||||
|
||||
@@ -274,7 +274,7 @@ static int honda_tx_hook(CAN_FIFOMailBox_TypeDef *to_send) {
|
||||
}
|
||||
}
|
||||
|
||||
// Bosch supplemental control check
|
||||
// Bosch supplemental control check
|
||||
if (addr == 0xE5) {
|
||||
if ((GET_BYTES_04(to_send) != 0x10800004) || ((GET_BYTES_48(to_send) & 0x00FFFFFF) != 0x0)) {
|
||||
tx = 0;
|
||||
@@ -376,7 +376,7 @@ static int honda_bosch_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
||||
}
|
||||
if (bus_num == bus_rdr_cam) {
|
||||
int addr = GET_ADDR(to_fwd);
|
||||
int is_lkas_msg = (addr == 0xE4) || (addr == 0xE5) || (addr == 0x33D);
|
||||
int is_lkas_msg = (addr == 0xE4) || (addr == 0xE5) || (addr == 0x33D) || (addr == 0x33DA) || (addr == 0x33DB);
|
||||
if (!is_lkas_msg) {
|
||||
bus_fwd = bus_rdr_car;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
// Safety-relevant steering constants for Volkswagen
|
||||
const int VOLKSWAGEN_MAX_STEER = 300; // 3.0 Nm (EPS side max of 3.0Nm with fault if violated)
|
||||
const int VOLKSWAGEN_MAX_RT_DELTA = 75; // 4 max rate up * 50Hz send rate * 250000 RT interval / 1000000 = 50 ; 50 * 1.5 for safety pad = 75
|
||||
const int VOLKSWAGEN_MAX_RT_DELTA = 188; // 10 max rate up * 50Hz send rate * 250000 RT interval / 1000000 = 125 ; 125 * 1.5 for safety pad = 187.5
|
||||
const uint32_t VOLKSWAGEN_RT_INTERVAL = 250000; // 250ms between real time checks
|
||||
const int VOLKSWAGEN_MAX_RATE_UP = 4; // 2.0 Nm/s RoC limit (EPS rack has own soft-limit of 5.0 Nm/s)
|
||||
const int VOLKSWAGEN_MAX_RATE_UP = 10; // 5.0 Nm/s RoC limit (EPS rack has own soft-limit of 5.0 Nm/s)
|
||||
const int VOLKSWAGEN_MAX_RATE_DOWN = 10; // 5.0 Nm/s RoC limit (EPS rack has own soft-limit of 5.0 Nm/s)
|
||||
const int VOLKSWAGEN_DRIVER_TORQUE_ALLOWANCE = 80;
|
||||
const int VOLKSWAGEN_DRIVER_TORQUE_FACTOR = 3;
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// Hardware abstraction layer for all different supported boards //
|
||||
// ///////////////////////////////////////////////////////////// //
|
||||
#include "boards/board_declarations.h"
|
||||
#include "boards/unused_funcs.h"
|
||||
|
||||
// ///// Board definition and detection ///// //
|
||||
#include "drivers/harness.h"
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
* is using in the C source code, usually in main.c. This file contains:
|
||||
* - Configuration section that allows to select:
|
||||
* - The STM32F2xx device used in the target application
|
||||
* - To use or not the peripheral’s drivers in application code(i.e.
|
||||
* code will be based on direct access to peripheral’s registers
|
||||
* - To use or not the peripheral’s drivers in application code(i.e.
|
||||
* code will be based on direct access to peripheral’s registers
|
||||
* rather than drivers API), this option is controlled by
|
||||
* "#define USE_HAL_DRIVER"
|
||||
*
|
||||
@@ -74,7 +74,7 @@
|
||||
/* Uncomment the line below according to the target STM32 device used in your
|
||||
application
|
||||
*/
|
||||
#if !defined (STM32F205xx) && !defined (STM32F215xx) && !defined (STM32F207xx) && !defined (STM32F217xx)
|
||||
/* #if !defined (STM32F205xx) && !defined (STM32F215xx) && !defined (STM32F207xx) && !defined (STM32F217xx) */
|
||||
|
||||
/* #define STM32F205xx */ /*!< STM32F205RG, STM32F205VG, STM32F205ZG, STM32F205RF, STM32F205VF, STM32F205ZF,
|
||||
STM32F205RE, STM32F205VE, STM32F205ZE, STM32F205RC, STM32F205VC, STM32F205ZC,
|
||||
@@ -84,7 +84,7 @@
|
||||
STM32F207VE, STM32F207ZE, STM32F207IE, STM32F207VC, STM32F207ZC and STM32F207IC Devices */
|
||||
/* #define STM32F217xx */ /*!< STM32F217VG, STM32F217ZG, STM32F217IG, STM32F217VE, STM32F217ZE and STM32F217IE Devices */
|
||||
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
/* Tip: To avoid modifying this file each time you need to switch between these
|
||||
devices, you can define the device in your toolchain compiler preprocessor.
|
||||
@@ -118,14 +118,14 @@
|
||||
* @{
|
||||
*/
|
||||
|
||||
#if defined(STM32F205xx)
|
||||
#include "stm32f205xx.h"
|
||||
#elif defined(STM32F215xx)
|
||||
#if defined(STM32F215xx)
|
||||
#include "stm32f215xx.h"
|
||||
#elif defined(STM32F207xx)
|
||||
#include "stm32f207xx.h"
|
||||
#elif defined(STM32F217xx)
|
||||
#include "stm32f217xx.h"
|
||||
#elif defined(STM32F205xx)
|
||||
#include "stm32f205xx.h"
|
||||
// #elif defined(STM32F207xx)
|
||||
// #include "stm32f207xx.h"
|
||||
// #elif defined(STM32F217xx)
|
||||
// #include "stm32f217xx.h"
|
||||
#else
|
||||
#error "Please select first the target STM32F2xx device used in your application (in stm32f2xx.h file)"
|
||||
#endif
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
* is using in the C source code, usually in main.c. This file contains:
|
||||
* - Configuration section that allows to select:
|
||||
* - The STM32F4xx device used in the target application
|
||||
* - To use or not the peripheral’s drivers in application code(i.e.
|
||||
* code will be based on direct access to peripheral’s registers
|
||||
* - To use or not the peripheral’s drivers in application code(i.e.
|
||||
* code will be based on direct access to peripheral’s registers
|
||||
* rather than drivers API), this option is controlled by
|
||||
* "#define USE_HAL_DRIVER"
|
||||
*
|
||||
@@ -74,12 +74,12 @@
|
||||
/* Uncomment the line below according to the target STM32 device used in your
|
||||
application
|
||||
*/
|
||||
#if !defined (STM32F405xx) && !defined (STM32F415xx) && !defined (STM32F407xx) && !defined (STM32F417xx) && \
|
||||
/* #if !defined (STM32F405xx) && !defined (STM32F415xx) && !defined (STM32F407xx) && !defined (STM32F417xx) && \
|
||||
!defined (STM32F427xx) && !defined (STM32F437xx) && !defined (STM32F429xx) && !defined (STM32F439xx) && \
|
||||
!defined (STM32F401xC) && !defined (STM32F401xE) && !defined (STM32F410Tx) && !defined (STM32F410Cx) && \
|
||||
!defined (STM32F410Rx) && !defined (STM32F411xE) && !defined (STM32F446xx) && !defined (STM32F469xx) && \
|
||||
!defined (STM32F479xx) && !defined (STM32F412Cx) && !defined (STM32F412Rx) && !defined (STM32F412Vx) && \
|
||||
!defined (STM32F412Zx) && !defined (STM32F413xx) && !defined (STM32F423xx)
|
||||
!defined (STM32F412Zx) && !defined (STM32F413xx) && !defined (STM32F423xx) */
|
||||
/* #define STM32F405xx */ /*!< STM32F405RG, STM32F405VG and STM32F405ZG Devices */
|
||||
/* #define STM32F415xx */ /*!< STM32F415RG, STM32F415VG and STM32F415ZG Devices */
|
||||
/* #define STM32F407xx */ /*!< STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG and STM32F407IE Devices */
|
||||
@@ -109,7 +109,7 @@
|
||||
/* #define STM32F413xx */ /*!< STM32F413CH, STM32F413MH, STM32F413RH, STM32F413VH, STM32F413ZH, STM32F413CG, STM32F413MG,
|
||||
STM32F413RG, STM32F413VG and STM32F413ZG Devices */
|
||||
/* #define STM32F423xx */ /*!< STM32F423CH, STM32F423RH, STM32F423VH and STM32F423ZH Devices */
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
/* Tip: To avoid modifying this file each time you need to switch between these
|
||||
devices, you can define the device in your toolchain compiler preprocessor.
|
||||
@@ -143,51 +143,51 @@
|
||||
* @{
|
||||
*/
|
||||
|
||||
#if defined(STM32F405xx)
|
||||
#include "stm32f405xx.h"
|
||||
#elif defined(STM32F415xx)
|
||||
#include "stm32f415xx.h"
|
||||
#elif defined(STM32F407xx)
|
||||
#include "stm32f407xx.h"
|
||||
#elif defined(STM32F417xx)
|
||||
#include "stm32f417xx.h"
|
||||
#elif defined(STM32F427xx)
|
||||
#include "stm32f427xx.h"
|
||||
#elif defined(STM32F437xx)
|
||||
#include "stm32f437xx.h"
|
||||
#elif defined(STM32F429xx)
|
||||
#include "stm32f429xx.h"
|
||||
#elif defined(STM32F439xx)
|
||||
#include "stm32f439xx.h"
|
||||
#elif defined(STM32F401xC)
|
||||
#include "stm32f401xc.h"
|
||||
#elif defined(STM32F401xE)
|
||||
#include "stm32f401xe.h"
|
||||
#elif defined(STM32F410Tx)
|
||||
#include "stm32f410tx.h"
|
||||
#elif defined(STM32F410Cx)
|
||||
#include "stm32f410cx.h"
|
||||
#elif defined(STM32F410Rx)
|
||||
#include "stm32f410rx.h"
|
||||
#elif defined(STM32F411xE)
|
||||
#include "stm32f411xe.h"
|
||||
#elif defined(STM32F446xx)
|
||||
#include "stm32f446xx.h"
|
||||
#elif defined(STM32F469xx)
|
||||
#include "stm32f469xx.h"
|
||||
#elif defined(STM32F479xx)
|
||||
#include "stm32f479xx.h"
|
||||
#elif defined(STM32F412Cx)
|
||||
#include "stm32f412cx.h"
|
||||
#elif defined(STM32F412Zx)
|
||||
#include "stm32f412zx.h"
|
||||
#elif defined(STM32F412Rx)
|
||||
#include "stm32f412rx.h"
|
||||
#elif defined(STM32F412Vx)
|
||||
#include "stm32f412vx.h"
|
||||
#elif defined(STM32F413xx)
|
||||
// #if defined(STM32F405xx)
|
||||
// #include "stm32f405xx.h"
|
||||
// #elif defined(STM32F415xx)
|
||||
// #include "stm32f415xx.h"
|
||||
// #elif defined(STM32F407xx)
|
||||
// #include "stm32f407xx.h"
|
||||
// #elif defined(STM32F417xx)
|
||||
// #include "stm32f417xx.h"
|
||||
// #elif defined(STM32F427xx)
|
||||
// #include "stm32f427xx.h"
|
||||
// #elif defined(STM32F437xx)
|
||||
// #include "stm32f437xx.h"
|
||||
// #elif defined(STM32F429xx)
|
||||
// #include "stm32f429xx.h"
|
||||
// #elif defined(STM32F439xx)
|
||||
// #include "stm32f439xx.h"
|
||||
// #elif defined(STM32F401xC)
|
||||
// #include "stm32f401xc.h"
|
||||
// #elif defined(STM32F401xE)
|
||||
// #include "stm32f401xe.h"
|
||||
// #elif defined(STM32F410Tx)
|
||||
// #include "stm32f410tx.h"
|
||||
// #elif defined(STM32F410Cx)
|
||||
// #include "stm32f410cx.h"
|
||||
// #elif defined(STM32F410Rx)
|
||||
// #include "stm32f410rx.h"
|
||||
// #elif defined(STM32F411xE)
|
||||
// #include "stm32f411xe.h"
|
||||
// #elif defined(STM32F446xx)
|
||||
// #include "stm32f446xx.h"
|
||||
// #elif defined(STM32F469xx)
|
||||
// #include "stm32f469xx.h"
|
||||
// #elif defined(STM32F479xx)
|
||||
// #include "stm32f479xx.h"
|
||||
// #elif defined(STM32F412Cx)
|
||||
// #include "stm32f412cx.h"
|
||||
// #elif defined(STM32F412Zx)
|
||||
// #include "stm32f412zx.h"
|
||||
// #elif defined(STM32F412Rx)
|
||||
// #include "stm32f412rx.h"
|
||||
// #elif defined(STM32F412Vx)
|
||||
// #include "stm32f412vx.h"
|
||||
#if defined(STM32F413xx)
|
||||
#include "stm32f413xx.h"
|
||||
#elif defined(STM32F423xx)
|
||||
#elif defined(STM32F423xx)
|
||||
#include "stm32f423xx.h"
|
||||
#else
|
||||
#error "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)"
|
||||
|
||||
@@ -8,15 +8,6 @@
|
||||
// 5000 = 500 kbps
|
||||
#define can_speed_to_prescaler(x) (CAN_PCLK / CAN_QUANTA * 10U / (x))
|
||||
|
||||
#define GET_BUS(msg) (((msg)->RDTR >> 4) & 0xFF)
|
||||
#define GET_LEN(msg) ((msg)->RDTR & 0xF)
|
||||
#define GET_ADDR(msg) ((((msg)->RIR & 4) != 0) ? ((msg)->RIR >> 3) : ((msg)->RIR >> 21))
|
||||
#define GET_BYTE(msg, b) (((int)(b) > 3) ? (((msg)->RDHR >> (8U * ((unsigned int)(b) % 4U))) & 0xFFU) : (((msg)->RDLR >> (8U * (unsigned int)(b))) & 0xFFU))
|
||||
#define GET_BYTES_04(msg) ((msg)->RDLR)
|
||||
#define GET_BYTES_48(msg) ((msg)->RDHR)
|
||||
#define GET_FLAG(value, mask) (((__typeof__(mask))(value) & (mask)) == (mask))
|
||||
|
||||
#define CAN_INIT_TIMEOUT_MS 500U
|
||||
#define CAN_NAME_FROM_CANIF(CAN_DEV) (((CAN_DEV)==CAN1) ? "CAN1" : (((CAN_DEV) == CAN2) ? "CAN2" : "CAN3"))
|
||||
|
||||
void puts(const char *a);
|
||||
28
panda/board/stm32fx/llflash.h
Normal file
28
panda/board/stm32fx/llflash.h
Normal file
@@ -0,0 +1,28 @@
|
||||
bool flash_is_locked(void) {
|
||||
return (FLASH->CR & FLASH_CR_LOCK);
|
||||
}
|
||||
|
||||
void flash_unlock(void) {
|
||||
FLASH->KEYR = 0x45670123;
|
||||
FLASH->KEYR = 0xCDEF89AB;
|
||||
}
|
||||
|
||||
bool flash_erase_sector(uint8_t sector, bool unlocked) {
|
||||
// don't erase the bootloader(sector 0)
|
||||
if (sector != 0 && sector < 12 && unlocked) {
|
||||
FLASH->CR = (sector << 3) | FLASH_CR_SER;
|
||||
FLASH->CR |= FLASH_CR_STRT;
|
||||
while (FLASH->SR & FLASH_SR_BSY);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void flash_write_word(void *prog_ptr, uint32_t data) {
|
||||
uint32_t *pp = prog_ptr;
|
||||
FLASH->CR = FLASH_CR_PSIZE_1 | FLASH_CR_PG;
|
||||
*pp = data;
|
||||
while (FLASH->SR & FLASH_SR_BSY);
|
||||
}
|
||||
|
||||
void flush_write_buffer(void) { }
|
||||
@@ -42,6 +42,11 @@ void uart_rx_ring(uart_ring *q){
|
||||
}
|
||||
}
|
||||
|
||||
void uart_send_break(uart_ring *u) {
|
||||
while ((u->uart->CR1 & USART_CR1_SBK) != 0);
|
||||
u->uart->CR1 |= USART_CR1_SBK;
|
||||
}
|
||||
|
||||
// This function should be called on:
|
||||
// * Half-transfer DMA interrupt
|
||||
// * Full-transfer DMA interrupt
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
void gpio_usb_init(void) {
|
||||
// A11,A12: USB
|
||||
set_gpio_alternate(GPIOA, 11, GPIO_AF10_OTG_FS);
|
||||
set_gpio_alternate(GPIOA, 12, GPIO_AF10_OTG_FS);
|
||||
GPIOA->OSPEEDR = GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR12;
|
||||
}
|
||||
|
||||
void gpio_usart2_init(void) {
|
||||
// A2,A3: USART 2 for debugging
|
||||
set_gpio_alternate(GPIOA, 2, GPIO_AF7_USART2);
|
||||
set_gpio_alternate(GPIOA, 3, GPIO_AF7_USART2);
|
||||
}
|
||||
|
||||
// Common GPIO initialization
|
||||
void common_init_gpio(void){
|
||||
void common_init_gpio(void) {
|
||||
// TODO: Is this block actually doing something???
|
||||
// pull low to hold ESP in reset??
|
||||
// enable OTG out tied to ground
|
||||
@@ -12,10 +25,7 @@ void common_init_gpio(void){
|
||||
// C2: Voltage sense line
|
||||
set_gpio_mode(GPIOC, 2, MODE_ANALOG);
|
||||
|
||||
// A11,A12: USB
|
||||
set_gpio_alternate(GPIOA, 11, GPIO_AF10_OTG_FS);
|
||||
set_gpio_alternate(GPIOA, 12, GPIO_AF10_OTG_FS);
|
||||
GPIOA->OSPEEDR = GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR12;
|
||||
gpio_usb_init();
|
||||
|
||||
// A9,A10: USART 1 for talking to the GPS
|
||||
set_gpio_alternate(GPIOA, 9, GPIO_AF7_USART1);
|
||||
@@ -31,8 +41,15 @@ void common_init_gpio(void){
|
||||
#endif
|
||||
}
|
||||
|
||||
void flasher_peripherals_init(void) {
|
||||
RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;
|
||||
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
|
||||
RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
|
||||
RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
|
||||
}
|
||||
|
||||
// Peripheral initialization
|
||||
void peripherals_init(void){
|
||||
void peripherals_init(void) {
|
||||
// enable GPIOB, UART2, CAN, USB clock
|
||||
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
|
||||
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
|
||||
|
||||
@@ -67,8 +67,10 @@
|
||||
#include "stm32fx/lluart.h"
|
||||
#endif
|
||||
|
||||
#ifndef BOOTSTUB
|
||||
#include "stm32fx/llcan.h"
|
||||
#ifdef BOOTSTUB
|
||||
#include "stm32fx/llflash.h"
|
||||
#else
|
||||
#include "stm32fx/llbxcan.h"
|
||||
#endif
|
||||
|
||||
#if defined(PANDA) || defined(BOOTSTUB) || defined(PEDAL_USB)
|
||||
|
||||
@@ -35,7 +35,7 @@ ENTRY(Reset_Handler)
|
||||
/* Highest address of the user mode stack */
|
||||
enter_bootloader_mode = 0x2001FFFC;
|
||||
_estack = 0x2001FFFC; /* end of 128K RAM on AHB bus*/
|
||||
_app_start = 0x08004000; /* Reserve 16K for bootloader */
|
||||
_app_start = 0x08004000; /* Reserve Sector 0(16K) for bootloader */
|
||||
|
||||
/* Generate a link error if heap and stack don't fit into RAM */
|
||||
_Min_Heap_Size = 0; /* required amount of heap */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user