首先定義乙個struct ad7888 ;
來描述我的裝置附加資訊
先理下邏輯:
[1]module_init(spi_ad7888_init);
[2]static int __init spi_ad7888_init(void) {}(在這個函式裡應實現 初始化主裝置號及字元裝置註冊最後呼叫平台裝置註冊函式spi_register_driver(spi_ad7888_driver))
[3]關於struct spi_driver spi_ad7888_driver這個結構體,需要填寫的項有.probe .remove .driver其中.driver 又包含.name.owner 等等。其中.name這個是關鍵,平台裝置驅動程式的匹配就是根據這個name和device裡面的.name作比較,當然,這裡有點不同,spi的match會調到後面講的spi_board_info中的.modalias做比較。
[4]接著填寫probe和remove函式,我在spi_ad7888_driver結構體中,將.probe=spi_ad7888_probe。那麼spi_ad7888_probe中實現的功能有:
分配乙個struct ad7888結構體空間,這個結構體在上面定義
注:以下省略了所有的出錯處理~實際應用中不能缺少。
static int __devinit spi_ad7888_probe(struct spi_device *spi)
至此probe的函式實現完了,應該要填寫struct file_operations ad_fop這個結構體了,和所有字元裝置一樣
這裡還是那些open ,read,write,ioctl,release這幾個基本操作~接合實際硬體,對於這個spi ad 7888多通道的晶元來說,write的功能的實現還不如去實現ioctl,所以我這裡省去了write的實現。
[5]struct file_operations ad_fop=;
先看看open函式
static int ad_op(struct inode *inode,struct file *filp)
接下來要乙個乙個填寫,其他的功能函式我就省略了,只實現乙個read函式,其他依次類推,應該很容易弄出來。
[6]static int ad_rd(struct file *filp,int __user *buf,size_t count,loff_t *offset)
up(&chip->lock);
return 0;
}好了,驅動程式寫完了,編譯完成後~就能用了嗎?當然不行了~還有一件重要的事情沒做~就是spi_device是什麼時候生成的啊?
上面的函式裡面只有struct *spi_device 連 struct ad7888這個自定義的函式裡面也只有struct *spi_device 並沒有分配它的空間,那麼它在**實現?
linux的裝置管理模型是很巧妙的~
在linux-2.6.24/arch/arm/mach-s3c2440/ 的mach-smdk2440.c
有這麼一段:static struct spi_board_info spi_board_info __initdata =,};
ok再在static void __init smdk2440_machine_init(void)
好了,到這裡~如果你的核心中開啟了spi master控制器的話,編譯驅動新增到核心,就可以實現讀取spi的驅動了。。。
Qt4 4 3 在s3c2440平台的移植
首先,從 qt embedded linux opensource src 4.4.3。下面是詳細的移植步驟 1.解壓縮 tar zxf qt embedded linux opensource src 4.4.3.tar.gz cd qt embedded linux opensource src...
求教 s3c2440問題
趙老師您好,我把您的程式新增到我的程式中去了,下面是主要 1 main函式 int main void a a b rgpbdat liushui delay 20 liushui liushui 0xffe 2 pwm初始化 void pwm init void 3 定時器中斷 static vo...
s3c2440系統時鐘
1 flck hclk和pclk的關係 一般來說,mcu的主時鐘源主要是外部晶振或外部時鐘,而用的最多的是外部晶振。在正確情況下,系統內所使用的時鐘都是外部時鐘源經過一定的處理得到的。由於外部時鐘源的頻率一般不能滿足系統所需要的高頻條件,所以往往需要pll 鎖相環 進行倍頻處理。在s3c2440中,...