移植 BusyBox-1.31.1 到 iTOP-4412(二)问题联调

一、问题回顾

   前面虽然根文件系统已经启动,但是明显是有问题的。

1. vi -> crash

使用 vi 命令时,直接 crash

[root@iTOP-4412]# vi[   40.971723] 8<--- cut here ---
[   40.973629] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[   40.981737] pgd = (ptrval)
[   40.984367] [00000000] *pgd=77069831
[   40.987914] Internal error: Oops: 817 [#1] PREEMPT SMP ARM
[   40.993354] Modules linked in:
[   40.996380] CPU: 2 PID: 423 Comm: linuxrc Not tainted 5.8.5 #1
[   41.002200] Hardware name: Samsung Exynos (Flattened Device Tree)
[   41.008286] PC is at io_serial_out+0x18/0x20
[   41.012532] LR is at arm_heavy_mb+0x1c/0x38
[   41.016692] pc : [<c05bc26c>]    lr : [<c011a774>]    psr: 60000093
[   41.022947] sp : eda83e90  ip : 1040dd39  fp : 00000020
[   41.028152] r10: 00000001  r9 : ee347550  r8 : c0b33944
[   41.033360] r7 : a0000013  r6 : c183429c  r5 : 00000000  r4 : 00000002
[   41.039874] r3 : 00000000  r2 : 00000730  r1 : 00000000  r0 : c183429c
[   41.046385] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment none
[   41.053592] Control: 10c5387d  Table: 6db2004a  DAC: 00000051
[   41.059316] Process linuxrc (pid: 423, stack limit = 0x(ptrval))
[   41.065305] Stack: (0xeda83e90 to 0xeda84000)
[   41.069642] 3e80:                                     c183429c c05be7c0 00000001 ee347400
[   41.077815] 3ea0: c183429c c05b78cc ee347400 00000000 ee34782e 000022a4 c0b33944 c059a614
[   41.085974] 3ec0: eda4cb40 eda82000 ee347800 ee347550 c0b33944 ee347704 00000000 edab4240
[   41.094133] 3ee0: c017c34c ee347728 ee347728 c1108ec8 0000002e ee347400 0000002e 000ed32a
[   41.102292] 3f00: eda4cb40 0000002e 00000000 eda82000 ee347800 c05983cc 00000000 00000051
[   41.110451] 3f20: c059a378 00000400 c0d9e6a8 edca6fc0 edab4240 eda4cb40 0000002e c059826c
[   41.118610] 3f40: 000ed32a eda83f78 0000002e 00000004 00000000 c02c9384 00000000 ed9e8000
[   41.126769] 3f60: eda4cb40 eda4cb40 00000000 00000000 000ed32a c02c95e0 00000000 00000000
[   41.134929] 3f80: 00000000 c1108ec8 00005402 000f8e30 0000002e 000ed32a 00000004 c0100224
[   41.143088] 3fa0: eda82000 c0100060 000f8e30 0000002e 00000001 000ed32a 0000002e 00000010
[   41.151247] 3fc0: 000f8e30 0000002e 000ed32a 00000004 000003b9 00000000 000d6a6a 00000000
[   41.159406] 3fe0: 00000001 be895c50 0000f66c b6e5e0cc 60000010 00000001 00000000 00000000

2. ls /dev 出现错位

ls /dev 之类的命令出现错位等。

在这里插入图片描述

二、问题分析

   linux 的代码应该都是有经过测试才对啊!怎么可能这么容易 crash,这不可能不可能!!

   busybox 的代码也是应该都经过了测试才对啊!怎么可能这么容易错位,这不可能不可能!!

   事实证明,确实不太可能这么容易出现问题。。。

   尝试直接烧写官方编译好的 dtb 文件,vi 就没有 crash,看来还是 dts 有些问题才导致了 kernel crash。

   错位的问题,应该是 putty 有 bug?或是我 putty 的配置有问题?总之,换成了 HyperTerminal 就好了。。。

在这里插入图片描述

三、porting dts

   经过一通胡乱移植,出现了一些问题。

1. ls 输出不全,vi crash

   因为和应用层交互时有一些问题,所以感觉是内存或是 mmu 的问题,但是对比了好几次,都是一样的。。还没发现问题到底在哪。

   因为最开始移植到能够启动 rootfs 时,ls 输出的时候就输出不全,而且会打印一条 dma Reset Channel log 出来,找到 kernel 对应的代码,打印是 info 级别的 log,就把它注释了,其实问题应该就是出现在这里。

  • 文件:drivers\dma\pl330.c line 1651
/* Returns 1 if state was updated, 0 otherwise */
static int pl330_update(struct pl330_dmac *pl330)
{
	// ............................
	val = readl(regs + FSC) & ((1 << pl330->pcfg.num_chan) - 1);
	pl330->dmac_tbd.reset_chan |= val;
	if (val) {
		int i = 0;
		while (i < pl330->pcfg.num_chan) {
			if (val & (1 << i)) {
				dev_info(pl330->ddma.dev,      // line 1651
					"Reset Channel-%d\t CS-%x FTC-%x\n",
						i, readl(regs + CS(i)),
						readl(regs + FTC(i)));
				_stop(&pl330->channels[i]);
			}
			i++;
		}
	}
	// ............................
}

   最后发现果然是串口节点的 dmas 属性导致了问题,linux dts 还没支持好?Samsung’s DMA driver 还有问题?不管了,就注释掉这个使用吧。

在这里插入图片描述


   这里解决掉后,就可以正常工作。并且把波特率设置到 460800 都可以,使用 vi 翻页也是没有延迟,太爽了!

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值