UART を使用して文字を送受信できる単純なデバイス ドライバーを作成しています。
私の読み書き機能は次のとおりです。
unsigned char UART_read(void){
unsigned int buf;
while( ( ( inb(UART_LSR + UART) ) & UART_LSR_DR ) == 0 ){
schedule();
}
buf = inb(UART);
return (char)buf;
}
ssize_t serp_read(struct file *filep, char __user *buf, size_t count, loff_t *offp){
ssize_t cnt, ret;
char *buffer;
unsigned char data;
int i;
buffer = kmalloc(count * sizeof(char), GFP_KERNEL);
printk("\nTHIS IS KERNEL, read was called and count is %zd\n", count);
while(1){
buffer[i] = UART_read();
if(buffer[i] == '\n') break;
i++;
}
buffer[strlen(buffer) - 1] = '\0';
if( (cnt = (copy_to_user(buf, buffer, strlen(buffer)))) != 0 )
printk("Error in copy_to_user() cnt is %d\n", cnt);
ret = strlen(buffer);
printk("\nTHIS IS KERNEL, read is going away and buf is %s\n", buf);
return ret;
}
void UART_send(unsigned char data){
while( ( ( inb(UART_LSR + UART) ) & UART_LSR_THRE ) == 0 ){
schedule();
}
outb(data, (UART + UART_TX));
}
ssize_t serp_write (struct file *filp, const char __user *buf, size_t count, loff_t *f_pos){
ssize_t cnt, ret;
int i;
char *buffer;
buffer = kmalloc(count * sizeof(char), GFP_KERNEL);
if( (cnt = (copy_from_user(buffer, buf, count))) != 0 ) printk("Error in copy_from_user()\n");
buffer[count] = '\0';
for(i = 0; i < strlen(buffer); i++){
UART_send(buffer[i]);
}
ret = strlen(buffer);
return ret;
}
テストに使用しているプログラムの一部は次のとおりです。
char *str = "HELLO MY NAME IS";
strcpy(buffer, str);
printf("\nThe message is [ %s ]\n", buffer);
if ( (write(fd, buffer, strlen(buffer))) < 0) perror("Error");
buffer[0] = '\0';
if ( (read(fd, buffer, sizeof(buffer))) < 0) perror("Error");
//buffer[strlen(buffer)] = '\0';
printf("\nThe content of buffer after read() is [ %s ]\n", buffer);
私が持っているものでは、"HELLO, MY NAME IS" 文字列を書くのに問題はありませんが、UART から "hey" と言うと、読み取り関数の buf は "heyLO, MY NAME IS" と表示されます。なぜこの上書きが起こっているのかわかりません。現時点での最良の推測は、最初にカーネルがアクセスするユーザー空間に書き込み、次に同じユーザー空間に読み取り、既存のものを上書きしてしまうということです。