1. 安装ltib
进入bsp3目录,普通用户来运行./install,根据提示修改该普通用户的权限。
2. 进入ltib安装目录,以root用户运行./ltib -m prep -p u-boot 和 ./ltib -m prep -p busybox来解压u-boot和busybox的源码包。
3. 进入ltib安装目录,以root用户执行./ltib -c来配置并编译linux内核,文件系统,u-boot,dtb目标文件。
4. dts修改
位置:<ltib>/rpm/BUILD/linux-2.6.24/arch/powerpc/boot/dts/mpc8315erdb_default.dts
将无关的设备去掉。
5. u-boot修改
(1) <ltib>/rpm/BUILD/u-boot-1.2.0/lib_ppc/board.c
91, 796, 797, 798
(2) <ltib>/rpm/BUILD/u-boot-1.2.0/include/configs/mpc8315erdb.h
646, 650, 680
6. 硬盘插拔后设备检测
(1) 插拔时输出信息,<linux>/drivers/scsi/sd.c
1672, 1789
printk("probe: %s\n", gd->disk_name);
printk("shutdown: %s\n", sdkp->disk->disk_name);
(2) 修改recover等待时间,<linux>/drivers/ata/libata-eh.c
2610
msleep(500);
7. 自动登录root用户(busybox-1.1.3)
(1) <busybox>/loginutils/getty.c
773-841改成:
// 原内容在本文件 复件
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
do_prompt(op, tp);
strcpy(logname, "root");
fputs(logname, stdout);
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
(2) <busybox>/libbb/bb_askpass.c
57-68改成:
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
safe_strncpy(passwd, "root", PWD_BUFFER_SIZE);
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
(3) 不用改
"Password: " <busybox>/libbb/bb_askpass.c 43
"mpc8315erdb login: " <busybox>/loginutils/getty.c 776
"login[814]: root login on 'console'" <busybox>/loginutils/login.c 273
8. 将编译好的程序放在<ltib>/rootfs中。
9. 开机自动运行程序
修改 登陆后 会执行的脚本:<ltib>/rootfs/etc/profile
10. 去掉Board即PCIE检测
<u-boot>/lib_ppc/board.c
323, 647, 925
11. tftp配置
netstat -a | grep tftp
rpm -ivh tftp-server-.....rpm
vi /etc/xinetd.d/tftp
mkdir /tftp
chmod 777 /tftp
service xinetd restart
12. ltib编译模块
./ltib -m shell
cd <linux>/drivers/2_play
make ARCH=ppc
13. 烧写地址
(1) tftp烧写
u-boot fe000000 - fe07ffff 512K
rootfs fe080000 - fe57ffff 5M
uImage fe580000 - fe77ffff 2M
dtb fe780000 - fe7fffff 512K
命令:
tftp 1000000 u-boot.bin
protect off all
erase fe000000 fe07ffff
cp.b 1000000 fe000000 $filesize
(2) 仿真器烧写
u-boot ff80000 - ff87ffff 512K
rootfs ff880000 - ffd7ffff 5M
uImage ffd80000 - fff7ffff 2M
dtb fff80000 - ffffffff 512K
14. find用法
find <linux>/include -type f -name "*.h" | xargs grep "strings"
15. rtc问题
rtc-ds1307: probe of 0-0068 failed with error -5
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
硬件问题(电源)。
16. 内核配置之rtc
选中:Device Drivers -> I2C support -> I2C Hardware Bus support -> MPC107/824x/85xx/52xx/86xx
不选:Device Drivers -> I2C support -> Real Time Clock -> Test driver/device
17. 主、从盘区分
(1) 文件<linux>/drivers/ata/sata_fsl.c中,在函数static irqreturn_t sata_fsl_interrupt(int irq, void *dev_instance)之前加入:
int gzliu_irq = 0;
然后在函数static irqreturn_t sata_fsl_interrupt(int irq, void *dev_instance)中,添加:
gzliu_irq = irq;
(2) 文件<linux>/drivers/scsi/sd.c中,在函数static int sd_probe(struct device *dev)之前加入:
extern int gzliu_irq;
struct gzliu_sd
{
int port;
char name[10];
}gzliu_sd_list[2];
int gzliu_idx = 0;
int gzliu_sd_num = 0;
然后在函数static int sd_probe(struct device *dev)中加入:
if (gzliu_irq == 44)
{
gzliu_sd_list[gzliu_sd_num].port = 1;
sprintf(gzliu_sd_list[gzliu_sd_num].name, "/dev/%s", gd->disk_name);
gzliu_sd_num++;
}
else
{
gzliu_sd_list[gzliu_sd_num].port = 2;
sprintf(gzliu_sd_list[gzliu_sd_num].name, "/dev/%s", gd->disk_name);
gzliu_sd_num++;
}
printk("******************************\n");
for (gzliu_idx=0; gzliu_idx<gzliu_sd_num; gzliu_idx++)
{
printk("port: %d, sd_name: %s\n", gzliu_sd_list[gzliu_idx].port, gzliu_sd_list[gzliu_idx].name);
}
printk("probe: %s\n", gd->disk_name);
printk("******************************\n");
然后在函数static void sd_shutdown(struct device *dev)中加入:
char tmp[20];
if (gzliu_sd_num == 1)
{
gzliu_sd_num = 0;
}
else
{
sprintf(tmp, "/dev/%s", sdkp->disk->disk_name);
if (strcmp(gzliu_sd_list[0].name, tmp) == 0)
{
sprintf(gzliu_sd_list[0].name, "%s", gzliu_sd_list[1].name);
gzliu_sd_list[0].port = gzliu_sd_list[1].port;
gzliu_sd_num--;
}
else
{
gzliu_sd_num--;
}
}
printk("******************************\n");
for (gzliu_idx=0; gzliu_idx<gzliu_sd_num; gzliu_idx++)
{
printk("port: %d, sd_name: %s\n", gzliu_sd_list[gzliu_idx].port, gzliu_sd_list[gzliu_idx].name);
}
printk("shutdown: %s\n", sdkp->disk->disk_name);
printk("******************************\n");
(3) 获取硬盘端口与其对应的设备节点
驱动程序lbc_sd_port.c,放在<linux>/drivers/0_sd_port中,修改drivers下的Kconfig和Makefile:
在Kconfig中添加:source "drivers/0_sd_port/Kconfig"
在Makefile中添加:obj-y += 0_sd_port/
将驱动编译入内核
18. 主设备号
lbc_record.ko 240
lbc_sd_port 241
lbc_play.ko 242
eeprom.c 243
19. 问题:
write() can't write enough data, line 811, file record_timing.c
write() can't write enough data, line 811, file record_timing.c
write() can't write enough data, line 811, file record_timing.c
write() can't write enough data, line 811, file record_timing.c
write() can't write enough data, line 811, file record_timing.c
原因:mnt_dir目录问题
20. 自动登录root用户(busybox-1.19.3)
(1) <busybox>/loginutils/getty.c
行458 - 507改成:
sprintf(bp, "root");
(2) <busybox>/libbb/bb_askpass.c
59 - 78改成:
sprintf(ret, "root");