全志 ADC驅動

2022-06-27 15:36:14 字數 4208 閱讀 8002

adc_驅動

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include string.h>

15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 #include 23 #include 24 #include 25 #include 26 #include 27 #include 28 #include 29 #include 30

3132

#define ir_gpio gpioh(10) //

外部中斷引腳

3334

35//

定義個資料報

36struct

fsp_event;

4041

42//

物件導向-裝置的型別

43struct

fsp;

53struct fsp *fsp_dev;

5455

56//

void __iomem *adc_base;

//必須是void __iomem型別因為偏移位址不一樣

5758

59volatile unsigned long * adc_ctrl; //

adc控制暫存器

60volatile unsigned long * adc_intc; //

adc中斷控制暫存器

61volatile unsigned long * adc_ints; //

adc中斷狀態暫存器

62volatile unsigned long * adc_dat0; //

adc資料1暫存器

63volatile unsigned long * adc_dat1; //

adc資料2暫存器

6465

66 wait_queue_head_t adcq; //

等待佇列頭

67int flag = 0;68

6970

//中斷服務函式

71 irqreturn_t fsp_irq_svc(int irqno,void *id)

7285

8687

8889

//open介面 adc0

90int fsp_adc_open(struct inode *inode,struct file *filp)

91119

120121

//read介面

122 ssize_t fsp_adc_read(struct file *filp,char __user *ubuf,size_t size,loff_t *off)

123147

148149

150//

close介面

151int fsp_adc_close(struct inode *inode, struct file *filp)

152156

157158

159160

//實現fops

161struct file_operations fops =;

167168

169170

//初始化函式

171static

int __init fsp_init(void

)

172183

184185

//動態申請裝置號

186 ret = alloc_chrdev_region(&fsp_dev->devno,0,1,"

button_drv");

187if(ret < 0

)192

193194

//申請cdev的空間

195 fsp_dev->cdev =cdev_alloc();

196if(is_err(fsp_dev->cdev))

201202

//初始化cdev的成員

203 cdev_init(fsp_dev->cdev,&fops);

204205

//將cdev加入到核心中----鍊錶

206 ret = cdev_add(fsp_dev->cdev,fsp_dev->devno,1

);207

208//

建立裝置檔案

209 fsp_dev->cls = class_create(this_module,"

fsp_dev");

210if(is_err(fsp_dev->cls))

215216 fsp_dev->dev = device_create(fsp_dev->cls,null,fsp_dev->devno,null,"

fsp_eint");

217if(is_err(fsp_dev->dev))

222223

224225

//1.中斷申請

226 fsp_dev->irqno = gpio_to_irq(ir_gpio); //

中斷號227 ret = request_irq(fsp_dev->irqno,fsp_irq_svc,irqf_trigger_falling|irqf_trigger_rising,"

eint-keydown

",null);

228if(ret != 0

)233

234235

//2.位址對映

236 adc_ctrl = ioremap(0x01c24400,8);//

將物理位址對映成虛擬位址

237 adc_intc = adc_ctrl + 1

;238 adc_ints = adc_ctrl + 2

;239 adc_intc = adc_dat0 + 3

;240 adc_intc = adc_dat1 + 4

;241

242243

//writel(255 << 6 | 1 << 14 | 1 << 16,adc_base);

244//

writel(3,adc_base + 0x1c);

245246

247248 init_waitqueue_head(&adcq); //

初始化等待對列頭

249250

return0;

251252

err_device:

253 device_destroy(fsp_dev->cls,fsp_dev->devno);

254err_class:

255 class_destroy(fsp_dev->cls);

256257

err_cdev_del:

258 cdev_del(fsp_dev->cdev);

259260

err_unregister:

261 unregister_chrdev_region(fsp_dev->devno,1

);262

263err_kfree:

264kfree(fsp_dev);

265return

ret;

266267

}268

269270

271static

void __exit fsp_exit(void

)

272282

283284

285module_init(fsp_init);

286module_exit(fsp_exit);

287 module_license("

gpl");

測試:

1 #include 2 #include 3 #include 4 #include 5 #include 678

int main(void)9

21close(fd);

22return0;

23 }

部落格:

全志axp驅動功能分析 除錯說明

全志 技術社群 1.axp晶元功能說明 2.驅動原始碼說明 1 drivers power axp power axp22 board.c a.讀取sys config.fex,初始化一些引數 包括 axp221裝置位址 axp221是通過i2c連線到soc上的 電池容量 電池充電電流 電池充電電壓...

ADC驅動例項(簡單)

adc驅動 僅一路輸入 s3c2410 adc.h ifndef s3c2410 adc h define s3c2410 adc h define adc write ch,prescale ch 16 prescale 將頻道和預分頻合併為乙個資料,這樣可以作為乙個引數傳入 define adc...

Linux驅動修煉之道 ADC驅動

對於s3c2440 來說,實現a d 轉換比較簡單,主要應用的是adc 控制暫存器adccon 和adc 轉換資料暫存器adcdat0 暫存器adcdat0 的低10 位用於儲存a d 轉換後的資料。暫存器adccon 的第15 位用於標識a d 轉換是否結束。第14 位用於使能是否進行預分頻,而第...