SPI接口設備是一款使用率較高的設備,在用戶使用OKMX8MQ-C時可能需要添加新的SPI設備,或者將現有的SPI設備從當前的總線上更換到別的總線上,或更換片選。 對于SPI驅動不熟悉的人可能不是很了解在更改時都需要哪些操作和注意事項,下面我就來給大家介紹下如何修改。 首先,我們先來了解下OKMX8MQ–C SPI的驅動現狀。 關于OKMX8MQ –C SPI的驅動現狀 驅動是用bitbang的方式,驅動使用GPIO作為SPI的片選,而不是使用SPI控制器的原生片選。i.MX8MQ的SPI控制器支持4個片選,我們可以在一個SPI總線上添加4個片選連接4個設備。 i.MX8MQ有3個SPI總線,OKMX8MQ-C使用了2個,SPI1連接了設備MCP2518FD,SPI2沒有連接設備,而是將引腳通過插座引出,并且片選0的驅動使用了spidev,用戶可以通過這個spidev設備在用戶空間訪問cs0所連接的設備。 i.MX8MQ核心板引出了SPI3的引腳,但是在開發板上由于引腳復用,SPI3的引腳復用成了其他的功能,所以沒有作為SPI使用。 接下來,我們看下該如何對SPI驅動做出具體的修改。 01- 修改CS的gpio 修改spi2的cs0使用的gpio,由gpio5-13 到gpio3-19,修改設備樹OK8MQ-linux-kernel/arch/arm64/boot/dts/freescale/ok8mq-evk.dts,找到節點&ecspi2,將cs-gpios = <&gpio5 13 0>,修改為cs-gpios = <&gpio3 19 0>。 需要確認你使用的gpio3-19這個引腳的pinmux是GPIO功能,如果不是,則需要將其修改成GPIO。 代碼修改前后對比: 修改前: 修改后: 02- 修改spi設備節點 比如將spi2的cs0從原來的spidev驅動修改為mcp2518fd驅動: 修改設備樹OK8MQ-linux-kernel/arch/arm64/boot/dts/freescale/ok8mq-evk.dts,找到節點&ecspi2,將其下spidev@0節點刪除,添加mcp2518fd@0節點,這個節點下需要添加的特性需要根據這個設備的驅動添加,是這個spi設備的驅動需要的。 代碼修改前后對比: 修改前: 修改后: 03- 增加一個SPI設備 給spi2增加一個spidev設備,使用片選gpio3-19: 添加一個片選: 修改設備樹OK8MQ-linux-kernel/arch/arm64/boot/dts/freescale/ok8mq-evk.dts,找到節點&ecspi2,將cs-gpios = <&gpio5 13 0>,修改為cs-gpios = <&gpio5 13 0>, <&gpio3 19 0>。 添加spidev設備節點: 繼續修改剛才的節點,在節點下添加spidev節點,節點的reg值為1 測試: 使用spidev_test程序,spidev_test -D /dev/spidev1.0 測試片選0,spidev_test -D /dev/spidev1.1測試片選1,測試時是用示波器測量片選對應的GPIO,GPIO會保持一定時間的低電平,表明該片選被選通。 代碼修改前后對比: 修改前: 修改后: 我們上面只是描述了如何將已有的SPI設備驅動添加到SPI總線上的方法,并不是SPI設備自身的驅動的修改方法。 有的SPI設備功能非常簡單,只需要實現幾個操作就行,有的SPI設備功能實現非常復雜,對接了Linux的驅動接口后,需要非常多的spi操作才能實現功能。 如果是復雜的設備,驅動只能是由芯片廠商來提供了。例如mcp2518fd設備節點。 當我們在添加這個節點的時候,肯定是已經有了2518fd的驅動,添加節點只需要根據硬件原理上的連接方法,將其添加到對應的片選上,而其內的屬性在芯片提供的驅動例程上都有對應的例子,只需要添加到節點內即可。 總結: 在面對一個復雜設備時,如果你沒有驅動,首先需要做的就是找驅動、添加驅動,然后在spi總線上添加該設備,編譯鏡像調試這個設備。 對于功能簡單的spi設備,只需要些簡單的spi操作,就可以使用spidev驅動在用戶層完成操作,不需要專門的驅動。 例如一個SPI接口的ADC芯片,只需要1次SPI讀寫操作就能使ADC完成轉化并讀取轉化值的操作,用戶層打開spidev設備節點,配置完成后,讀取ADC值的時候,按照ADC的手冊,執行一次SPI傳輸操作即可。 原文鏈接:https://www.forlinx.com/article_view_697.html |