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.
 
 
 
FTDI_kernel_space_gpio_driver/char_dev.c

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;
}
n_written=0;
return len;
}
struct file_operations fops = {
read: device_read,
write: device_write,
};