終於進入到驅動階段拉,當我們完成了 TF-A Optee Uboot 以及最重要的 kernel 後,接下來會遇到的就是 driver , 要怎麼讓我們的外部設備正常工作,也同樣的需要去配置設備樹以及對應的驅動等等才可以。
bitbake linux-stm32mp -c menuconfig
# 可使用這個指令來配置 kernel
# 使用Linux Menuconfig工具在核心配置中啟動CAN驅動程式。
路徑如下:
[*] Networking support --->
<*> CAN bus subsystem support --->
CAN Device Drivers --->
<*> Bosch M_CAN support
<*> Bosch M_CAN support for io-mapped devices
不同的廠家的開發板,對於腳位定義肯定不太相同,這邊我同樣使用 stm32mp1 為例來說明。
ST 原廠提供的設備樹已經配置了FDCAN1 的節點訊息,相關文件為Documentation/devicetree/bindings/net/can/m_can.txt。在stm32mp157-pinctrl.dtsi 檔案中,存在CAN 節點:
可以看到其實 m_can1_pins 腳位是多少屬性等等。
接著我們可以查找該板子的 dts tree。
EX: 在stm32mp153.dtsi 中,存在m_can 節點:
在 m_can1 節點底下的 compatible 當中可以看到 “bosch , m_can” , 逗號前面是供應商後面的 m_can 就是我們要找的驅動檔案。
路徑會在 drivers/net/can/m_can/m_can_platform.c , 像下方圖片一樣會有一段程式碼有對應的屬性,只要在我們的設備樹當中,擁有對應的字串就會自動地去對應到驅動。
也可以用以下指令來搜尋相關的檔案
grep -r m_can . # 會將檔案中有這段字的都顯示出來
find . -type d -name "m_can" # 搜尋資料夾的名稱
find . -type f -name "m_can" # 搜尋檔案名稱
檢查套件是否安裝
dpkg -l | grep can-utils
下方指令可以確認 m_can 是否正確註冊啟用
dmesg | grep m_can
[ 10.599337] m_can_platform 402d0000.can: m_can device registered (irq=72, version=32)
下方指令可以查找 net 底下的 interfaces
ls /sys/class/net
# 這邊會看到 can0 的接口 但太不一定是 active 的狀態 , 所以當使用 ifconfig 不見得會顯示
can0 eth0 eth1 lo
也可以用 ifconfig 指令來確認
ifconfig -a | grep can
can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
使用 iplink 來設定 socketCan 的接口
ip link set can0 type can bitrate 1000000 dbitrate 2000000 fd on
啟動或關閉
ip link set can0 up
ip -details link show can0
2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 72 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10
link/can promiscuity 0
can <FD> state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0
bitrate 996078 sample-point 0.745
...
ip link set can0 down
ip link set can0 type can bitrate 1000000 dbitrate 2000000 fd on loopback on
確認是否已開啟 loopback 模式
ip -details link show can0
2: can0: <NOARP,ECHO> mtu 72 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 10
link/can promiscuity 0
can <LOOPBACK,FD> state STOPPED (berr-counter tx 0 rx 0) restart-ms 0
bitrate 996078 sample-point 0.745
...
# 切換成 loopback 模式
ip link set can0 up type can bitrate 1000000 dbitrate 2000000 fd on loopback on
candump can0 -L & # 開啟接收can0端口 , 並且設定為背景運行
cansend can0 300#AC.AB.AD.AE.75.49.AD.D1 #傳送資料 ID 為300
(1539944874.949723) can0 300#ACABADAE7549ADD1
(1539944874.949683) can0 300#ACABADAE7549ADD1
假如有另外一個 Can 設備可以直接使用下方指令來做傳送 and 接收
sudo ip link set can0 up type can bitrate 500000 # 設定 baudrate
cansend can0 123#1122334455667788
candump can0 # 接收 bus 上的 can frame
can0 123 [8] 11 22 33 44 55 66 77 88