开发板编译内核
‘壹’ 如何配置编译在mini2440开发板上运行的linux内核
参考:http://www.it165.net/os/html/201409/9334.html
系统ubuntu12.04(非虚拟机下)
mini2440
CPU型号: S3C2440AL-40
Nanflash型号:K9F1G08
Norflash型号:SST39VF1601
LCD: 统宝 240 x 320
$: 普通账户
#:root账户
*当shell下输入路径时可使用tab键自动补全
(一)建立交叉编译环境
1.将mini2440光盘中的linux文件夹拷贝到 /home/lianghuiyong 并改名为Linux_share
(其中两个文档为我后面添加进去的)
2.Ctrl+Alt+T打开shell
3.$ su - root (切换root权限)
4.# cd /home/lianghuiyong/Linux_share
5.解压安装arm-linux-gcc编辑器
# tar xvzf arm-linux-gcc-4.4.3.tar.gz –C / //注意:C后面有个空格
执行该命令,将把 arm-linux-gcc 安装到/usr/loca/arm/4.4.3 目录。这句来自mini2440用户手册,我发现其实是安装到 /opt/FriendlyARM/toolchain/4.4.3 目录
6.# vim /root/.bashrc
7.在最后一行添加:export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin //opt/FriendlyARM/toolschain/4.4.3/bin 为arm-linux-gcc 环境变量
:wq保存退出。
# source ~/.bashrc
8.# sudo gedit /etc/environment
games后面添加标记部分
9.# arm-linux-gcc -v //gcc后面有空格
测试hello.c(这是在安装了第二部分的linux示例程序才有examples/hello目录)
# cd /opt/FriendlyARM/mini2440/examples/hello
# arm-linux-gcc -o hello hello.c
# ./hello
(二)安装源代码及其他工具
创建工作目录(以下都为root环境下):
# mkdir -p /opt/FriendlyARM/mini2440
1>>解压安装linux内核源代码
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/linux-2.6.32.2-mini2440-20100106.tar.gz
2>>解压安装嵌入式图形系统qtopia源代码
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/x86-qtopia.tgz
# tar xvzf /home/lianghuiyong/Linux_share/arm-qtopia.tgz
3>>解压安装嵌入式图形系统 QtE-4.6.1 源代码
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/arm-qte-4.6.3-20100802.tar.gz
4>>解压安装busybox 源代码
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/busybox-1.13.3-mini2440.tgz
5>>解压安装 Linux 示例程序
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/examples-20100108.tgz
6>>解压安装 vboot 源代码
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/vboot-src-20100106.tar.gz
7>>解压安装 bootloader 源代码
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/bootloader.tgz
8>>解压创建目标文件系统
# cd /opt/FriendlyARM/mini2440
#tar xvzf /home/lianghuiyong/Linux_share/rootfs_qtopia_qt4-20100816.tar.gz
9>>解压安装目标文件系统映象制作工具 mkyaffs2image
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/mkyaffs2image.tgz –C /
10>>解压安装LogoMaker
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/logomaker.tgz –C /
(三)定制linux内核及制作文件系统
config_mini2440_x35 – 适用于 Sony 3.5” LCD 的内核配置文件
config_mini2440_t35 – 适用于统宝 3.5” LCD 的内核配置文件
config_mini2440_l80 – 适用于 Sharp 8” LCD(或兼容)的内核配置文件
config_mini2440_n35 – 适用于 NEC3.5” LCD 的内核配置文件
config_mini2440_h43 – 适用于 4.3” LCD 的内核配置文件
config_mini2440_a70 – 适用于群创 7” LCD 的内核配置文件
config_mini2440_vga1024x768 – 适用于 VGA 显示输出(分辨率 1024x768)模块的内核
配置文件
1.配置缺省文件config_t35 (统宝240x320)
# cd /opt/FriendlyARM/mini2440/linux-2.6.32.2
# cp config_mini2440_t35 .config
# make menuconfig
出现界面
不做更改,exit退出。这样做是为了生成相应配置(统宝240x320)的头文件。
2.编译内核
在/opt/FriendlyARM/mini2440/linux-2.6.32.2 目录下编译内核
#make zImage
编译结束后,会在 arch/arm/boot 目录下生成 linux 内核映象文件:zImage(zImage 可下载到开发板测试)
3.定制linux内核(根据用户手册来走一遍)
# cd /opt/FriendlyARM/mini2440/linux-2.6.32.2
# make menuconfig
出现配置选项:
3.1配置cpu
主菜单-->System --> Type S3C2400 Machines --> FriendlyARM Mini2440 development board
3.2配置lcd驱动
主菜单-->Device Drivers-->Graphics support-->Support for frame buffer devices-->Backlight-->LCD select-->3.5 inch 240x320 Toppoly LCD
3.3配置触摸屏
主菜单-->Device Drivers-->Input device support-->Touchscreens-->Samsung s3c24410 touchscreen input driver
3.4配置usb鼠标和键盘
主菜单-->Device Drivers-->hid devices-->USB Human interface Device
3.5 配置优盘
主菜单-->Device Drivers-->SCSI device support--> SCSI disk
3.6配置万能驱动USB摄像头
主菜单-->Device Drivers-->Multimedia devices-->Video capture adapters -->V4L USB devices-->GSPCA based webcams-->ALi USB m 5602 Camera Driver
3.7 配置CMOS摄像头驱动
主菜单-->Device Drivers-->Multimedia devices-->Video capture adapters-->OV9650 on the s3c2440 driver
3.8配置网卡驱动
主菜单-->Netwoking support-->Networking options -->选择Unix和TCP/IP
主菜单-->Device Drivers-->Network device support-->Ethernet (10 or 100Mbit)-->
选择 <*> Generic Media Independent Interface device support
<*> DM9000 support
3.9 配置USB无线网卡驱动
主菜单-->Netwoking support-->wireless-->IEEE 802.11
主菜单-->Device Drivers-->Netwoking device support-->wireless LAN-->Wireless LAN(IEEE 802.11)-->Ralink driver support-->
3.10 配置音频驱动
主菜单-->Device Drivers-->Sound card supprt-->OSS Mixer API -->ALSA for Soc audio support-->SoC Audio for the samsung S3Cxxxx Chips
3.11 配置SD/MMC卡驱动
主菜单-->Device Drivers-->MMC/SD/SDIO card-->samsung S3C SD/MMC card
3.12 配置看门狗驱动支持
主菜单-->Device Drivers-->Watchdog Timer-->s3c2440 Watchdog
3.13 配置LED驱动
主菜单-->Device Drivers-->Character devices-->LED support for Mini2440
3.14 配置按键驱动
主菜单-->Device Drivers-->Character devices-->Buttons driver
3.15 配置PWM控制蜂鸣器驱动
主菜单-->Device Drivers-->Character devices-->buzzer driver for
3.16 配置AD转换驱动
主菜单-->Device Drivers-->Character devices-->ADC driver for
3.17 配置串口驱动
主菜单-->Device Drivers-->Character devices-->Serial drivers-->samsung S3C2440/S3C2442
3.18 如何配置RTC实时时钟驱动
主菜单-->Device Drivers-->Real Time Clock-->samsung S3C series SoC RTC
3.19 配置I2C-EEPROM驱动支持
主菜单-->Device Drivers-->I2C support -->I2C Hardware Bus support-->S3C2410 I2C Driver
3.20 配置yaff2s文件系统的支持
主菜单-->Device Drivers-->MTD-->NAND Device Support -->NAND FLASH Support
主菜单-->File systems-->Miscellaneous filesystems -->YAFFS2 file system support
3.21 配置EXT2/VFAT/ NFS等文件系统
主菜单-->File systems-->Network File Systems -->root file system on NFS
为了支持FAT32 文件系统.
主菜单-->File systems-->DOS/FAT/NT Filesystems -->VFAT (windows-95) fs support
关于mini2440 linux内核裁剪到此为止,退出后有一个是否保存提示,选择保存!
3.22 制作Linux logo
本来想使用Logomaker,结果生成的图片都是无数据的,这可能和系统内一些参数有关
使用命令方式制作logo:
在图片(open_show.png)目录下
# pngtopnm open_show.png > temp.ppm
# ppmquant 224 temp.ppm >temp2.ppm
# pnmnoraw temp2.ppm > logo.ppm
将目录下生成的logo.ppm改成linux_logo_clut224.ppm,替代linux2.6.32.2/drivers/video/logo 目录下的同名文件
‘贰’ arm开发板为什么都要自己去编译linux内核
编译内核可以定制,把需要的编译进去,但是新手学的时候就直接全部编译了,也没人具体讲原理。你先不用急。
‘叁’ 在RedHat9.0(2.4内核)操作系统下怎样为开发板编译2.6驱动模块
可以,你把环境搭建好就可以编译大部分。
makefile中指定好平台。如果本身驱动不在kernel代码树里,把内核的代码头文件等等手动设定好,如果驱动用到其他库或代码也手动指定好,不要让编译器自动搜索本机环境。
还要查阅下文档,有些代码可能压根就没有为交叉编译而特别编写,这类代码的交叉编译需要你打patch、重写makefile
‘肆’ 为什么要编译linux内核(beaglebone的开发板)
1、头文件不能用,就是说编译器找不到,要么是头文件的位置不对,要么是根本没有所需要的头文件;比如#include<linux/gpio.h>,那就是在你的linux源码目录中的include/linux/目录下要有gpio.h这个文件,如果没有,自然就编译通不过了。
2、你所说的光盘资料source文件夹,因为我也没有你的光盘,所以无法确定它的内容到底是不是内核,makefile文件是编译器所需要的依赖关系文件,config文件就不清楚了,如果是kconfig文件,那就是内核的配置文件。
‘伍’ 如何在2416开发板WINCE6.0上编译内核
初次看你的题目,感觉有矛盾,但一想,还行,首先,你开发板已经有了wince系统,也就是说内核都是在的,然后你想重新编译内核的话,只有在电脑上将内核编译好了之后再烧到板子上,
‘陆’ 编译内核模块常见有关问题怎么解决
第一次把自己编译的驱动模块加载进开发板,就出现问题,还好没花费多长时间,下面列举出现的问题及解决方案
1:出现insmod: error inserting 'hello.ko': -1 Invalid mole format
法一(网上的):是因为内核模块生成的环境与运行的环境不一致,用linux-2.6.27内核源代码生成的模块,可能就不能在linux-2.6.32.2内核的linux环境下加载,需要在linux-2.6.27内核的linux环境下加载。
a.执行 uname -r //查看内核版本
b.一般出错信息被记录在文件/var/log/messages中,执行下面命令看错误信息
# cat /var/log/messages |tail
若出现类似下面:
Jun 4 22:07:54 localhost kernel:hello: version magic '2.6.35.6-45.fc14.i686.PAE
' should be '2.6.35.13-92.fc14.i686.PAE'
则把 Makefile里的KDIR :=/lib/moles/2.6.35.6-45.fc14.i686.PAE/build1 改为
KDIR :=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1 //改成自己内核源码路径
(这里的build1是一个文件链接,链接到/usr/src/kernels/2.6.35.6-45.fc14.i686.PAE和13-92的)
然并卵,我的fedora 14 /usr/src/kernels下并没有2.6.35.13-92.fc14.i686.PAE,只有2.6.35.13-92.fc14.i686,虽然不知道两者有什么区别,但改成2.6.35.13-92.fc14.i686还是不行,照样这个问题,还好后来在看教学视频的到启发
法二:改的还是那个位置
KDIR :=/opt/FriendlyARM/linux-2.6.32.2 //把这里改成你编译生成kernel的那个路径
all:
$ (MAKE) -C $ (KDIR) M = $ (PWD) moles ARCH=arm CROSS_COMPILE=arm-linux- //加这句
2. [70685.298483] hello: mole license 'unspecified' taints kernel.
[70685.298673] Disabling lock debugging e to kernel taint
方法:在模块程序中加入: MODULE_LICENSE("GPL");
3. rmmod: chdir(2.6.32.2-FriendlyARM): No such file or directory 错误解决
方法:lsmod 可查看模块信息
即无法删除对应的模块。
就是必须在/lib/moles下建立错误提示的对应的目录((2.6.32.2)即可。
必须创建/lib/moles/2.6.32.2这样一个空目录,否则不能卸载ko模块.
# rmmod nls_cp936
rmmod: chdir(/lib/moles): No such file or directory
但是这样倒是可以卸载nls_cp936,不过会一直有这样一个提示:
rmmod: mole 'nls_cp936' not found
初步发现,原来这是编译kernel时使用make moles_install生成的一个目录,
但是经测试得知,rmmod: mole 'nls_cp936' not found来自于busybox,并不是来自kernel
1).创建/lib/moles/2.6.32.2空目录
2).使用如下源码生成rmmod命令,就可以没有任何提示的卸载ko模块了[luther.gliethttp]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
const char *modname = argv[1];
int ret = -1;
int maxtry = 10;
while (maxtry-- > 0) {
ret = delete_mole(modname, O_NONBLOCK | O_EXCL);//系统调用sys_delete_mole
if (ret < 0 && errno == EAGAIN)
usleep(500000);
else
break;
}
if (ret != 0)
printf("Unable to unload driver mole \"%s\": %s\n",
modname, strerror(errno));
}
3).把生成的命令复制到文件系统
# arm-linux-gcc -static -o rmmod rmmod.c
# arm-linux-strip -s rmmod
# cp rmmod /nfs/
cp /nfs/rmmod /sbin
代码如下:
proc.c
[html] view plain
<span style="font-size:18px;">#include <linux/mole.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h> /* Necessary because we use the proc fs */
#define procfs_name "proctest"
MODULE_LICENSE("GPL");
struct proc_dir_entry *Our_Proc_File;
int procfile_read(char *buffer,char **buffer_location,off_t offset, int buffer_length, int *eof, void *data)
{ int ret;
ret = sprintf(buffer, "HelloWorld!\n");
return ret;
}
int proc_init()
{ Our_Proc_File = create_proc_entry(procfs_name, 0644, NULL);
if (Our_Proc_File == NULL) {
remove_proc_entry(procfs_name, NULL);
printk(KERN_ALERT "Error: Could not initialize /proc/%s\n",procfs_name);
return -ENOMEM; }
Our_Proc_File->read_proc = procfile_read;//
// Our_Proc_File->owner = THIS_MODULE;
Our_Proc_File->mode = S_IFREG | S_IRUGO;
Our_Proc_File->uid = 0;
Our_Proc_File->gid = 0;
Our_Proc_File->size = 37;
printk("/proc/%s created\n", procfs_name);
return 0;
}
void proc_exit()
{ remove_proc_entry(procfs_name, NULL);
printk(KERN_INFO "/proc/%s removed\n", procfs_name);
}
mole_init(proc_init);
mole_exit(proc_exit);</span></span></span></span></span>
[html] view plain
<span style="font-size:18px;">
ifneq ($(KERNELRELEASE),)
obj-m :=proc.o
else
KDIR :=/opt/FriendlyARM/linux-2.6.32.2
#KDIR :=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1
PWD :=$(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) moles ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif</span></span></span></span></span>
make后生成proc.ko,再在开发板上insmod proc.ko即可
执行 dmesg 就可以看到 产生的内核信息啦
‘柒’ 友坚s3c6410开发板,内核配置选择4.3寸屏的时候,编译出错。选其他屏比如7寸屏可以编译通过。
如果文件都在,Kconfig也有配置,那基本就是make menuconfig时候没有开samsung s3cfb_UT_LDC43C_D 驱动了。