在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            博客專欄

            EEPW首頁 > 博客 > 嵌入式linux之iMX6ULL驅(qū)動開發(fā) | 通用spi驅(qū)動之spidev使用總結(jié)

            嵌入式linux之iMX6ULL驅(qū)動開發(fā) | 通用spi驅(qū)動之spidev使用總結(jié)

            發(fā)布人:電子禪石 時間:2024-02-03 來源:工程師 發(fā)布文章

            因為興趣,業(yè)余時間把玩下手邊的imax6ul開發(fā)板。Linux內(nèi)核集成了spidev驅(qū)動,

            提供了SPI設(shè)備的用戶空間API。支持用于半雙工通信的read和write訪問接口以及用于

            全雙工通信和I/O配置的ioctl接口。使用時,只需將SPI從設(shè)備的compatible屬性值添加

            到spidev區(qū)動的spidev dt ids[]數(shù)組中,即可將該SPI從設(shè)備創(chuàng)建為spidev設(shè)備。

            如果不想編寫單獨的spi設(shè)備驅(qū)動,那么使用linux內(nèi)核提供的通用spidev設(shè)備驅(qū)動就夠了,

            它提供統(tǒng)一的字符設(shè)備操作,那么只需要在應(yīng)用層讀寫和控制即可。

            spidev驅(qū)動

            spidev是一個Linux內(nèi)核驅(qū)動,用于與SPI(串行外設(shè)接口)設(shè)備進行通信。SPI是一種全雙工、

            同步的串行通信協(xié)議,常用于連接微控制器和外部設(shè)備。spidev驅(qū)動允許用戶空間程序通過

            Linux的設(shè)備文件接口與SPI設(shè)備進行通信。用戶可以通過打開和讀寫設(shè)備文件來發(fā)送和

            接收SPI數(shù)據(jù)。spidev驅(qū)動提供了一組控制IO口和SPI參數(shù)的ioctl命令。


            同時Linux內(nèi)核也集成了SPI測試工具spidev test,用于在用戶態(tài)對spidev動功能進行測試

            和驗證。


            spidev設(shè)備驅(qū)動源碼位置在:linux-imx-4.1.15driversspispidev.c

            驅(qū)動框架框圖:

            1706957541784792.png

               

            除了使用spidev驅(qū)動外,當然也可以自己編寫SPI驅(qū)動。


            使用現(xiàn)有的spidev驅(qū)動可以簡化開發(fā)過程,因為它提供了一組用戶空間接口,

            可以直接在應(yīng)用程序中使用標準的文件操作函數(shù)(如open、read、write和ioctl)

            來操作SPI設(shè)備。這種方式適用于大多數(shù)應(yīng)用場景,特別是對于簡單的SPI設(shè)備操作,

            可以快速實現(xiàn)功能。


            如果使用自己編寫的SPI驅(qū)動也可以,也不算麻煩,需要在內(nèi)核中實現(xiàn)SPI子系統(tǒng),

            包括SPI控制器驅(qū)動和SPI設(shè)備驅(qū)動,最后根據(jù)需要實現(xiàn)個如字符型設(shè)備驅(qū)動操作接口,

            供上層應(yīng)用使用即可。

            應(yīng)用層使用步驟

            用戶應(yīng)用層使用spidev驅(qū)動的步驟如下:


            1. 打開SPI設(shè)備文件:用戶可以通過打開/dev/spidevX.Y文件來訪問SPI設(shè)備,

            其中X是SPI控制器的編號,Y是SPI設(shè)備的編號。


            2. 配置SPI參數(shù):用戶可以使用ioctl命令SPI_IOC_WR_MODE、

            SPI_IOC_WR_BITS_PER_WORD和SPI_IOC_WR_MAX_SPEED_HZ來設(shè)置SPI模式

            、數(shù)據(jù)位數(shù)和時鐘速度等參數(shù)。


            3. 發(fā)送和接收數(shù)據(jù):用戶可以使用read和write系統(tǒng)調(diào)用來發(fā)送和接收SPI數(shù)據(jù)。

            寫入的數(shù)據(jù)將被傳輸?shù)絊PI設(shè)備,而從設(shè)備讀取的數(shù)據(jù)將被存儲在用戶提供的緩沖區(qū)中。


            4. 關(guān)閉SPI設(shè)備文件:當不再需要與SPI設(shè)備通信時,用戶應(yīng)該關(guān)閉SPI設(shè)備文件。


            總結(jié)起來,spidev驅(qū)動提供了一種簡單而靈活的方式來與SPI設(shè)備進行通信,

            使得用戶可以輕松地在Linux系統(tǒng)上開發(fā)和控制SPI設(shè)備。

            內(nèi)核配置

            使能spidev用戶態(tài)驅(qū)動

            1706957938689736.png在生成的config文件中可以看到以下配置生效了。我的是在imx6ul開發(fā)板的imx_v7_defconfig的linux內(nèi)核配置文件中。

            CONFIG_SPI=y
            CONFIG_SPI_GPIO=y
            CONFIG_SPI_IMX=y
            CONFIG_SPI_SPIDEV=y
            編寫設(shè)備樹

            &ecspi3 {
                    fsl,spi-num-chipselects = <2>;/*cs管腳數(shù)配置*/
                    cs-gpios = <0>,<&gpio1 20 GPIO_ACTIVE_LOW>;/*cs管腳配置*/
                    pinctrl-names = "default";
                    pinctrl-0 = <&pinctrl_ecspi3>;
                    status = "okay";/* status屬性值為"okay" 表示該節(jié)點使能*/
             
            	spidev: icm20608@0 {
            	compatible = "alientek,icm20608";
                    spi-max-frequency = <8000000>;
                    reg = <0>;/*spi設(shè)備是沒有設(shè)備地址的, 這里是指使用spi控制器的cs-gpios里的第幾個片選io */
                };
             
            	oled: oledsh1106@1 {
            	compatible = "yang,oledsh1106";/*重要,會匹配spidev.c中指定的compatible*/
            	spi-cpol;/*配置spi信號模式*/
            	spi-cpha;
            	spi-max-frequency = < 8000000 >;/* 指定spi設(shè)備的最大工作時鐘 */
                reg = <1>;
                };
            };

            以上需要注意的是:如果該spi接口下掛載有多個從設(shè)備,

            需要設(shè)置fsl,spi-num-chipselects = <2>;默認該值為1。還有需要注意的地方是,

            cs-gpios 片選信號需要配置對應(yīng)的個數(shù)。以上的為配置了兩路片選GPIO管腳,

            第一個默認的,第二個是指定的。如果僅有一個從設(shè)備,可以配置cs-gpio就行了。

            注意cs-gpio和cs-gpios的區(qū)別,帶s的標識可以有多個。

            如果忽略cs管腳數(shù)配置,則會出現(xiàn)以下錯誤:

            需要設(shè)置fsl,spi-num-chipselects = <2>; 


            注意上面的compatible 屬性,在新版linux內(nèi)核,可以寫任意的字符串,

            最好不再寫”spidev”,老版的是要寫成”spidev”。

            給出的理由是: spidev should never be referenced in DT without a specific

             compatible string, it is a Linux implementation thing rather than a description 

            of the hardware。


            此外還有一些額外配置,以下為自定義屬性,用于指定工作時序方式及其它功能設(shè)置等。

            如CPOL需要設(shè)1, 則只需在spi設(shè)備節(jié)點里加上"spi-cpol"屬性即可; CPOL設(shè)0,

            則不寫"spi-cpol"屬性即可 。

            • buswidth = <8>; /* 傳輸以8位為單位 */
              mode = <0>; /* 使用第幾種工作時序(CPOL, CPHA) */
              /*但在現(xiàn)用的內(nèi)核源碼里發(fā)現(xiàn), spi設(shè)備的工作時序并不是用mode屬性值來指定的*/
              /* 如CPOL需要設(shè)1, 則只需在spi設(shè)備節(jié)點里加上"spi-cpol"屬性即可;
            • CPOL設(shè)0,則不寫"spi-cpol"屬性即可 */
              /* CPHA設(shè)1時,則在設(shè)備節(jié)點里加上"spi-cpha"屬性即可 */

            pinctrl的配置

            pinctrl_ecspi3: ecspi3grp {
                            fsl,pins = <
                                    MX6UL_PAD_UART2_RTS_B__ECSPI3_MISO        0x100b1  /* MISO*/
                                    MX6UL_PAD_UART2_CTS_B__ECSPI3_MOSI        0x100b1  /* MOSI*/
                                    MX6UL_PAD_UART2_RX_DATA__ECSPI3_SCLK      0x100b1  /* CLK*/
                                    MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20       0x100b0  /* CS*/
                                >;
                        };
            編譯內(nèi)核和設(shè)備樹
            #加載環(huán)境
            source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
            #編譯內(nèi)核
            make zImage -j16
            #編譯指定的設(shè)備樹
            make imx6ull-14x14-nand-4.3-480x272-c.dtb
            修改spidev驅(qū)動

            默認的spidev.c中,是沒有匹配你添加的設(shè)備的,因此需要修改spidev.c代碼,增加compatible匹配。

            /* The main reason to have this class is to make mdev/udev create the
             * /dev/spidevB.C character device nodes exposing our userspace API.
             * It also simplifies memory management.
             */
             
            static struct class *spidev_class;
             
            //#ifdef CONFIG_OF
            static const struct of_device_id spidev_dt_ids[] = {
            	{ .compatible = "rohm,dh2228fv" },
              { .compatible = "yang,oledsh1106" },
            	{},
            };
            MODULE_DEVICE_TABLE(of, spidev_dt_ids);
            //#endif

            內(nèi)核編譯成功后,更新內(nèi)核和設(shè)備樹文件。啟動設(shè)備后,在/sys/class/spidev下可以確認spidev枚舉出了多少個spi設(shè)備。


            設(shè)備樹查看

            查看設(shè)備樹是否有新添加的節(jié)點:


            更新設(shè)備樹到板子上后查看下是否有生成spi設(shè)備節(jié)點:

                                    


            開源測試工具

            spidev驅(qū)動有現(xiàn)成的測試工具。其中一個常用的測試工具是spi_test,

            它是spidev驅(qū)動自帶的測試工具,可以用于測試和調(diào)試SPI設(shè)備。

            spi_test可以通過命令行參數(shù)設(shè)置SPI設(shè)備的各種參數(shù),如設(shè)備文件、

            傳輸速率、字節(jié)順序等。使用spi_test可以發(fā)送和接收SPI數(shù)據(jù),

            以驗證spidev驅(qū)動的功能和性能。


            在源碼linux-imx-4.1.15-2.1.0-v2.7\Documentation\spi路徑下,

            有兩個測試工具的源碼文件,spidev_fdx.c和spidev_test.c文件。

            可以直接交叉編譯為可執(zhí)行文件使用。

            這些工具都基于spidev通用設(shè)備驅(qū)動以及對應(yīng)的ioctl命令實現(xiàn),

            可以方便的用來對spi的通用型驅(qū)動來進行測試。


            編譯方法

            #加載環(huán)境
            source /opt/fsl-imx-x11/4.1.15-2.1.0/
            environment-setup-cortexa7hf-neon-poky-linux-gnueabi
            #編譯
            $(CC) spidev_fdx.c -o spidev_fdx
            $(CC) spidev_test.c -o spidev_test
            回環(huán)測試

            首先,將spi接口的MISO和MOSI接口短接。

            其次,編譯測試代碼:

            Documentation/spi/spidev_test.c


            如,在/dev/spidev2.0上發(fā)送"string_to_send"字符串,顯示發(fā)送和接收的數(shù)據(jù):

             ./spidev_test -D /dev/spidev2.0 -v -p string_to_send

            如果要發(fā)送32位/16位的數(shù)據(jù),則需要先生成二進制文件,如生成32字節(jié)的隨機數(shù)據(jù):

            dd if=/dev/urandom of=test_data bs=16 count=2

            用hexdump來查看這個二進制文件:

            hexdump -v test_data -C


            00000000 74 6a 59 3e 1e 81 73 fb 5a 3f 94 c7 d8 20 ca e9 |tjY>..s.Z?... ..|


            00000010 24 2e a5 68 75 ab f7 12 af e6 c1 3d e2 d8 9a ba |$..hu......=....|


            00000020


            發(fā)送:

            ./spidev_test -D /dev/spidev2.0 -b 32 -v -i test_data————————————————

            最后,輸出結(jié)果與輸入相同即為正確。

             

            結(jié)語

            在這樣一個速食的時代,堅持做自己,慢下來,潛心琢磨,心懷敬畏,領(lǐng)悟知識,

            才能向下扎到根,向上捅破天,背著世界往前行!

            原文鏈接:https://blog.csdn.net/yyz_1987/article/details/131918983

                                    



                                    



                     

                                

                                    


            *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



            關(guān)鍵詞: spi

            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