移植Linux2.6.38到Tiny6410_1GNandflash
首先说一下为什么要下决心移植Linux内核,本来移植完Uboot后我想先把韦东山第二期的驱动教程看完后在试图移植内核,可是当我跟着教程写好LCD的驱动后,去设置编译友善的内核来测试程序时,我稍微改一点友善的内核配置就编译通不过,最后不得不移植内核来测试我的驱动程序!
1、修改根目录下的Makefile:指定为交叉编译器
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
2、在s3c6400的配置上进行修改
#make s3c6400_defconfig
3、#make menuconfig 进入配置界面其配置可以完全按照友善之臂的配置来做,当中有些不一样的选项可以不管,
当然在配置的时候可以按H键来查看帮助信息和当前配置项的意义,有些我们不需要用到的可以不要。
其中要注意的几个选项(要和友善之臂设置的一样)是:
a.General setup ---> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support (scripts/FriendlyARM.cpio) Initramfs source file(s)
如果不设置这两个选项当通过NFS挂载根文件系统时 会出现 nfs:server is not responding, still trying然后等个1分钟左右才能进入命令行;(复制友善的内核源码scripts/FriendlyARM.cpio文件到自己内核相应目录下)
FriendlyARM.cpio文件是什么?可以参考我转载的一篇文章【转载】Mini6410启动过程
[*] Networking support ---> Networking options ---> Device Drivers ---> [*] Network device support ---> File systems ---> [*] Network File Systems --->
这三个选项下的设置是挂载NFS上的根文件系统的关键。
我终于知道为什么加了FriendlyARM.cpio文件后挂载NFS就非常顺畅,不会出现 nfs:server is not responding, still trying
将FriendlyARM.cpio在init文件中看到了这句话:mount -t nfs $NFSROOT /r -o nolock,proto=tcp
说明友善挂载NFS的时候是用的TCP协议,而不是NFS默认的UDP协议。然后我将启动参数设置为:
set bootargs console=ttySAC0, root=/dev/nfs nfsroot=10.10.206.15:/root/nfs/roofs,proto=tcp ip=10.10.206.11:10.10.206.15:10.10.206.254:255.255.255.0:cxd:eth0:off init=/linuxrc lcd=S70
然后去掉FriendlyARM.cpio文件,照样顺畅挂载NFS根文件系统!哈哈!
4、对LCD的支持(Tiny6410的LCD的型号是S70)进入配置界面配置这几项:
Device Drivers ---> Graphics support ---> <*> Support for frame buffer devices ---> <*> Samsung S3C framebuffer support Console display driver support ---> <*> Framebuffer Console support [*] Bootup logo ---> [*] Standard -color Linux logo
这样配置后的内核,开机是屏幕会出现彩条而不是Linux的Logo,原因是内核自带的LCD驱动不支持S70,我们需要修改drviers/video/s3c-fb.c文件;但是内核驱动源码是何等的高大上,哪是我等菜鸟能修改得了的,所以我干脆将我跟着韦东山第二期LCD驱动教程写的驱动程序替换掉了这个s3c-fb.c文件,没想到竟然直接能用(让我欣喜一会),而且我挂载友善的文件系统是可以直接进入到Qt界面,只不过触摸功能没有用。有待进一步修改!
其实内核自带的LCD驱动能用,只不过我们得修改arch/arm/mach-64xx/mach-mini6410.c将这个数组的数值改成下面的数值(这些数值是参照友善官方的)
static struct s3c_fb_pd_win mini6410_fb_win[] = {
{
.win_mode = { // 7.0" 800x480
.left_margin = ,
.right_margin = ,
.upper_margin = ,
.lower_margin = ,
.hsync_len = ,
.vsync_len = , .xres = ,
.yres = ,
},
.max_bpp = ,
.default_bpp = ,
},
};
但是触摸功能还是不能用!
5、对USB的支持:(直接参照友善的)
在没有修改之前会启动内核时会出现错误:
s3c2410-ohci s3c2410-ohci: init err (00000000 0000)
ohci_hcd: can't start s3c24xx
s3c2410-ohci s3c2410-ohci: startup error -75
s3c2410-ohci s3c2410-ohci: USB bus 1 deregistered
s3c2410-ohci: probe of s3c2410-ohci failed with error -75
5.1修改arch/arm/mach-s3c64xx/mach-mini6410.c增加这个函数:
#ifdef CONFIG_USB_SUPPORT
/* Initializes OTG Phy. to output 48M clock */
void s3c_otg_phy_config(int enable) {
u32 val; if (enable) {
__raw_writel(0x0, S3C_PHYPWR); /* Power up */ val = __raw_readl(S3C_PHYCLK);
val &= ~S3C_PHYCLK_CLKSEL_MASK;
__raw_writel(val, S3C_PHYCLK); __raw_writel(0x1, S3C_RSTCON);
udelay();
__raw_writel(0x0, S3C_RSTCON); /* Finish the reset */
udelay();
} else {
__raw_writel(0x19, S3C_PHYPWR); /* Power down */
}
}
EXPORT_SYMBOL(s3c_otg_phy_config);
#endif
5.2修改drivers/usb/host/ohci-s3c2410.c
@@ -, +, @@ #define valid_port(idx) ((idx) == 1 || (idx) == 2) +#ifdef CONFIG_MACH_MINI6410
+extern void s3c_otg_phy_config(int enable);
+#endif
+
/* clock device associated with the hcd */ static struct clk *clk;
-static struct clk *usb_clk;
+static struct clk *otg_clk, *usb_clk; /* forward definitions */ @@ -, +, @@ dev_dbg(&dev->dev, "s3c2410_start_hc:\n"); + clk_enable(otg_clk);
+#ifdef CONFIG_MACH_MINI6410
+ s3c_otg_phy_config();
+#endif
+
clk_enable(usb_clk);
mdelay(); /* let the bus clock stabilise */ @@ -, +, @@ clk_disable(clk);
clk_disable(usb_clk);
+ clk_disable(otg_clk);
} @@ + +, @@ + otg_clk = clk_get(&dev->dev, "otg");
+ if (IS_ERR(otg_clk)) {
+ dev_err(&dev->dev, "cannot get otg clock\n");
+ retval = -ENOENT;
+ goto err_otg;
+ }
+
s3c2410_start_hc(dev, hcd); hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); @@ -, +, @@
err_ioremap:
s3c2410_stop_hc(dev);
iounmap(hcd->regs);
+
+ clk_put(otg_clk);
+
+ err_otg:
clk_put(usb_clk); err_clk:
6、对S3C_DEV_RTC的支持
RTC就是系统启动后会自动读取板子上的RTC时钟作为当前的系统时间,首先内核配置如下:
Device Drivers --->
<*> Real Time Clock --->
[*] Set system time from RTC on startup and resume
(rtc0) RTC used to set the system time
[*] /sys/class/rtc/rtcN (sysfs)
[*] /proc/driver/rtc (procfs for rtc0)
[*] /dev/rtcN (character devices)
<*> Samsung S3C series SoC RTC
在arch/arm/mach-s3c64xx/mach-mini6410.c文件的static struct platform_device *mini6410_devices[] __initdata数组中 加入一个&s3c_device_rtc,来申请一个platform_device资源,这样之后编译不会通过,提示找不到s3c_device_rtc函数, 找了半天原来是因为arch/arm/mach-s3c64xx目录下的Kconfig文件中没有将RTC驱动编译进内核,修改如下:
config MACH_MINI6410
bool "MINI6410"
select CPU_S3C6410
select S3C_DEV_HSMMC
select S3C_DEV_HSMMC1
select S3C64XX_SETUP_SDHCI
select S3C_DEV_USB_HOST
select S3C_DEV_NAND
select S3C_DEV_RTC
select S3C_DEV_FB
select S3C64XX_SETUP_FB_24BPP
select SAMSUNG_DEV_ADC
select SAMSUNG_DEV_TS
help
Machine support for the FriendlyARM MINI6410
加上红色的那一项,编译成功,并且可以读取RTC的时间!
注:通过NFS挂载内核和文件系统:
启动UBoot后:
//设置启动参数,注意这是一整行中间不能又换行符,并且空格也是严格规定的,不能随便加
set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=10.10.206.15:/root/nfs/roofs,proto=tcp ip=10.10.206.11:10.10.206.15:10.10.206.254:255.255.255.0:cxd:eth0:off init=/linuxrc lcd=S70
#save (保存启动参数到NandFlash中)
#nfs 0x50008000 10.10.206.15:/root/nfs/zImage(下载内核到0x50008000内存地址处)
#bootm (启动内核)
工欲善其事,必先利其器。好的开发环境会大大提高效率,呵呵!(用NFS挂载文件系统实在太方便了,哈哈!)
移植Linux2.6.38到Tiny6410_1GNandflash的更多相关文章
- 基于linux2.6.38.8内核启动过程完全解析[一]
转载: ************************************************************************************************ ...
- 移植linux-2.6.32.2到qq2440
编译该版本内核使用的编译器版本:arm-linux-gcc 3.4.1 1.获取linux-2.6.32.2 2.解压内核 3.切换到刚解压的内核目录下: cd linux-2.6.32.2 4.修改 ...
- FL2440移植Linux2.6.33.7内核
kernel version:2.6.33.7 /linux-2.6.33.7 OS:CentOS 6.4 cross-compilation chain:arm-linux-4.3.2 /usr/l ...
- hfrk2410_a1.1开发板移植linux-2.6.32.27--网卡篇(cs8900)
硬件:恒丰锐科开发板hfrk2410_A1.1 软件:linux-2.6.32.27 cs8900网卡移植: 将cs8900驱动源代码文件拷贝至drivers/net/,修改drivers/net/K ...
- linux-2.6.38 IIC驱动框架分析
在linux-2.6内核中,IIC的驱动程序可以大概分为三部分: (1)IIC核心代码:/drivers/i2c/i2c-core.c IIC核心提供了IIC总线驱动和设备驱动的注册.注销方法和IIC ...
- 基于linux2.6.38.8内核zImage文件的自解压详解
转载:http://blog.csdn.net/wavemcu/article/details/7270439 ******************************************** ...
- 记录tiny6410 jlink 命令行调试linux-2.6.38内核
1\首先启动nandflash uboot->linux内核->文件系统,进入文件系统命令行 2\启动JLinkGDBServer -device ARM11 3\启动arm-none-e ...
- linux-2.6.38 input子系统(用输入子系统实现按键操作)
一.设备驱动程序 在上一篇随笔中已经分析,linux输入子系统分为设备驱动层.核心层和事件层.要利用linux内核中自带的输入子系统实现一个某个设备的操作,我们一般只需要完成驱动层的程序即可,核心层和 ...
- linux-2.6.38 input子系统(简析)
一.输入子系统简介 引入输入子系统这种机制可以对不同的输入设备进行管理.各种输入设备如:鼠标.键盘.触摸屏等有一套相同的处理机制,输入子系统将其共性提取出来, 对于驱动开发人员只用实现其差异即可,实现 ...
随机推荐
- Flume的安装,配置及使用
1,上传jar包 2,解压 3,改名 4,更改配置文件 将template文件重镜像 root@Ubuntu-1:/usr/local/apache-flume/conf# cat flume-env ...
- BZOJ 4527: K-D-Sequence
4527: K-D-Sequence Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 163 Solved: 66[Submit][Status][D ...
- 【bzoj1096-仓库建设】斜率优化
dsy1096: [ZJOI2007]仓库建设 [问题描述] L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚. 由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品 ...
- codechef T3 计算器
CALC: 计算器题目描述 大厨有一个计算器,计算器上有两个屏幕和两个按钮.初始时每个屏幕上显示的都是 0.没按 一次第一个按钮,就会让第一个屏幕上显示的数字加 1,同时消耗 1 单位的能量. 每按一 ...
- 单源最短路模板_SPFA_Dijkstra(堆优化)_C++
随手一打就是标准的SPFA,默认1号节点为出发点,当然不用 f 判断是否在队里也可以,只是这样更优化一点 void spfa() { int i,x,k; ;i<=n;i++) { d[i]=o ...
- 美团网技术团队分享的MySQL索引及慢查询优化教程
MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位 ...
- c 語言 控制碼
source code #include <stdio.h> int main() { char *test = "ABC\x41\n"; printf("s ...
- python实战===一行代码就能搞定的事情!
打印9*9乘法表: >>> print( '\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) ...
- Javascript制作放大镜
方法一 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- 如何在xcode中启用xib方式做应用
使用storybord的好处和缺点这里不一一说,但是很多人可能习惯xib的方式进行应用的开发. 在xcode环境下可参考如下链接进行设定. http://codefromabove.com/2014/ ...