⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc8.c

📁 为优龙公司的2410开发板写的一个的AD采样驱动程序
💻 C
字号:
/**************************************************************	adc8.c	linux driver example  	author: 	date:   ***************************************************************/#ifndef __KERNEL__#  define __KERNEL__#endif#ifndef MODULE#  define MODULE#endif#include<linux/iobuf.h>#include<linux/major.h>#include<asm/uaccess.h>#include<asm/hardware.h>#include<asm/arch/cpu_s3c2410.h>#include<asm/io.h>#include<linux/vmalloc.h>#include <linux/config.h>#include <linux/module.h>#include <linux/devfs_fs_kernel.h>#include <linux/init.h>#include <linux/kernel.h>   /* printk() */#include <linux/slab.h>   /* kmalloc() */#include <linux/fs.h>       /* everything... */#include <linux/errno.h>    /* error codes */#include <linux/types.h>    /* size_t */#include <linux/proc_fs.h>#include <linux/fcntl.h>    /* O_ACCMODE */#include <linux/poll.h>    /* COPY_TO_USER */#include <asm/system.h>     /* cli(), *_flags */#define DRIVER_AUTHOR "shuyan ma <shuyan.ma@gmail.com>"#define DRIVER_DESC   "A sample driver for adc8"#define DEVICE_NAME		"adc8"#define adc8_MAJOR  223#define adc8_MINOR  0static int MAX_BUF_LEN=1024;static unsigned char drv_buf[2];typedef union {	unsigned int inv;	struct {		unsigned char xmsb;		 unsigned char xlsb;	}ch;}xunion;xunion readbuf; /*************************************************************************************/static ssize_t  adc8_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){        if(count > MAX_BUF_LEN) count=MAX_BUF_LEN;	ADCCON|=0x01;		//start ADC	while(ADCCON & 0x1);       //check if Enable_start is low	while(!(ADCCON & 0x8000)); //check if EC(End of Conversion) flag is high        readbuf.inv=(int)ADCDAT0 & 0x3ff;        drv_buf[0]=readbuf.ch.xlsb;        drv_buf[1]=readbuf.ch.xmsb;        copy_to_user(buffer,drv_buf,count);        printk("user read %x from adc8 driver\n",readbuf.inv);        return count;}/*************************************************************************************/static int adc8_ioctl(struct inode *inode, struct file *file,                  unsigned int cmd, unsigned long arg){	static unsigned int preScaler;	static int preCh=-1;	printk("adc8 ioctl runing\n");	switch(cmd){		case 0:			preScaler=HZ/4/arg-1;			printk("setup ADC_Freqency is: %d\n",preScaler);			//preScaler=PCLK/arg-1;			break;		case 1:			printk("select ADC channel\n");			if(preCh!=arg)			{				ADCCON=(1<<14)|(preScaler<<6)|(arg<<3);				preCh=arg;			}			break;		default:			printk("error cmd number\n");break;	}	return 0;}/*************************************************************************************/static int adc8_open(struct inode *inode, struct file *file){	MOD_INC_USE_COUNT;	printk("adc8 device open sucess!\n");	return 0;}/*************************************************************************************/static int  adc8_release(struct inode *inode, struct file *filp){	MOD_DEC_USE_COUNT;	printk("adc8 device release\n");	return 0;}/*************************************************************************************/static struct file_operations adc8_fops = {	owner:	THIS_MODULE,	read:	adc8_read,	ioctl:	adc8_ioctl,	open:	adc8_open,	release:	adc8_release,};/*************************************************************************************/static int __init adc8_init(void){	int  result;    	SET_MODULE_OWNER(&adc8_fops);    	result = register_chrdev(adc8_MAJOR, "adc8", &adc8_fops);	if(result)	{		printk("fail to register adc8\n");		return -1;	}	printk(DEVICE_NAME " initialized\n");	return 0;}/*************************************************************************************/static void __exit  adc8_exit(void){	unregister_chrdev(adc8_MAJOR, "adc8");	printk(DEVICE_NAME " unloaded\n");}/*************************************************************************************/module_init(adc8_init);module_exit(adc8_exit);/* * Get rid of taint message by declaring code as GPL. */MODULE_LICENSE("GPL");                                                                                /* * Or with defines, like this: */MODULE_AUTHOR(DRIVER_AUTHOR);   /* Who wrote this module? */MODULE_DESCRIPTION(DRIVER_DESC);        /* What does this module do */                                                                                /* *  This module uses /dev/testdevice.  The MODULE_SUPPORTED_DEVICE macro might *  be used in the future to help automatic configuration of modules, but is *  currently unused other than for documentation purposes. */MODULE_SUPPORTED_DEVICE("adc8");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -