分类 - 嵌入式

无    2017-03-22 16:00:07    70    0    0

无    2017-03-11 07:00:23    170    0    0

不管是大名鼎鼎的buidlroot还是yocto

他们做出来的根文件系统init的第一个进程都是通过inittab调用出来 

而且他们在制作过程中即使你指定了内核版本 他还是会调用3.0内核的

具体调用的是不是内核头文件我不是很确定

systemd的启动方式也许有点臃肿吧 

和嵌入式的轻量级可裁剪有点不合适?

而且systemd的交叉编译方式目测官方都没看到怎么说明

看来也只能是用rcS了

http://free-electrons.com/doc/training/embedded-linux/embedded-linux-slides.pdf

 

 

kernel    2017-03-02 19:47:46    85    0    0

 

这里进去的u-boot还是我移植的那个版本呢

执行以下命令:擦出坏块

nand bad​


擦出内核坏块

SMDK2440 # nand scrub.part kernel 
NAND scrub.part: device 0 offset 0x60000, size 0x600000
Warning: scrub option will erase all factory set bad blocks!
 There is no reliable way to recover them.
 Use this command only for testing purposes if you
 are sure of what you are doing!
Really scrub this NAND flash? <y/N>
y
Erasing at 0x640000 -- 100% complete.
OK​

 

SMDK2440 # nand erase.part kernel
NAND erase.part: device 0 offset 0x60000, size 0x600000
Skipping bad block at 0x00100000 
Skipping bad block at 0x00120000 
Skipping bad block at 0x00200000 
Skipping bad block at 0x00220000 
Skipping bad block at 0x00300000 
Skipping bad block at 0x00320000 
Skipping bad block at 0x00400000 
Skipping bad block at 0x00420000 
Skipping bad block at 0x00500000 
Skipping bad block at 0x00520000 
Skipping bad block at 0x00600000 
Skipping bad block at 0x00620000 
Erasing at 0x640000 -- 100% complete.
OK​

擦除root分区坏块​

SMDK2440 # nand scrub.part root
NAND s
u-boot kernel    2017-03-02 10:12:13    121    0    0

造成这个错误的原因有多少我不知道

google了一下

说内核设置小了 所以u-boot读取内核不完整导致失败了

还有说是nand bad (nand坏快引起的)

还有的是启动引导参数设置不正确导致的

还有的是 机器ID不一致导致的(u-boot机器ID和linux 内核默认的机器ID不一直)

尼马我都试了还是不行 

然后回头又看了看启动的信息

基本上是坏快的原因了 因为坏快产生在了内核引导的地址 而内核貌似不检查这些 

所以。。。。。悲剧了~

这是我移植之后内核设置6M的一大原因吧!具体是不是这个原因得回去试试~

参考:

http://processors.wiki.ti.com/index.php/Writing_Kernel_Image_to_NAND_Flash

http://www.denx.de/wiki/DULG/UBootCmdGroupNand

http://www.voidcn.com/blog/fu851523125/article/p-6182227.html

http://www.100ask.org/bbs/forum.php?mod=viewthread&tid=753&highlight=%BB%B5%BF%E9

bdinfo信息

SMDK2440 # bdinfo
arch_number = 0x000000C1
boot_params = 0x30000100
DRAM bank   = 0x00000000
-> start    = 0x30000000
-> size     = 0x04000000
eth0name    = dm9000
ethaddr     = 00:50:56:C0:00:08
current eth = dm9000
ip_addr     = 192.168.0.110
baudrate    = 115200 bps
TLB addr    = 0x33FF0000
relocaddr   = 0x33F29000
reloc off   = 0x00529000
irq_sp      = 0x33B28EF0
sp start    = 0x33B28EE0

重新设置机器ID:​

SMDK2440 # set mancid 16a
SMDK2440 # save 
SMDK2440 # reset​
。。。。。。。。。
*
无    2017-03-01 10:47:58    77    0    0

制作根文件系统
1.制作/dev/设备节点

>cd /var/nfs_share/first_fs/
>sudo mkdir dev && cd dev
>sudo mknod console c 5 1
>sudo mknod null c 1 3​

查看制作好的:

/var/nfs_share/first_fs/dev
三 3月 01|09:22|0:>l​

总用量 0
crw-r--r-- 1 root root 5, 1 3月 1 09:21 console
crw-r--r-- 1 root root 1, 3 3月 1 09:22 null​

对比本机系统:

