这里包括两部分:首先建立最简单的板文件+让板文件挂在文件系统+启动系统。
声明:本文是之前写的了,在飞凌论坛发表,现在拿在这里共享一下。
转载请标明来源:http://blog.youkuaiyun.com/l_d_d/article/details/8302527
一、在arch/arm/mach-s3c64xx/目录下建立ok6410.c文件
1、添加头文件:
把mach_smdk6410里的头文件复制过来;
2、添加一个串口(飞凌只是用一个串口,其他三个做扩展,所以我们定义一个):
#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
static struct s3c2410_uartcfg smdk6410_uartcfgs[] __initdata = {
[0] = {
.hwport = 0,
.flags = 0,
.ucon = UCON,
.ulcon = ULCON,
.ufcon = UFCON,
},
};
3、添加用来映射LCD寄存器的结构体:
static struct map_desc smdk6410_iodesc[] =
{
{
/* LCD support */
.virtual = (unsigned long)S3C_VA_LCD,
.pfn = __phys_to_pfn(S3C_PA_FB),
.length = SZ_16K,
.type = MT_DEVICE,
},
};
(如果暂时没有使用,可以不写smdk6410_iodesc,这时候,也要把接下来的:
s3c64xx_init_io(smdk6410_iodesc, ARRAY_SIZE(smdk6410_iodesc));
改为:
s3c64xx_init_io(NULL,0);//但是这句话不可以省略,由于他不单单映射lcd寄存器
)
4、添加平台设备(暂时为空):
static struct platform_device *smdk6410_devices[] __initdata = {
};
5、实现smdk6410_map_io函数:
static void __init smdk6410_map_io(void)
{
u32 tmp;
s3c64xx_init_io(smdk6410_iodesc, ARRAY_SIZE(smdk6410_iodesc));//映射寄存器
s3c24xx_init_clocks(12000000); //初始化时钟
s3c24xx_init_uarts(smdk6410_uartcfgs, ARRAY_SIZE(smdk6410_uartcfgs)); //添加串口设备
/* set the LCD type */
tmp = __raw_readl(S3C64XX_SPCON); //0x7F0081A0
tmp &= ~S3C64XX_SPCON_LCD_SEL_MASK;
tmp |= S3C64XX_SPCON_LCD_SEL_RGB;
__raw_writel(tmp, S3C64XX_SPCON);
/* remove the lcd bypass */
tmp = __raw_readl(S3C64XX_MODEM_MIFPCON);
tmp &= ~MIFPCON_LCD_BYPASS;
__raw_writel(tmp, S3C64XX_MODEM_MIFPCON);
}
6、实现:smdk6410_machine_init函数:
static void __init smdk6410_machine_init(void)
{
u32 cs1;
/*设置SROM BANK 1*/
cs1 = __raw_readl(S3C64XX_SROM_BW) &
~(S3C64XX_SROM_BW__CS_MASK << S3C64XX_SROM_BW__NCS1__SHIFT);
cs1 |= ((1 << S3C64XX_SROM_BW__DATAWIDTH__SHIFT) |
(1 << S3C64XX_SROM_BW__WAITENABLE__SHIFT) |
(1 << S3C64XX_SROM_BW__BYTEENABLE__SHIFT)) <<
S3C64XX_SROM_BW__NCS1__SHIFT;
__raw_writel(cs1, S3C64XX_SROM_BW);
/* set timing for nCS1 suitable for ethernet chip */
__raw_writel((0 << S3C64XX_SROM_BCX__PMC__SHIFT) |
(6 << S3C64XX_SROM_BCX__TACP__SHIFT) |
(4 << S3C64XX_SROM_BCX__TCAH__SHIFT) |
(1 << S3C64XX_SROM_BCX__TCOH__SHIFT) |
(0xe << S3C64XX_SROM_BCX__TACC__SHIFT) |
(4 << S3C64XX_SROM_BCX__TCOS__SHIFT) |
(0 << S3C64XX_SROM_BCX__TACS__SHIFT), S3C64XX_SROM_BC1);
platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices)); //添加smdk6410_devices里的平台设备
}
7、添加自己的板初始化结构体:
MACHINE_START(SMDK6410, "OK6410")
.boot_params = S3C64XX_PA_SDRAM + 0x100,
.init_irq = s3c6410_init_irq,
.map_io = smdk6410_map_io,
.init_machine = smdk6410_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
8、如何让内核去使用这个板文件?
修改:
arch/arm/mach-s3c64xx/Makefile:54:
在obj-$(CONFIG_MACH_SMDK6410) += mach-smdk6410.o
改为
obj-$(CONFIG_MACH_SMDK6410) += ok6410.o
这样,最简单的板文件就完成了,由于没有添加nand驱动,所以只能挂在nfs文件系统(如果先挂在其他文件系统,只需添加移植nand驱动就好了)。
二、现在挂载网络文件系统:
1设置,PC机上的linux系统支持nfs服务:
在/etc/export文件添加:
启动nfs服务:service nfs restart
2、uboot命令行设置:
setenv bootargs "root=/dev/nfs nfsroot=192.168.0.101:/root/rootfs/rootfs ip=192.168.0.100:192.168.0.101:192.168.0.255:255.255.255.0::eth0ff console=ttySAC0,115200"
3、内核网卡驱动移植:
确认drivers/net/下有DM9000的文件(一般都有);
修改arch/arm/mach-s3c6410/ok6410.c:
添加头文件#incude <linux/dm9000.h>
添加dm9000 结构体:
/* Ethernet */
#define S3C64XX_PA_DM9000 (0x18000000)
#define S3C64XX_SZ_DM9000 SZ_1M
#define S3C64XX_VA_DM9000 S3C_ADDR(0x03b00300)
static struct resource dm9000_resources[] = {
[0] = {
.start = S3C64XX_PA_DM9000,
.end = S3C64XX_PA_DM9000 + 3,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = S3C64XX_PA_DM9000 + 4,
.end = S3C64XX_PA_DM9000 + S3C64XX_SZ_DM9000 - 1,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT(7),
.end = IRQ_EINT(7),
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,
},
};
static struct dm9000_plat_data dm9000_setup = {
.flags = DM9000_PLATF_16BITONLY,
.dev_addr = { 0x08, 0x90, 0x00, 0xa0, 0x90, 0x90 },
};
static struct platform_device s3c_device_dm9000 = {
.name = "dm9000",
.id = 0,
.num_resources = ARRAY_SIZE(dm9000_resources),
.resource = dm9000_resources,
.dev = {
.platform_data = &dm9000_setup,
}
};
在smdk6410_devices添加s3c_device_dm9000:
&s3c_device_dm9000, // dm9000 driver add by acanoe
4、配置编译内核
-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> Ethernet (10 or 100Mbit) (NET_ETHERNET [=y])
-> DM9000 support (DM9000 [=y])
还要使内核支持网络文件系统:
如果是全新内核,那么要先
打开第一级菜单下的Networking support -> Networking options -> TCP/IP networking -> IP: kernel level autoconfiguration。如果NFS要使用DHCP,还得选上 IP: DHCP support。这样才有NFS相关选项
File systems --->
Network File Systems --->
<*> NFS client support
Root file system on NFS
<*> Secure RPC: Kerberos V mechanism
5、确保PC机上共享目录有根文件系统
6、把内核烧到开发板;
三、测试:
启动内核:
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
.......
Machine: OK6410
......
S3C NAND Driver is using hardware ECC.
NAND device: Manufacturer ID: 0xec, Chip ID: 0xd5 (Samsung NAND 2GiB 3,3V 8-bit)
Creating 4 MTD partitions on "NAND 2GiB 3,3V 8-bit":
0x000000000000-0x000000100000 : "Bootloader"
0x000000100000-0x000000600000 : "Kernel"
0x000000600000-0x000007e00000 : "User"
0x000007e00000-0x000080000000 : "File System"
......
eth0: link down
eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
IP-Config: Cannot add default route (-101).
VFS: Mounted root (nfs filesystem) on device 0:11.
Freeing init memory: 116K
etc/init.d/rcS: line 10: alsactl: not found
Please press Enter to activate this console.
#