samsung adc 通用驅動
adc是嵌入式產品常用的裝置,它的驅動並不是很難,但是如果有多個這類裝置的話,就得考慮adc中斷共享的問題了,這樣反而是驅動變得較複雜,且不易控制。在2.6.29核心後在arch/arm/plat-samsung目錄下加入了adc.c這個**,這是乙個通用adc驅動**。這個**用來初始化adc裝置並構建了乙個客戶請求列表,用來接受客戶請求轉換資料。
下面這個結構體用來描述乙個客戶:
struct s3c_adc_client ;
我們需要在我們的驅動中構建這個結構體,並且向adc通用驅動中註冊這個結構體。註冊函式為:
struct s3c_adc_client *s3c_adc_register(structplatform_device *pdev,
void (*select)(struct s3c_adc_client *client,unsignedint selected),
void (*conv)(struct s3c_adc_client *client,unsigned d0, unsigned d1,unsigned *samples_left),
unsignedintis_ts)
然後我們就可以讀取相應通道的資料了:
int s3c_adc_read(struct s3c_adc_client *client, unsigned intch);
現在我們開始寫我們的驅動:
1、 構建我們的裝置結構體
在arch/arm/mach-s3c2410/mach-smdk2410.c中新增如下內容
structplatform_device s3c_device_adc_conversion = ;
2、 註冊我們的裝置
修改arch/arm/mach-s3c2410/mach-smdk2410.c,在結構體陣列smdk2410_devices中新增我們的裝置:
staticstructplatform_device *smdk2410_devices __initdata = ;
修改後重新編譯核心
3、 構建我們的驅動
#include
#include
#include
#include
#include
#include
#include
#include
#include
module_license ("gpl");
intadc_major = 250;
intadc_minor = 0;
intnumber_of_devices = 1;
struct s3c_adc_client *client;
structcdevcdev;
dev_tdevno = 0;
staticssize_tadc_conversion_read(struct file *file, char __user *buff, size_t count, loff_t *offset)
staticintadc_conversion_open(structinode *inode, struct file *file)
staticintadc_conversion_release(structinode *inode, struct file *file)
staticstructfile_operationsadc_conversion_fops = ;
staticint __devinitadc_conversion_probe( structplatform_device *pdev )
cdev_init(&cdev, &adc_conversion_fops);
cdev.owner = this_module;
ret = cdev_add(&cdev, devno, number_of_devices);
if( ret )
client = s3c_adc_register (pdev, null, null, 0);
if(is_err( client ))
return 0;
err_s3c_adc_register:
cdev_del(&cdev );
err_cdev_add:
unregister_chrdev_region(devno, number_of_devices);
err_register_chrdev_region:
return ret;
}staticint __devexitadc_conversion_remove(structplatform_device *pdev)
staticstructplatform_driveradc_conversion_driver = ,
.probe = adc_conversion_probe,
.remove = __devexit_p(adc_conversion_remove)
};staticint __initadc_conversion_init (void)
static void __exit adc_conversion_exit (void)
module_init (adc_conversion_init);
module_exit (adc_conversion_exit);
4、 編譯驅動,並載入到核心裡,使用下面**測試,即可讀到相應通道的資料
#include
#include
#include
#include
#include
int main (void)
while(1)
close (fd);
printf ("/dev/adc closed :)\n");
return 0;
}
驅動通用Makefile分析
先看makefile 這種需要在核心的makefile中新增arch 和 cross compile ubuntu的核心原始碼樹,如果要編譯在ubuntu中安裝的模組就開啟這2個 ubuntu的核心原始碼樹,如果要編譯在ubuntu中安裝的模組就開啟這2個 kern ver 3.13.0 32 ge...
Linux GPIO驅動 GPIO通用層
如果在核心配置的時候有開啟config gpio sysfs標誌,核心就會在 sys目錄下匯出gpio的使用者空間操作介面。gpiolib sysfs init drivers gpio gpiolib.c 是gpio lib的初始化函式,該函式首先在 sys class 目錄下面建立乙個gpio的...
UC OS II下通用驅動框架的設計
1 定義介面屬性 其中屬性包括 裝置識別id 標誌 裝置型別 裝置是否可用 所有裝置假定唯一性即所有裝置都不允許在同一時刻被多個任務使用 下乙個裝置控制塊指標 利用該指標每建立乙個裝置的時候將建立的裝置放入裝置管理佇列中 this指標 裝置操作控制代碼 2 操作裝置的方法包括 a 裝置控制塊空閒列表...