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);返回的是个空指针造成的,请问是什么原因造成这返回一个空指针的呢?
驱动源码粘贴不了