Experience on porting linux-2.6.30.4 to 2440 Development Board
1. Download The linux-2.6.30.4 source code and decompress it
Ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.4.tar.gz
Tar zxvf linux-2.6.30.4.tar.gz
2. Add arm support to the system
$ Vim makefile
193 # arch? = $ (Subarch)
194 # cross_compile? =
195 arch = arm
196 cross_compile = arm-Linux-
3. modify the system clock
$ Vim ARCH/ARM/mach-s3c2440/mach-smdk2440.c
The external clock of the system is 12 MHz.
160 static void _ init smdk2440_map_io (void)
161 {
162s3c24xx_init_io (smdk2440_iodesc, array_size (smdk2440_iodesc ));
163 // s3c24xx_init_clocks (16934400 );
164 // edit
165 s3c24xx_init_clocks (12000000 );
166s3c24xx_init_uarts (smdk2440_uartcfgs, array_size (smdk2440_uartcfgs ));
167}
Note: If the system clock does not match, garbled characters may occur.
4. Create or obtain the Kernel configuration ticket. config
$ Make menuconfig
Note: A good practice is to first call the built-in configuration list. The configuration list is in the arch/ARM/configs directory, with the file name: s3c2410_defconfig. The configuration file contains almost the configuration items of the s3c24xx series CPU, you can modify the configuration items on this basis. The configuration item for x86 is in the arch/x86/configs directory, and the file name is i386_defconfig (32 is the CPU ).
Cp arch/ARM/configs/s3c2410_defconfig. config
5. Modify the machine code
[View machine code related files in Linux kernel source code :]
$ Vim ARCH/ARM/mach-s3c2440/mach-smdk2440.c
178 machine_start (S3C2440, "smdk2440 ")
179/* maintainer: Ben dooks <ben@fluff.org> */
180. phys_io = s3c2410_pa_uart,
181. io_pg_offst = (u32) s3c24xx_va_uart)> 18) & 0 xfffc,
182. boot_params = s3c2410_sdram_pa + 0x100,
183
184. init_irq = s3c24xx_init_irq,
185. map_io = smdk2440_map_io,
186. init_machine = smdk2440_machine_init,
187. Timer = & s3c24xx_timer,
188machine_end
Modify the machine code to make it the same as the machine code of bootloader. Here u-boot is used, and the machine code is 168.
$ Vim ARCH/ARM/tools/Mach-types
379 S3C2440 arch_s3c2440 s3c2440168
$ Vim ARCH/ARM/tools/makefile
7 include/ASM-arm/mach-types.h: $ (SRC)/Gen-Mach-types $ (SRC)/Mach-types
8 @ echo 'generating $ @'
9 @ mkdir-p $ (DIR $ @)
10 $ (q) $ (awk)-F $ ^ >$ @ | {Rm-F $ @;/bin/false ;}
$ Vim include/ASM/mach-types.h
375 # define mach_type_s3c2440168 // you have not found this
[Configuration file in U-boot]
$ Vim includes/ASM-arm/mach-types.h
377 # define mach_type_s3c2440 168
Summary: first, identify the machine type (such as S3C2440) from the Linux kernel source code, and then, according to the machine type machine code (such as 377 # define mach_type_s3c2440 168) given in U-boot) modify the kernel machine code. The process is as follows:
Kernel:
$ Vimarch/ARM/mach-s3c2440/mach-smdk2440.c
U-boot:
$ Viminclude/ASM-arm/mach-types.h
Kernel:
$ Vimarch/ARM/tools/Mach-types
Note: If the machine code is incorrect, the system prompts you to select a platform and the system crashes.
6. Compile the image
$ Make zimage
7. blackboard writing
Run the dnw tool to download the kernel image to the Development Board.
8. Problems Encountered
Problem:
Kernel panic-not syncing: attempted to kill Init!
Solution:
$ Make menuconfig
Select the following two items:
Kernel features --->
[*] Use the arm Eabi to compile the kernel
[*] Allow old Abi binaries to run with this kernel (experimental)
IX. nandflash driver porting
Linux contains the nandflash driver. You only need to modify the source code.
1, $ Vim ARCH/ARM/plat-s3c24xx/common-smdk.c
107/* NAND parititon from 2.4.18-swl5 */
108
109 static struct mtd_partitionsmdk_default_nand_part [] = {
110 # If defined (config_64mb_nand)
111 [0] = {
112. Name = "board_uboot ",
113. size = 0x00040000,
114. offset = 0x00000000,
115 },
116 [1] = {
117. Name = "board_kernel ",
118. size = 0x00200000,
119. offset = 0x00200000,
120 },
121 [2] = {
122. Name = "board_yaffs2 ",
123. size = 0x03bf8000,
124. offset = 0x00400000,
125}
126 # Elif defined (config_128mb_nand)
127 [0] = {
128. Name = "board_uboot ",
129. offset = 0x00000000,
130. size = 0x00040000,
131 },
132 [1] = {
133. Name = "board_kernel ",
134. offset = 0x00200000,
135. size = 0x00200000,
136 },
137 [2] = {
138. Name = "board_yaffs2"
139. offset = 0x00400000,
140. size = 0x07ba0000,
141}
142 # Elif defined (config_more_than_256mb_nand)
143 [0] = {
144. Name = "board_uboot ",
145. offset = 0x00000000,
146. size = 0x00040000,
147 },
148 [1] = {
149. Name = "board_kernel ",
150. offset = 0x00200000,
151. size = 0x00200000,
152 },
153 [2] = {
154. Name = "board_yaffs2 ",
155. offset = 0x00400000,
156. size = 0x0fb80000,
157}
158 # endif
159 };
2. $ vimdrivers/MTD/NAND/kconfig
166 choice
167 prompt "NAND Flash capacity select"
168 depends on MTD
169 help
170 board NAND Flash capacity select
171
172 config 64mb_nand
173 Boolean "64 mb nand for board"
174 depends on MTD
175 help
176 set 64 mb nand parts
177
178 config 128mb_nand
179 Boolean "128 mb nand for board"
180 depends on MTD
181 help
182 set 128 mb nand parts
183
184 config more_than_256mb_nand
185 Boolean "MB ~ 1 gb nand for board"
186 depends on MTD
187 help
188 set MB ~ 1 gb nand parts
189
190 endchoice
NOTE: If 64mb_nand is selected in make menuconfig, the format of. config is as follows:
Config _ 64mb_nand = y
This actually provides pre-compiled variables for C source files, such as # If defined (config_64mb_nand ).......
This process is to implement kernel customization, such as adding a NAND driver or removing a wireless driver...
10. Port the yaffs2 file system. 1. Obtain the source code of yaffs2.
Http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/
Www. aleph1.co. uk/home/aleph1/git/yaffs2
2. Add support for yaffs2 to the kernel
In the source code of the downloaded yaffs2, run:
./Patch-ker.sh C./linux-2.6.30.4 (two folders put together)
In this case, the "yaffs2" directory is added under the FS directory of the kernel, and The makefile and kconfig files under the FS/directory are also added with the configuration and compilation conditions of yaffs2.
3. Add support for yaffs2 in the configuration Sheet
$ Make menuconfig
File systems --->
[*] Miscellaneous filesystems --->
<*> Yaffs2 File System Support
NOTE: If no support for yaffs2 is added to the kernel, the following error occurs:
Listof all partitions:
01004096 ram0 (driver ?)
01014096 ram1 (driver ?)
01024096 ram2 (driver ?)
01034096 ram3 (driver ?)
01044096 ram4 (driver ?)
01054096 ram5 (driver ?)
01064096 ram6 (driver ?)
01074096 ram7 (driver ?)
01084096 ram8 (driver ?)
01094096 ram9 (driver ?)
010a 4096 ram10 (driver ?)
010b4096 ram11 (driver ?)
010c 4096 ram12 (driver ?)
010d4096 ram13 (driver ?)
010e4096 ram14 (driver ?)
010f 4096 ram15 (driver ?)
1f00 256 mtdblock0 (driver ?)
1f01 2048 mtdblock1 (driver ?)
1f02 63168 mtdblock2 (driver ?)
Nofilesystem cocould Mount root, tried: ext3 ext2 cramfs msdos vfat romfs
Kernel panic-not syncing: VFS: unable tomount root FS on unknown-block (31,2)
4. Run the yaffs2 port and re-compile the kernel.
11. Add tmpfs support to the kernel
If tmpfs support is not added, the/tmp Mount failure prompt will appear. The role of tmpfs is to be studied.
Mount: mounting tmpfs on/tmp failed: invalidargume
File System Configuration:
[Root @/] # Cat/etc/fstab
Proc/proc defaults 0 0
Tmpfs/tmp tmpfs defaults 0 0
Sysfs/sys sysfs defaults 0 0
Tmpfs/dev tmpfs defaults 0 0
Var/dev tmpfs defaults 0 0
File systems --->
Pseudo filesystems --->
[*] Virtual memory file system support (former shm fs)
[*] Tmpfs POSIX access control lists
12 Problems and Solutions
Drivers/RTC/hctosys. C: Unable to open RTC device (rtc0)
1. Kernel configuration options
--- Real timeclock
[*] Set system time from RTC on startup andresume
(Rtc0) RTC used to set the systemtime
[] RTC debugsupport
* ** RTC interfaces ***
[*]/Sys/class/RTC/rtcn (sysfs)
[*]/Dev/rtcn (characterdevices)
[] RTC uie emulation on devinterface
* ** On-cpu rtc drivers ***
<*> Samsung s3series SOC rtc
2. Linux kernel has supported the RTC of S3C2410, but not added to the platform device initialization array, so the system does not initialize this part at startup, You need to modify the file mach-smdk.c
Static struct platform_device * smdk2410_devices [] _ initdata = {
& Amp; initi_device_ohci,
& Amp; cloud_device_ LCD,
& Amp; cloud_device_wdt,
& Amp; cloud_device_i2c0,
& Amp; cloud_device_iis,
& Amp; initi_device_rtc, // Add code
};
3. Create a device node and run the following command in the file system/dev directory:
Sudo mknod rtc c 10 10 135
4. recompile the kernel and view the startup information.
S3c2410-rtcs3c2410-rtc: RTC disabled, re-enabling.
S3c2410-rtcs3c2410-rtc: RTC core: Registered s3c asrtc0
It indicates that the RTC driver can work properly.
Uncorrectable error: <3> end_request: I/O error, Dev mtdblock2, Sector 2
EXT3-fs: Unable to readsuperblock
Uncorrectable error: <3> end_request: I/O error, Dev mtdblock2, Sector 2
EXT2-fs: Unable to readsuperblock
Uncorrectable error: <3> end_request: I/O error, Dev mtdblock2, sector 0
Buffer I/O error ondevice mtdblock2, Logical Block 0
Uncorrectable error: <3> end_request: I/O error, Dev mtdblock2, sector 0
Buffer I/O error ondevice mtdblock2, Logical Block 0
Uncorrectable error: <3> end_request: I/O error, Dev mtdblock2, Sector 8
Buffer I/O error ondevice mtdblock2, Logical Block 1
Uncorrectable error: <3> end_request: I/O error, Dev mtdblock2, Sector 8
Buffer I/O error ondevice mtdblock2, Logical Block 1
Uncorrectable error: <3> end_request: I/O error, Dev mtdblock2, Sector 16
Buffer I/O error ondevice mtdblock2, Logical Block 2
Uncorrectable error: <3> end_request: I/O error, Dev mtdblock2, Sector 16
Buffer I/O error ondevice mtdblock2, Logical Block 2
Uncorrectable error: <3> end_request: I/O error, Dev mtdblock2, sector 24
Buffer I/O error ondevice mtdblock2, logical block 3
Uncorrectable error: <3> end_request: I/O error, Dev mtdblock2, sector 24
Buffer I/O error ondevice mtdblock2, logical block 3
Uncorrectable error: <3> end_request: I/O error, Dev mtdblock2, sector 0
Fat: unable to read bootsector
VFS: cannot open rootdevice "mtdblock2" or unknown-block (31,2)
Please append a correct "root =" Boot option; here are the available partitions:
1f00 256 mtdblock0 (driver ?)
1f01 2048 mtdblock1 (driver ?)
1f02 257536 mtdblock2 (driver ?)
Kernel panic-notsyncing: VFS: Unable to mount root FS on unknown-block (31,2)
MTD partition does not match bootloader
# Elif defined (config_more_than_256mb_nand)
[0] = {
. Name = "board_uboot ",
. Offset = 0x00000000,
. Size = 0x00080000,
},
[1] = {
. Name = "board_kernel ",
. Offset = 0x00240000,
. Size = 0x00200000,
},
[2] = {
. Name = "board_yaffs2 ",
. Offset = 0x00440000,
. Size = 0x0fb40000,
}
**************************************** **************************************** **************************************** **************************************
[0] and [1] partitions are inconsistent. The intermediate part of the surface causes stores the uboot parameters and boot screen ???Environment Variable
Uboot partition information:
0x0 to 0x40000 is the uboot partition, 256 K,
0x40000 to 0x4c000 are parameters partitions, 48 K,
0x50000 to 0x70000 are eboot partitions, 128 K,
0x70000 to 0x1f0000 is the logo partition, 1536 K,
0x1f0000 to 0x3f0000 are kernel partitions, 2 m,
0x3f0000 to 0x3ff8000 are root partitions, 60.03125 m
Nand partition information:
Static struct mtd_partition smdk_default_nand_part [] = {
[0] = {
. Name = "tq2440_uboot ",
. Size = 0x00040000,
. Offset = 0x00000000,
},
[1] = {
. Name = "tq2440_kernel ",
. Offset = 0x0004c000,
. Size = 0x00200000,
},
[2] = {
. Name = "tq2440_yaffs2 ",
. Offset = 0x0024c000,
. Size = 0x03db0000,
}
};
The partition of uboot is not associated with the partition of the file system. The only link is that the command should be guided according to the partition information of the file system during uboot boot. For example, to start mtdblock2, the command bootm0xxxxxxxx in bootcmd must be the same as the first address of mtdblock2 ....