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

📄 netdaqdev.c

📁 at91rm9200双端口RAM驱动及测试程序
💻 C
字号:
#ifndef __KERNEL__#  define	__KERNEL__#endif#ifndef MODULE#  define	  MODULE#endif#include <linux/module.h>#include <linux/kernel.h>#include <linux/version.h>#include <linux/init.h>#include <linux/fs.h>#include <asm/uaccess.h>#include <linux/sched.h>#include <linux/types.h>#include <linux/fcntl.h>#include <linux/interrupt.h>#include <linux/ioport.h>#include <linux/slab.h>#include <linux/vmalloc.h>#include <linux/mm.h>#include <linux/string.h>#include <asm/io.h>#include <linux/errno.h>#include <linux/tqueue.h>#include <linux/wait.h>#include <asm/irq.h>#include <asm/delay.h>#include <asm/arch/hardware.h>#include <asm/fiq.h>#include <asm/arch/AT91RM9200_SYS.h>//#include <linux/slab.h>#include "NetDaqDev.h"//void high_pb27()//{//	sys->PIOB_SODR = PB27;//}////void low_pb27()//{//	sys->PIOB_CODR = PB27;//}static loff_t SemDev_llseek(struct file *filp,loff_t offset,int orig){	cur_pos = base_map + offset;	return 0;}static ssize_t SemDev_read(struct file *filp, char *buf, size_t count, loff_t *f_pos){//	int i;		int cont = 0;	//	u16 * data_buf;//	//	data_buf = (u16 *)kmalloc(1000,GFP_KERNEL);//	for(i=0;i<count/2;i++){//		*(data_buf + i) = readw(cur_pos + i);//		cont += 2;//	}		u16 data_buf;		data_buf = readw(cur_pos);		copy_to_user(buf,&data_buf,count);		//kfree(data_buf);		return cont;}static ssize_t SemDev_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos){		//	int i;		int cont = 0;	//	u16 * data_buf;//	//	data_buf = (u16 *)kmalloc(1000,GFP_KERNEL);//	//	copy_from_user(data_buf,buf,count);//	//	for(i=0;i<count/2;i++){//		writew(*(data_buf + i),cur_pos + i);//		cont += 2;//	}	u16 data_buf[2];		copy_from_user(data_buf,buf,2);		writel(*((u32 *)data_buf),cur_pos);		//kfree(data_buf);		return cont;}static int SemDev_ioctl(struct inode *inode, struct file *filp, unsigned int ioctl_num, unsigned long ioctl_param){		return 0;}static int SemDev_open(struct inode *inode, struct file *filp){	MOD_INC_USE_COUNT;	printk("Daq device opened.\n");	return 0;}static int SemDev_release(struct inode *inode, struct file *filp){	MOD_DEC_USE_COUNT;	printk("Daq device closed.\n");	return 0;}static int __init SemDev_init(void){	int ret;		sys->EBI_SMC2_CSR[3] = (AT91C_SMC2_TDF & 0x000) | AT91C_SMC2_BAT | AT91C_SMC2_DBW_16 | AT91C_SMC2_WSEN | 1;//(AT91C_SMC2_NWS & 0xff);	base_map = (u16 *)ioremap(NCS3, 0x1000*2);		ret = register_chrdev(MAJOR_NUM, DEV_NAME, &SemDev_fops);	if (ret < 0)	{		printk("Error in register_chrdev with: %d!\n", ret);		return ret;	}	//	sys->PIOB_PER 	|= PB27;//	sys->PIOB_OER 	|= PB27;//	sys->PIOB_PPUER |= PB27;//	sys->PIOB_MDER 	|= PB27;	//	high_pb27();	printk("Registered the daq device succeed with major number: %d!\n", MAJOR_NUM);	return 0;}static void __exit SemDev_cleanup(void){	int ret;	iounmap((u16 *)base_map);	ret = unregister_chrdev(MAJOR_NUM, DEV_NAME);	if (ret < 0) 		printk("Error in unregister_chrdev: %d!\n", ret);	else 		printk("Leave daq device!\n");}module_init(SemDev_init);module_exit(SemDev_cleanup);

⌨️ 快捷键说明

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