static uint8_t readBuffer(void){ uint8_t ret; if(buff_empty){ return 0; } ret=buffer[buff_end]; buff_end++; if(buff_end==BUFFER_SIZE){ buff_end=0; } if(buff_end==buff_start){ buff_empty=1; } return ret; } static uint8_t writeToBuffer(uint8_t data){ if(buff_start==buff_end && !buff_empty){ /*overrun*/ printk("<1>%s: Buffer overrun!\n",MOD_NAME); return 1; } buffer[buff_start]=data; buff_start++; if(buff_start==BUFFER_SIZE){ buff_start=0; } buff_empty=0; return 0; } static ssize_t device_read(struct file *filp, char __user *buffer, size_t length, loff_t *offset){ uint8_t val; if(!buff_empty){ val = readBuffer(); DEBUG_OUT("<1>%s: device_read invoked writing: mem[%x]=%02x\n",MOD_NAME,buffer,val); if( copy_to_user(buffer,&val,1)<0 ){ printk("<1>%s: Device read error!\n",MOD_NAME); return 0; } return 1; } return 0; } static ssize_t device_write(struct file *filp, const char __user *buff, size_t len, loff_t *off){ int ret; DEBUG_OUT("<1>%s: device_write invoked\n",MOD_NAME); if(len!=1){ return -EINVAL; } ret = copy_from_user(pin_status, buff, len); if( ret<0 ){ printk("<1>%s: Device write error!\n",MOD_NAME); return 0; } up(&read_sema); return len; } struct file_operations fops = { read: device_read, write: device_write, };