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

📄 aaa.c

📁 Linux可供用户空间和内核空间相互访问的字符设备驱动程序代码。
💻 C
字号:
//#define MODULE#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <asm/uaccess.h>#include <linux/wait.h>#include <asm/semaphore.h>#include <linux/poll.h>#define MAJOR_NUM 254MODULE_LICENSE("GPL");static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*);static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*);static unsigned int globalvar_poll(struct file *, poll_table *);static loff_t globalvar_llseek(struct file *filp, loff_t fake1, int fake2);//added by madongchao 20071118 for switch chipextern void bm8024_interruptTest(void);//added endstruct file_operations globalvar_fops ={  read: globalvar_read,   write: globalvar_write,  poll: globalvar_poll,  //added by madongchao 20071118 for switch chip  llseek: globalvar_llseek,  //added end};//static int global_var = 0;static struct semaphore sem;static wait_queue_head_t outq;static int flag = 0;static int __init globalvar_init(void){  int ret;  //added by madongchao for test 20071117  printk("globalvar_init : get in!\n");  //added end  ret = register_chrdev(MAJOR_NUM, "globalvar", &globalvar_fops);  if (ret)  {    printk("globalvar register failure");   }  else  {    printk("globalvar register success");    init_MUTEX(&sem);    init_waitqueue_head(&outq);  }  return ret;}static void __exit globalvar_exit(void){  int ret;  ret = unregister_chrdev(MAJOR_NUM, "globalvar");  if (ret)  {   printk("globalvar unregister failure");  }  else  {   printk("globalvar unregister success");   }}//changed by madongchao 20071027 for 软件平台的消息触发机制static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off){	if (down_interruptible(&sem))	{ 		return - ERESTARTSYS;	}   	flag = 0;	up(&sem);   	return sizeof(int);}static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len,loff_t *off){   	printk("in globalvar_write\n");		if (down_interruptible(&sem))	{ 		return - ERESTARTSYS;	}	   	flag = 1;	wake_up_interruptible(&outq);	up(&sem);   	return sizeof(int);}#if 0static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off){  /*if (wait_event_interruptible(outq, flag != 0))  {    return - ERESTARTSYS;  }*/  if (down_interruptible(&sem))  {     return - ERESTARTSYS;   }   flag = 0;  if (__copy_to_user(buf, &global_var, sizeof(int)))   {    up(&sem);     return - EFAULT;    }   up(&sem);   return sizeof(int);}static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len,loff_t *off){      printk("hhh\n");   if (down_interruptible(&sem))   {    return - ERESTARTSYS;    }   if (__copy_from_user(&global_var, buf, sizeof(int)))   {    up(&sem);    return - EFAULT;    }          wake_up_interruptible(&outq);    up(&sem);    flag = 1;   return sizeof(int);}#endif//changed endstatic unsigned int globalvar_poll(struct file *filp, poll_table *wait){  unsigned int mask = 0;  poll_wait(filp, &outq, wait);  if (flag != 0)  {    mask|=POLLIN | POLLRDNORM;   }  return mask;}//added by madongchao 20071118 for switch chiploff_t globalvar_llseek(struct file *filp, loff_t fake1, int fake2){		bm8024_interruptTest();	return 15;}//added endmodule_init(globalvar_init);module_exit(globalvar_exit); 

⌨️ 快捷键说明

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