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