sc16is752 在Linux下i2c转串口问题
请教论坛的各位大侠,我在linux下调试sc16is752的问题,在应用层调用open函数不成功,通过打印内核信息如下
[ 58.351167] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 58.359609] pgd = cfb10000
[ 58.362427] [00000000] *pgd=8f334831, *pte=00000000, *ppte=00000000
[ 58.368986] Internal error: Oops: 80000007 [#1] PREEMPT
[ 58.374433] Modules linked in: sc16is7xx(O) rtc_ds1307(O) max310x(O) g90b_iomux(O) drv_iodev(O)
[ 58.383537] CPU: 0 Tainted: G O (3.2.0 #444)
[ 58.389261] PC is at 0x0
[ 58.391918] LR is at uart_carrier_raised+0x40/0x88
[ 58.396915] pc : [<00000000>] lr : [<c0263fac>] psr: a0000093
[ 58.396922] sp : ce82fcc8 ip : ce82fce8 fp : ce82fce4
[ 58.408891] r10: ce8ef400 r9 : 00000001 r8 : ce82fce8
[ 58.414338] r7 : ce86e800 r6 : ce87f740 r5 : cf1b5d98 r4 : ce82e000
[ 58.421146] r3 : 00000000 r2 : c0263f6c r1 : cfb35c00 r0 : cf1b5d98
[ 58.427956] Flags: NzCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment user
[ 58.435488] Control: 10c5387d Table: 8fb10019 DAC: 00000015
[ 58.441481] Process E50_monitor (pid: 1468, stack limit = 0xce82e2f0)
[ 58.674606] Backtrace:
[ 58.677182] [<c0263f6c>] (uart_carrier_raised+0x0/0x88) from [<c02551f4>] (tty_port_block_til_ready+0x208/0x33c)
[ 58.687796] r5:ce82e000 r4:ce8ef3f0
[ 58.691539] [<c0254fec>] (tty_port_block_til_ready+0x0/0x33c) from [<c02661f8>] (uart_open+0x128/0x198)
[ 58.701344] [<c02660d0>] (uart_open+0x0/0x198) from [<c024dcf4>] (tty_open+0x1e0/0x4f8)
[ 58.709690] r8:00000000 r7:c06b725c r6:ce87f740 r5:0fa00001 r4:ce86e800
[ 58.716515] r3:00010004
[ 58.719259] [<c024db14>] (tty_open+0x0/0x4f8) from [<c00a99e4>] (chrdev_open+0x18c/0x1fc)
[ 58.727801] [<c00a9858>] (chrdev_open+0x0/0x1fc) from [<c00a3b68>] (__dentry_open+0x24c/0x318)
[ 58.736794] [<c00a391c>] (__dentry_open+0x0/0x318) from [<c00a4b84>] (nameidata_to_filp+0x68/0x70)
[ 58.746152] [<c00a4b1c>] (nameidata_to_filp+0x0/0x70) from [<c00b3688>] (do_last.isra.29+0x2b8/0x6f8)
[ 58.755768] r7:cf101c38 r6:00000002 r5:00000000 r4:ce82fed8
[ 58.761694] [<c00b33d0>] (do_last.isra.29+0x0/0x6f8) from [<c00b3bc4>] (path_openat+0xc0/0x3cc)
[ 58.770773] [<c00b3b04>] (path_openat+0x0/0x3cc) from [<c00b3fdc>] (do_filp_open+0x34/0x88)
[ 58.779490] [<c00b3fa8>] (do_filp_open+0x0/0x88) from [<c00a4c70>] (do_sys_open+0xe4/0x17c)
[ 58.788198] r7:00000017 r6:ffffff9c r5:cf30d000 r4:00000002
[ 58.794124] [<c00a4b8c>] (do_sys_open+0x0/0x17c) from [<c00a4d2c>] (sys_open+0x24/0x28)
[ 58.802490] [<c00a4d08>] (sys_open+0x0/0x28) from [<c0014880>] (ret_fast_syscall+0x0/0x30)
可以看出问题是在uart_carrier_raised这个内核函数,又找到这个函数的定义如下
static int uart_carrier_raised(struct tty_port *port)
{
struct uart_state *state = container_of(port, struct uart_state, port);
struct uart_port *uport = state->uart_port;
int mctrl;
spin_lock_irq(&uport->lock);
uport->ops->enable_ms(uport);
mctrl = uport->ops->get_mctrl(uport);
spin_unlock_irq(&uport->lock);
if (mctrl & TIOCM_CAR)
return 1;
return 0;
}
那么问题有可能是struct uart_state *state = container_of(port, struct uart_state, port);返回的是个空指针造成的,请问是什么原因造成这返回一个空指针的呢?
驱动源码粘贴不了
[ 58.351167] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 58.359609] pgd = cfb10000
[ 58.362427] [00000000] *pgd=8f334831, *pte=00000000, *ppte=00000000
[ 58.368986] Internal error: Oops: 80000007 [#1] PREEMPT
[ 58.374433] Modules linked in: sc16is7xx(O) rtc_ds1307(O) max310x(O) g90b_iomux(O) drv_iodev(O)
[ 58.383537] CPU: 0 Tainted: G O (3.2.0 #444)
[ 58.389261] PC is at 0x0
[ 58.391918] LR is at uart_carrier_raised+0x40/0x88
[ 58.396915] pc : [<00000000>] lr : [<c0263fac>] psr: a0000093
[ 58.396922] sp : ce82fcc8 ip : ce82fce8 fp : ce82fce4
[ 58.408891] r10: ce8ef400 r9 : 00000001 r8 : ce82fce8
[ 58.414338] r7 : ce86e800 r6 : ce87f740 r5 : cf1b5d98 r4 : ce82e000
[ 58.421146] r3 : 00000000 r2 : c0263f6c r1 : cfb35c00 r0 : cf1b5d98
[ 58.427956] Flags: NzCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment user
[ 58.435488] Control: 10c5387d Table: 8fb10019 DAC: 00000015
[ 58.441481] Process E50_monitor (pid: 1468, stack limit = 0xce82e2f0)
[ 58.674606] Backtrace:
[ 58.677182] [<c0263f6c>] (uart_carrier_raised+0x0/0x88) from [<c02551f4>] (tty_port_block_til_ready+0x208/0x33c)
[ 58.687796] r5:ce82e000 r4:ce8ef3f0
[ 58.691539] [<c0254fec>] (tty_port_block_til_ready+0x0/0x33c) from [<c02661f8>] (uart_open+0x128/0x198)
[ 58.701344] [<c02660d0>] (uart_open+0x0/0x198) from [<c024dcf4>] (tty_open+0x1e0/0x4f8)
[ 58.709690] r8:00000000 r7:c06b725c r6:ce87f740 r5:0fa00001 r4:ce86e800
[ 58.716515] r3:00010004
[ 58.719259] [<c024db14>] (tty_open+0x0/0x4f8) from [<c00a99e4>] (chrdev_open+0x18c/0x1fc)
[ 58.727801] [<c00a9858>] (chrdev_open+0x0/0x1fc) from [<c00a3b68>] (__dentry_open+0x24c/0x318)
[ 58.736794] [<c00a391c>] (__dentry_open+0x0/0x318) from [<c00a4b84>] (nameidata_to_filp+0x68/0x70)
[ 58.746152] [<c00a4b1c>] (nameidata_to_filp+0x0/0x70) from [<c00b3688>] (do_last.isra.29+0x2b8/0x6f8)
[ 58.755768] r7:cf101c38 r6:00000002 r5:00000000 r4:ce82fed8
[ 58.761694] [<c00b33d0>] (do_last.isra.29+0x0/0x6f8) from [<c00b3bc4>] (path_openat+0xc0/0x3cc)
[ 58.770773] [<c00b3b04>] (path_openat+0x0/0x3cc) from [<c00b3fdc>] (do_filp_open+0x34/0x88)
[ 58.779490] [<c00b3fa8>] (do_filp_open+0x0/0x88) from [<c00a4c70>] (do_sys_open+0xe4/0x17c)
[ 58.788198] r7:00000017 r6:ffffff9c r5:cf30d000 r4:00000002
[ 58.794124] [<c00a4b8c>] (do_sys_open+0x0/0x17c) from [<c00a4d2c>] (sys_open+0x24/0x28)
[ 58.802490] [<c00a4d08>] (sys_open+0x0/0x28) from [<c0014880>] (ret_fast_syscall+0x0/0x30)
可以看出问题是在uart_carrier_raised这个内核函数,又找到这个函数的定义如下
static int uart_carrier_raised(struct tty_port *port)
{
struct uart_state *state = container_of(port, struct uart_state, port);
struct uart_port *uport = state->uart_port;
int mctrl;
spin_lock_irq(&uport->lock);
uport->ops->enable_ms(uport);
mctrl = uport->ops->get_mctrl(uport);
spin_unlock_irq(&uport->lock);
if (mctrl & TIOCM_CAR)
return 1;
return 0;
}
那么问题有可能是struct uart_state *state = container_of(port, struct uart_state, port);返回的是个空指针造成的,请问是什么原因造成这返回一个空指针的呢?
驱动源码粘贴不了
...全文
相关推荐
SC16IS7xx,SC16IS752参考代码
SC16IS752 I2C 转串口驱动参考程序,已验证成功,可以正常使用
sc16is752驱动程序代码
sc16is752的驱动代码,驱动方式采样的的是SPI,并非I2C协议。
SC16IS752双通道UART扩展芯片驱动开发与寄存器配置指南
嵌入式开发中,串口资源不足是常见瓶颈,UART扩展芯片成为解决多设备通信的实用方案。SC16IS752作为双通道串口扩展器,通过I2C或SPI与主控连接,提供两路独立UART及硬件流控支持。其核心在于寄存器映射机制,合理配置波特率、FIFO触发阈值与中断逻辑,可显著降低主控负载。本文以工程实践角度,解析初始化流程、小数分频计算及调试要点,并给出Linux用户态与裸机驱动实现,适用于物联网网关、工业控制等场景,帮助开发者高效完成串口扩展。
《模式识别与数据挖掘》配套PPT课件
《模式识别与数据挖掘》配套PPT课件
科技成果转化项目进场交易前,评估备案环节需要准备哪些材料?_8.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。


驱动开发/核心开发
