iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
佛心分享-SideProject30

門外漢的嵌入式地獄系列 第 25

Day 25 。初入嵌入式開發- CAN 驅動開發(一)

  • 分享至 

  • xImage
  •  

前言

終於進入到驅動階段拉,當我們完成了 TF-A Optee Uboot 以及最重要的 kernel 後,接下來會遇到的就是 driver , 要怎麼讓我們的外部設備正常工作,也同樣的需要去配置設備樹以及對應的驅動等等才可以。/images/emoticon/emoticon02.gif

配置 kernel

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 節點:

https://ithelp.ithome.com.tw/upload/images/20240821/20146325QD3SRP5bkW.png

可以看到其實 m_can1_pins 腳位是多少屬性等等。

接著我們可以查找該板子的 dts tree。

EX: 在stm32mp153.dtsi 中,存在m_can 節點:

https://ithelp.ithome.com.tw/upload/images/20240821/20146325dsUdYKZv6M.png

在 m_can1 節點底下的 compatible 當中可以看到 “bosch , m_can” , 逗號前面是供應商後面的 m_can 就是我們要找的驅動檔案。

路徑會在 drivers/net/can/m_can/m_can_platform.c , 像下方圖片一樣會有一段程式碼有對應的屬性,只要在我們的設備樹當中,擁有對應的字串就會自動地去對應到驅動。

https://ithelp.ithome.com.tw/upload/images/20240821/201463250QWXswLEu2.png

也可以用以下指令來搜尋相關的檔案

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

loopback 測試

 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


上一篇
Day 24 。初入嵌入式開發- 如何修改 BSP - Kernel 篇
下一篇
Day 26 。初入嵌入式開發- CAN 驅動開發(二)
系列文
門外漢的嵌入式地獄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言