You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.4 KiB
66 lines
1.4 KiB
|
|
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,
|
|
};
|
|
|
|
|