~
三 3月 01|09:23|0:>l /dev/console
crw------- 1 root root 5, 1 2月 28 18:14 /dev/console
~
三 3月 01|09:23|0:>l /dev/null
crw-rw-rw- 1 root root 1, 3 2月 28 18:14 /dev/null
1​

2.创建/etc/和启动目录init本身

>..
/var/nfs_share/first_fs
三 3月 01|09:26|0:>ls
bin dev linuxrc sbin usr
>sudo mkdir -p etc/init.d
/var/nfs_share/first_fs
三 3月 01|09:29|0:>ls -R etc/
etc/:
init.d
etc/init.d:​

创建启动脚本

/var/nfs_share/first_fs
三 3月 01|09:29|0:>sudo vim etc/inittab
/var/nfs_share/first_fs
三 3月 01|09:33|0:>cat etc/inittab 
console::xuanfirst:-/bin/sh
::sysinit:/etc/init.d/rcS
 ​

编辑启动脚本启动 fstab 挂载设备节点等

>sudo vim etc/init.d/rcS
xuan's password:
/var/nfs_share/first_fs
三 3月 01|09:40|0:>cat etc/init.d/rcS 
#!/bin/sh
mount -a
mkdir /dev/pts
mou
无    2017-02-28 21:26:39    498    0    0

1.修改 Makefile
找到以下2处修改为
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-

2. make menuconfig

(1)Tab键自动补齐功能(本版本默认以选中)
BusyBox Settings-->BusyBox Liarary Tuning-->Tab completion;
(2)将BusyBox编译为静态链接
BusyBox Settings-->Build Options-->Build Busybox as a static binary(no shared libs)
(3)如果使用不同的交叉编译工具,需指定编译工具的路径,(要手动添加)
这个配置项为:
Busybox Settings-->Build Options-->Cross Compiler prefix;
(4)init程序应该读取配置文件/etc/inittab.(本版本默认已选中)
这个配置项为
Init Utilities-->Support reading an inittab file

保存退出:
scripts/kconfig/mconf Config.in
#
# using defaults found in /dev/null
#


*** End of configuration.
*** Execute 'make' to build the project or try 'make help'.

