8315总结记录


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修改

位置:/rpm/BUILD/linux-2.6.24/arch/powerpc/boot/dts/mpc8315erdb_default.dts

将无关的设备去掉。

5. u-boot修改

(1) /rpm/BUILD/u-boot-1.2.0/lib_ppc/board.c

91, 796, 797, 798

(2) /rpm/BUILD/u-boot-1.2.0/include/configs/mpc8315erdb.h

646, 650, 680

6. 硬盘插拔后设备检测

(1) 插拔时输出信息,/drivers/scsi/sd.c

1672, 1789

printk("probe: %s\n", gd->disk_name);

printk("shutdown: %s\n", sdkp->disk->disk_name);

(2) 修改recover等待时间,/drivers/ata/libata-eh.c

2610

msleep(500);

7. 自动登录root用户(busybox-1.1.3)

(1) /loginutils/getty.c

773-841改成:

        // 原内容在本文件 复件
        /
        /
        do_prompt(op, tp);
        
        strcpy(logname, "root");
        fputs(logname, stdout);
        /
        /

(2) /libbb/bb_askpass.c

57-68改成:

        /
        /

        safe_strncpy(passwd, "root", PWD_BUFFER_SIZE);

        /
        /

(3) 不用改

"Password: "  /libbb/bb_askpass.c   43

"mpc8315erdb login: "    /loginutils/getty.c     776

"login[814]: root login on 'console'"     /loginutils/login.c    273

8. 将编译好的程序放在/rootfs中。

9. 开机自动运行程序

修改 登陆后 会执行的脚本:/rootfs/etc/profile

10. 去掉Board即PCIE检测

/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 /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 /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) 文件/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) 文件/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     {
        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     {
        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,放在/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

lbc_rtc.ko 250

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) /loginutils/getty.c

行458 - 507改成:

sprintf(bp, "root");

(2) /libbb/bb_askpass.c

59 - 78改成:

sprintf(ret, "root");

你可能感兴趣的:(知识总结)