📄 adc8.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 + -