TQ2440移植概略

一、原料

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

  1. 去掉宏: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  得到的是绝对的地址,链接时决定; 
  1. 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-%02d-%02d %02d:%02d:%02d 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;
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值