使用者空間的spi驅動

2021-08-25 19:07:23 字數 1672 閱讀 4267

如果想要在使用者空間編寫spi驅動,這就要在核心的arch/.../mach-*/board-*.c 中宣告乙個spi_board_info,

它的名字一定要是「spidev」,比如:

struct spi_board_info info =

;return spi_register_board_info(&info, 1);

這樣只要控制器驅動載入了,spidev模組就會和這個裝置繫結,並為裝置申請乙個裝置號,主裝置號為153,次裝置號和裝置載入的次序有關。

目前spidev支援最多32個裝置。裝置的名字是spidevx.d,其中x是匯流排編號,d是裝置的片選號。如果正確安裝並配置了udev,/dev目錄下便會生成spidevx.d

裝置節點。直接對這些裝置節點操作就行了。

spidev的裝置節點的介面包括open/close/read/write/ioctl。

~~~~~~~~~~~~~~~~~~~~~~~~~

其中open/close沒有什麼特別之處。

read/write的話有大小的限制,讀寫的大小預設不能超過4096位元組。這個大小是乙個模組載入引數,可以修改。

允許多個使用者同時開啟裝置節點,spidev使用mutext進行互斥,多個使用者同時讀寫時只有乙個活動的使用者,其他使用者睡眠。

spidev的ioctl命令。

~~~~~~~~

spi_ioc_rd_mode:讀取spi_device的mode。

spi_ioc_rd_lsb_first:如果是spi_lsb_first的方式則返回1。

spi_ioc_rd_bits_per_word:讀取spi_device的bits_per_word.

spi_ioc_rd_max_speed_hz:讀取spi_device的max_speed_hz.

spi_ioc_wr_mode:設定spi_device的mode,並呼叫spi_setup立即使設定生效。

spi_ioc_wr_lsb_first:設定spi使用spi_lsb_first的傳輸模式。立即生效。

spi_ioc_wr_bits_per_word:讀取字長。

spi_ioc_wr_max_speed_hz:設定時鐘速率。

無論讀取,使用者傳輸的第三個引數都被當作緩衝位址指標。讀取時存放結果,寫入時存放要寫的內容。

spi_ioc_message:這個命令用來進行複雜的通訊。引數涉及到乙個結構體。各個成員的意義與spi_transfer一致。

struct spi_ioc_transfer ;

核心文件中乙個例子:

static void do_msg(int fd, int len) printf("response(%2d, %2d): ", len, status); for (bp = buf; len; len--) printf(" %02x", *bp++); printf("\n"); }

核心在documentation/spi目錄下有spidev的例子。

注意雖然多個使用者不能同一時刻對spi進行設定或讀寫,但是同一使用者卻無法組織其他使用者修改同一裝置的設定。

舉例來說,usr1開啟裝置節點,然後使用ioctl設定了時鐘速率,此時usr1執行緒被排程出去,然後usr2操作同乙個裝置,將它的時鐘設為另乙個值。

此時usr1重新排程去使用read函式,則達不到預期的效果。

建議不要有兩個程式操作spidevx.d裝置節點。

使用者空間的spi驅動

如果想要在使用者空間編寫spi驅動,這就要在核心的arch mach board c 中宣告乙個spi board info,它的名字一定要是 spidev 比如 struct spi board info info return spi register board info info,1 這樣只...

使用者空間 spi

1 spi device 雖然使用者空間不需要直接用到spi device結構體,但是這個結構體和使用者空間的程式有密切的關係,理解它的成員有助於理解spi裝置節點的ioctl命令,所以首先來介紹它。在核心中,每個spi device代表乙個物理的spi裝置。它的成員如程式清單 1.1所示。程式清單...

Linux裝置驅動 SPI驅動

spi驅動匯流排架構 spi核心層 x spi控制器驅動層 x spi裝置驅動層 spi函式介面 api 簡單介紹spi協議,硬體原理 4412datasheet sdi 資料輸入buf i2c scl6 sdo 資料輸出buf i2c sda6 sclk 時鐘buf gpc1 1 cs 片選bk ...