TQ2440移植概略

    科技2022-07-13  128

    TQ2440移植概略

    一、原料二、开发环境VMware不能实现拖动复制粘贴功能:Samba共享NFSlinux编译环境 三、u-bootboard.cfgarch/arm/config.mkarch/arm/cpu/u-boot.ldsarch/arm/cpu/arm920t/start.s环境变量常用命令cmdline常用参数 四、kernelMAKEFILEarch.arm/mach-s3c24xx/common-smdk.carch.arm/mach-s3c24xx/mach-smdk2440.cdrivers/dma/s3c24xx-dma.cdrivers/rtc/rtc-s3c.cdrivers/rtc/hctosys.c减少dev目录下pty和tty数量cat /etc/init.d/rcS 五、tslib使用

    一、原料

    u-boot-2012.04.01 (toolchain: 4.3.2) linux-4.19 (toolchain: gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi) tslib-1.4.tar.gz (toolchain: 4.3.2) fs使用韦东山视频教程:fs_mini_mdev_new.jffs2 tftp工具

    链接:https://pan.baidu.com/s/1RmFznkuIjoNnBoVhqdNWUA 提取码:uhyl 复制这段内容后打开百度网盘手机App,操作更方便哦

    二、开发环境

    VMware不能实现拖动复制粘贴功能:

    sudo apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools sudo apt-get install open-vm-tools-desktop

    Samba共享

    1.安装 sudo apt-get install nfs-kernel-server 2.创建samba账户,win才可以访问 3.linux(ubuntu)下的64位编译器编译32位程序 https://blog.csdn.net/yingjie79613/article/details/79068005

    NFS

    https://www.cnblogs.com/hicjiajia/archive/2012/07/09/2583632.html sudo apt-get install nfs-common sudo apt-get install nfs-kernel-server vim /etc/exports /work/share/ *(rw,sync,no_subtree_check) /etc/init.d/nfs-kernel-server restart mount -t nfs -o nolock 192.168.1.21:/work/share /mnt umount /mnt

    linux编译环境

    apt-get install bison apt-get install flex sudo apt-get install libncurses5-dev

    三、u-boot

    命令说明export PATH="$PATH:/work/compiler/4.3.2/bin"指定工具链echo $PATH查看工具链make O=./out distclean清除编译make O=./out tq2440_config配置工程make O=./out all编译cp ./out/u-boot.bin /work/share/复制到tftp共享文件夹arm-linux-objdump -D out/u-boot > out/u-boot.dis反汇编tftp 0x32000000 u-boot.bin;go 0x32000000tftp下载到内存,运行

    board.cfg

    tq2440 arm 920t - samsung s3c24x0

    arch/arm/config.mk

    #LDFLAGS_u-boot += -pie // 取消相对位置编译

    arch/arm/cpu/u-boot.lds

    .text : { __image_copy_start = .; CPUDIR/start.o (.text) board/samsung/tq2440/libtq2440.o (.text) *(.text) }

    arch/arm/cpu/arm920t/start.s

    去掉宏:CONFIG_SKIP_LOWLEVEL_INIT Norflash和Nandflash驱动地址都是0,只有在内存调试时从SDRAM启动地址为非0,所以可以通过对__start运行时地址的判断来决定是否跳过内存初始化。 #if 1//!defined(CONFIG_SKIP_LOWLEVEL_INIT) adr r0, _start cmp r0, #0 bleq lowlevel_init//cpu_init_crit #endif adr r0, _start 得到的是_start的当前执行位置,由 pc+offset 决定的 得到有效地址 ldr r0, =_start 得到的是绝对的地址,链接时决定; relocate /*Relocate*/ adr r0, _start ldr r1, _TEXT_BASE ldr r2, _armboot_start ldr r3, _bss_start sub r2, r3, r2 bl relocate /* r0: source, r1: dest, r2: size */ DECLARE_GLOBAL_BOOTFLAG; void relocate(int *ptr_src, int *ptr_dst, int size) { int bootflag = 0; //if (((ulong)ptr_src >= CONFIG_SYS_SDRAM_BASE) && ((ulong)ptr_src <= CONFIG_SYS_TEXT_BASE)) if (0 != ptr_src) {// ram bootflag = 0; } else { bootflag = isBootFromNorFlash() ? 1 : 2; } if (bootflag <= 1) {//RAM or Nor int i = 0; size += 3; size >>= 2; for (i = 0; i < size; i++) { ptr_dst[i] = ptr_src[i]; } } else {// Nand nand_init_ll(); nand_read_ll(ptr_src, ptr_dst, size); } BootFlag = bootflag; }

    环境变量

    TQ2440# print baudrate=115200 bootargs=console=ttySAC0,115200 root=/dev/mtdblock5 rootfstype=jffs2 ip=192.168.1.10:192.168.1.21:192.168.1.1:255.255.255.0::eth0:off bootcmd=nand read 30000000 kernel;bootm 30000000 bootdelay=2 ethact=dm9000 ethaddr=00:0c:29:4d:e4:f4 gatewayip=192.168.1.1 ipaddr=192.168.1.10 mtddevname=u-boot mtddevnum=0 mtdids=nand0=tq2440-0 mtdparts=mtdparts=tq2440-0:256k(u-boot),128k(params),128k(dts),256k(logo),4m(kernel),-(rootfs) netmask=255.255.255.0 partition=nand0,0 serverip=192.168.1.20 stderr=serial stdin=serial stdout=serial Environment size: 580/131068 bytes

    常用命令

    // 烧写fs tftp 30000000 fs_mini_mdev.jffs2 nand erase.part rootfs nand write.jffs2 30000000 0x00260000 5b89a8 // 设置环境变量 set bootargs console=tty0 console=ttySAC0,115200 root=/dev/mtdblock5 rootfstype=jffs2

    cmdline常用参数

    https://blog.csdn.net/oqqHuTu12345678/article/details/71172672

    四、kernel

    命令说明make O=./out/ distclean清除编译make O=./out/ tq2440_defconfig配置工程make O=./out/ uImage V=1编译cp ./out/arch/arm/boot/uImage /work/share/复制到tftp共享文件夹tftp 30000000 uImage;bootm 30000000下载到内存;运行内核

    MAKEFILE

    配置工具链

    ARCH ?= arm CROSS_COMPILE ?= /work/compiler/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-

    arch.arm/mach-s3c24xx/common-smdk.c

    配置分区

    static struct mtd_partition smdk_default_nand_part[] = { [0] = { .name = "u-boot", .offset = 0, .size = SZ_256K, }, [1] = { .name = "params", .offset = SZ_256K, .size = SZ_128K, }, [2] = { .name = "dts", .offset = SZ_256K+SZ_128K, .size = SZ_128K, }, [3] = { .name = "logo", .offset = SZ_256K+SZ_128K+SZ_128K, .size = SZ_256K, }, [4] = { .name = "kernel", .offset = SZ_256K+SZ_128K+SZ_128K+SZ_256K, .size = SZ_4M, }, [5] = { .name = "rootfs", .offset = SZ_256K+SZ_128K+SZ_128K+SZ_256K+SZ_4M, .size = MTDPART_SIZ_FULL, }, };

    arch.arm/mach-s3c24xx/mach-smdk2440.c

    配置系统时钟

    static void __init smdk2440_init_time(void) { s3c2440_init_clocks(/*16934400*/12000000); samsung_timer_init(); }

    lcd参数

    static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = { .type = S3C2410_LCDCON1_TFT, .width = 320, .height = 240, .xres = 320, .yres = 240, .bpp = 16, .pixclock = 80000, /* HCLK 100 MHz, divisor 3 */ #if 1 .left_margin = 28, /* for HFPD*/ .right_margin = 24, /* for HBPD*/ .hsync_len = 42, /* for HSPW*/ .upper_margin = 6, /* for VBPD*/ .lower_margin = 2, /* for VFPD*/ .vsync_len = 12, /* for VSPW*/ #else .left_margin = 32, /* for HFPD*/ .right_margin = 22, /* for HBPD*/ .hsync_len = 45, /* for HSPW*/ .upper_margin = 13, /* for VBPD*/ .lower_margin = 5, /* for VFPD*/ .vsync_len = 6, /* for VSPW*/ #endif .lcdcon5 = S3C2410_LCDCON5_FRM565 \ | S3C2410_LCDCON5_INVVLINE \ | S3C2410_LCDCON5_INVVFRAME \ | S3C2410_LCDCON5_PWREN \ | S3C2410_LCDCON5_HWSWP, };

    drivers/dma/s3c24xx-dma.c

    bug

    static int s3c24xx_dma_probe(struct platform_device *pdev) { ... s3cdma->slave.filter.map = pdata->slave_map; s3cdma->slave.filter.mapcnt = pdata->slavecnt; s3cdma->slave.filter.fn = s3c24xx_dma_filter; s3cdma->slave.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); ... }

    drivers/rtc/rtc-s3c.c

    bug

    static int s3c_rtc_probe(struct platform_device *pdev) { ... info->dev = &pdev->dev; //info->data = s3c_rtc_get_data(pdev); info->data = platform_get_device_id(pdev)->driver_data; if (!info->data) { dev_err(&pdev->dev, "failed getting s3c_rtc_data\n"); return -EINVAL; } }

    drivers/rtc/hctosys.c

    static int __init rtc_hctosys(void) { ... #if 1 { int retries = 0; for (retries=0; retries<3; retries++) { err = rtc_read_time(rtc, &tm); if (0 == err) { /*dev_info(rtc->dev.parent, "rtc_read_time " "%d-d-d d:d:d UTC (%lld)\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, (long long) tv64.tv_sec);*/ dev_info(rtc->dev.parent, "rtc_read_time success!\n"); break; } else { dev_err(rtc->dev.parent, "rtc_read_time failed!\n"); tm.tm_year = 120; tm.tm_mon = 0; tm.tm_mday = 1; tm.tm_wday = 3; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; if (rtc_set_time(rtc, &tm)) { dev_err(rtc->dev.parent, "rtc_set_time failed!\n"); goto err_read; } } } if (retries >= 3) { dev_err(rtc->dev.parent, "hctosys: unable to read the hardware clock\n"); goto err_read; } } #else err = rtc_read_time(rtc, &tm); if (err) { dev_err(rtc->dev.parent, "hctosys: unable to read the hardware clock\n"); goto err_read; } #endif }

    减少dev目录下pty和tty数量

    CONFIG_BLK_DEV_RAM_COUNT=8 CONFIG_LEGACY_PTY_COUNT=8 #define MAX_NR_CONSOLES 7

    cat /etc/init.d/rcS

    #!/bin/sh #ifconfig eth0 192.168.1.17 mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s echo 1 > /sys/class/leds/backlight/brightness echo 0 > /sys/devices/virtual/graphics/fbcon/cursor_blink mount -t nfs -o nolock 192.168.1.21:/work/share /mnt

    五、tslib使用

    环境:

    sudo apt-get install autoconf sudo apt-get install automake sudo apt-get install libtool

    编译:

    tar xzf tslib-1.4.tar.gz cd tslib ./autogen.sh mkdir tmp echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache ./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=$(pwd)/tmp make make install

    安装:

    cd tmp cp * -rf /nfsroot

    cat /etc/profile

    export TSLIB_TSDEVICE=/dev/event0 export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_CONFFILE=/etc/ts.conf export TSLIB_PLUGINDIR=/lib/ts export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0

    执行:

    ts_calibrate ts_test static int ts_input_read(struct tslib_module_info *inf, struct ts_sample *samp, int nr) { ... #if 0 if (i->sane_fd == 0) i->sane_fd = check_fd(i); if (i->sane_fd == -1) return 0; #else i->using_syn = 1; #endif if (i->using_syn) { switch (ev.type) { case EV_KEY: switch (ev.code) { case BTN_TOUCH: if (ev.value == 0) { } else { i->current_p = ev.value; } break; } break; } } } }
    Processed: 0.014, SQL: 8