>make​
>make
miscutils/nandwrite.c: In function 'nandwrite_main':
miscutils/nandwrite.c:151:3: error: 'MTD_FILE_MODE_RAW' undeclared (first use in this function)
miscutils/nandwrite.c:151:3: note: each undeclared identifier is reported only once for each function it appears in
scripts/Makefile.build:197: recipe for target 'miscutils/nandwrite.o' failed
make[1]: *** [miscutils/nandwrite
kernel    2017-02-28 15:50:51    224    0    0

我的机器配置:

>uname -a
Linux SUSE.suse 4.1.38-50-default #1 SMP PREEMPT Sun Feb 19 14:35:48 UTC 2017 (6b4d8cb) x86_64 x86_64 x86_64 GNU/Linux
/var/smdk2440/linux-4.4.1

给2440移植一个4.1的内核吧

>xz -cd linux-4.X.tar.xz | tar xvf -
>cd linux-4.1.36
>xz -cd ../patch-4.1.36.xz | patch -p1
patching file .mailmap
Reversed (or previously applied) patch detected!  Assume -R? [n]

这意思是已经打过补丁了?

>make s3c2410_defconig
scripts/kconfig/conf  --silentoldconfig Kconfig
***
*** Configuration file ".config" not found!
***
*** Please run some configurator (e.g. "make oldconfig" or
*** "make menuconfig" or "make xconfig").
***
scripts/kconfig/Makefile:37: recipe for target 'silentoldconfig' failed
make[2]: *** [silentoldconfig] Error 1
Makefile:543: recipe for target 'silentoldconfig' failed
make[1]: *** [silentoldconfig] Error 2
make: *** No rule to make target 's3c2410_defconig'。 停止。

这个错误没有看出哪里毛病来

然后直接进行

> make menuconfig

看了一下大概信息

然后修改/arch/arm/mach-s3c24xx/mach-smdk2440.c 

晶震改为:12000000

/arch/arm/mach-s3c24xx/common-smdk.c 

N

u-boot    2017-02-27 19:50:10    206    0    0

看了韦东山视频的0基础部分 没有购买收费视频 

中间停了一段时间 在看C++

然后又开始直接看得还是免费的 不过是毕业班那一系列的了

然后网上各种的看资料

基本思路知道了

移植过程最初很无语

汇编  Makefile语法是一大关卡

这东西就像车 即使您不会 摸多了自然也会开

之前我还看了一本Makefile的书 

真看到这种软件的Makefile尤其是内核和android那样的 头大~

不过 在各种莫名其妙的问题里面也是不断积累的一个过程

。。。。。。。。。。。。。。。。

一个星期!

还不是很确定nand能不能完全读写

2016.11版本代码改了好多好多。。。。

移植过程make中错误:

LD      lib/built-in.o
  LD      u-boot
common/built-in.o: In function `usb_stop':
/var/smdk2440/u-boot-2016.11_smdk2440/common/usb.c:144: undefined reference to `usb_lowlevel_stop'
common/built-in.o: In function `usb_submit_int_msg':
/var/smdk2440/u-boot-2016.11_smdk2440/common/usb.c:204: undefined reference to `submit_int_msg'
common/built-in.o: In function `usb_control_msg':
/var/smdk2440/u-boot-2016.11_smdk2440/common/usb.c:240: undefined reference to `submit_control_msg'
common/built-in.o: In function `usb_bulk_msg':
/var/smdk2440/u-boot-2016.11_smdk2440/common/usb.c:274: undefined reference to `submit_bulk_msg'
common/built-in.o: In function `usb_init':
/var/smdk2440/u-boot-2016.11_smdk2440/common/usb.c
无    2017-02-24 21:36:59    186    0    0

全程演示diff和patch基础

/var/smdk2440/qt-src/test
五 2月 24|21:02|0:>cat new/new1/new2/new2.txt                               
new-dir2
new
/var/smdk2440/qt-src/test
五 2月 24|21:02|0:>cat old/old1/old2/old2.txt                               
old-dir2
1111111
/var/smdk2440/qt-src/test
五 2月 24|21:02|0:>diff -Nur new/new1/new2/new2.txt old/old1/old2/old2.txt  
--- new/new1/new2/new2.txt      2017-02-24 20:57:20.732527223 +0800
+++ old/old1/old2/old2.txt      2017-02-24 21:01:15.846027476 +0800
@@ -1,2 +1,2 @@
-new-dir2
-new
+old-dir2
+1111111
/var/smdk2440/qt-src/test
五 2月 24|21:02|0:>diff -Nur new/new1/new2/new2.txt old/old1/old2/old2.txt  > old-to-new.patch
/var/smdk2440/qt-src/test
五 2月 24|21:03|0:>l
总用量 8
drwxr-xr-x 3 xuan users  18 2月  24 20:51 old
drwxr-xr-x 3 xuan users  18 2月  24 20:51 new
-rw-r--r-- 1 xuan users   0 2月  24 20:52 old1.txt
-rw-r--r-- 1 xuan users   2 2月  24 20:53 test.txt
-rw-r--r-- 1 xuan users 176 2月  24 21:03 old-to-new.patch
/var/smdk2440/qt-src/test
五 2月 24|21:03|0:>vim 
u-boot    2017-02-23 22:02:53    188    0    0

折腾两天

本打算移植一下2015版本的 结果移植失败 串口无法显示信息 内核也启动不了 

看来没有看收费视频还是有点差距的

改天看看那个补丁文件到底差别在那儿

另外现在u-boot代码变化和之前的差多了。。。。。。。。。。

所以只能在原来基础上修改一下了 谁让现在内核裁剪还那么费劲呢!


uboot里的kernel分区默认为2M改为8m

修改分区如下,建议留给kernel8M大小:

0.补丁打上:

cd /var/s3c2440-src/u-boot-1.1.6/
patch -p1 < ../u-boot-1.1.6_jz2440.patch 

第一步 :在配置文件include/config/smdk2410.h 里面有一个宏定义

#define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k@0(bootloader)," \ 
 "128k(params)," \ 
 "2m(kernel)," \ 
 "-(root)"​

把上面的2M改为8M(改好后重新编译uboot),根据kernel启动信息看还得把128kb改成255kb
/*kernel分区默认为2M改为8m*/

#define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k@0(bootloader)," \
				"128k(params)," \
				"8m(kernel)," \
				"-(root)"


启动之后默认是这样的 还没有改过来

OpenJTAG> mtd ​
 device nand0 <nandflash0>, # parts = 4 
 #: name size offset mask_flags 
 0: bootloader 0x00040000 0x00000000 0 
 1: params 0x00020000 0x00040000 0 
 2: kernel 0x00200000 0x00060000 0 
 3: root 0x0fda0000 0x00260000 0 
 
 active partition: nand0,0 - (bootloader) 0x00040000 @ 0x00000000 
 
 defaults: 
 mtdids : nand0=nandflash0 
 mtdpar
1/4