首选根据永久解决Linux(Ubuntu)下安装CH340驱动问题_ch340 linux驱动安装make报错-CSDN博客
这篇帖子我增加了#include <linux/sched/signal.h>这个头文件,但编译还是出错
在ch341.c的第1462行.write = ch341_tty_write,
根据提示error: initialization of ‘ssize_t (*)(struct tty_struct *, const u8 *, size_t)’ {aka ‘long int (*)(struct tty_struct *, const unsigned char *, long unsigned int)’} from incompatible pointer type ‘ssize_t (*)(struct tty_struct *, const unsigned char *, int)’ {aka ‘long int (*)(struct tty_struct *, const unsigned char *, int)’} [-Werror=incompatible-pointer-types]
1462 | .write = ch341_tty_write,
| ^~~~~~~~~~~~~~~
发现类型出现错误。
查看手册
可以看到write的类型应当为ssize_t,修改代码
static ssize_t ch341_tty_write(struct tty_struct *tty, const unsigned char *buf, size_t count)
{
struct ch341 *ch341 = tty->driver_data;
int stat;
unsigned long flags;
int wbn;
struct ch341_wb *wb;
if (!count)
return 0;
spin_lock_irqsave(&ch341->write_lock, flags);
wbn = ch341_wb_alloc(ch341);
if (wbn < 0) {
spin_unlock_irqrestore(&ch341->write_lock, flags);
return 0;
}
wb = &ch341->wb[wbn];
if (!ch341->dev) {
wb->use = 0;
spin_unlock_irqrestore(&ch341->write_lock, flags);
return -ENODEV;
}
count = (count > ch341->writesize) ? ch341->writesize : count;
memcpy(wb->buf, buf, count);
wb->len = count;
stat = usb_autopm_get_interface_async(ch341->data);
if (stat) {
wb->use = 0;
spin_unlock_irqrestore(&ch341->write_lock, flags);
return stat;
}
if (ch341->susp_count) {
usb_anchor_urb(wb->urb, &ch341->delayed);
spin_unlock_irqrestore(&ch341->write_lock, flags);
return count;
}
stat = ch341_start_wb(ch341, wb);
spin_unlock_irqrestore(&ch341->write_lock, flags);
if (stat < 0)
return stat;
return count;
}
由于count是返回值,他的类型也需要修改,更改之后编译成功