linux下的SPI模組驅動使用

2021-08-08 20:06:20 字數 1510 閱讀 5144

由於linux的驅動都有很好的框架性,但是對剛開始學習的人來說,在不太懂框架的基礎之下學習是很麻煩的事,網上很多都把這個框架給完整性分析了一下,但是具體怎麼要能用,也沒有怎麼說,這裡我總結一下。

1、驅動分為平台驅動、控制器驅動、裝置驅動、裝置。

2、拿到乙個開發板後,燒上系統,那我們基本上就有了平台驅動、控制器驅動。裝置驅動基本都有的,官方實現了乙個裝置驅動,檔案是spidev.c,它是乙個裝置驅動,它會在開機之後自動註冊乙個主裝置號為153的字元裝置。

3、當註冊了spi裝置到系統中時,會根據名字進行匹配,如果名字是spidev則會呼叫 spidev.c中的probe函式,隨後會在/dev/device/下面生成如spidevx.x的裝置檔案,通過該裝置檔案即可操作spi裝置。

4、如何註冊spi裝置到系統。在kernel/arch/arm/mach-***x,***是板子晶元型號,我用的事 mach-smdk6410.c。在裡面找到spi_board_info結構體位置,例如:

static struct spi_board_info __initdata forlinx6410_mc251x_info  = ,

};本結構體就是spi的板級資訊,會在後面被spi_register_board_info()呼叫,隨後在系統中註冊這個裝置。

我們需要做的是新增我們自己的資訊

static struct spi_board_info __initdata forlinx6410_mc251x_info  = , ,

};其中的static struct s3c64xx_spi_csinfo s3c64xx_spi0_csinfo = ;

猜想:

寫乙個模組,收到填寫該結構體,然後呼叫spi_register_board_info()來註冊。我沒有試過,應該是可以的。

5、使用的時候在使用者應用空間中就使用open開啟裝置檔案即可使用。

需要在封裝一次。由於spidev.c僅提供資料接收與傳送,但是對於具體的spi怎麼發的好像沒有做。

因此我們具體的收發函式應該在此分裝為如下

int fd;

fd=open(device, o_rdwr);

讀函式輸入:fd檔案描述符,addr讀的位址,read_data讀出來資料存放的位址

輸出:成功操作的位元組數,這個沒有做好,需要改

unsigned char read_reg(int fd,unsigned char addr,unsigned char *read_data)

寫函式unsigned char write_reg(int fd,unsigned char addr,unsigned data) ;

buff[0]=addr<<1;

buff[0]=buff[0]&0x7f;

buff[1]=data;

ret=write(fd,&buff,sizeof(buff));

return ret; }

然後其他具體操作看我們的實際需要了,以上兩個就可以正確讀寫了,你可以先用讀函式讀取裝置各個暫存器的預設值,來觀察讀取是否正確。

linux下spi驅動分析

核心版本 linux 2.6.29 主要的幾個結構platform device platform driver s3c24xx spi spi master spi bitbang spi device spi driver spidev data s3c spi info第一步 註冊platfo...

Linux下SPI驅動分析 2

接上乙個繼續看spi.c。名詞解釋of openfirmware 呼叫層次spi match device of driver match device of match device of match node 用於驅動程式檢查platform device是否在其支援列表裡 80static i...

Linux下SPI驅動簡解

基礎知識 第一點 硬體四線 第二點 重要結構體和函式 struct spi device struct spi message struct spi transfer int spi async struct spi device spi,struct spi message message sta...