一、原料
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 0x32000000 | tftp下载到内存,运行 |
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-%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;
}
}
}
}