$ cd /path/to/linux-3.4.x $ patch -p1 -i /path/to/zt180_b0_3.4.patch
$ make V=1 ARCH=arm CROSS_COMPILE=/path/to/toolchain/arm-infotm-linux-gnueabi- oldconfig
$ mkdir -p /path/to/uinitrd.extracted $ pushd !$ $ dd if=/path/to/uinitrd-kirkwood.img bs=64 skip=1 | gzip -dc | sudo cpio -div $ popd
# clean initrd directory $ sudo rm -rf /path/to/uinitrd.extracted/lib/{modules, firmware} # build kernel for the first time $ make KALLSYMS_EXTRA_PASS=1 ARCH=arm CROSS_COMPILE=/path/to/toolchain/arm-infotm-linux-gnueabi- -j2 zImage # build modules against the kernel $ make KALLSYMS_EXTRA_PASS=1 ARCH=arm CROSS_COMPILE=/path/to/toolchain/arm-infotm-linux-gnueabi- -j2 modules # install modules into initramfs dir $ sudo make ARCH=arm CROSS_COMPILE=/path/to/toolchain/arm-infotm-linux-gnueabi- -j2 modules_install INSTALL_MOD_PATH=/path/to/uinitrd.extracted/ # install firmware to initramfs folder $ sudo make ARCH=arm CROSS_COMPILE=/path/to/toolchain/arm-infotm-linux-gnueabi- -j2 firmware_install INSTALL_MOD_PATH=/path/to/uinitrd.extracted/ # remove unnecessary files $ sudo rm -rf /path/to/uinitrd.extracted/lib/modules/3.4.*/{build,source} # build the kernel again, with initramfs dir contains modules $ make KALLSYMS_EXTRA_PASS=1 ARCH=arm CROSS_COMPILE=/path/to/toolchain/arm-infotm-linux-gnueabi- -j2 zImage
# make u-boot image $ /path/to/mkimage -A arm -C none -O linux -T kernel -a 0x40008000 -e 0x40008000 -n linux-3.4 -d arch/arm/boot/zImage arch/arm/boot/uImage # make firmware2 $ cat /path/to/firmware2.header arch/arm/boot/uImage > firmware2
and load the tablet from it. $ ( time ./my_build.sh ) |& tee `date +%M%H_%F`-build-log.txt
/* ... */ c039e32c: e59f0030 ldr r0, [pc, #48] ; c039e364 <_binary_0xc039e2e8_imapx200_decode_suspend_start+0x7c> /* ... */ c039e360: e89da800 ldm sp, {fp, sp, pc} c039e364: f0200000 undefined instruction 0xf0200000 c039e368: c24b1c9c subgt r1, fp, #39936 ; 0x9c00
#ifndef MY_CONST_H #define MY_CONST_H extern const int my_constant; #endif /* MY_CONST_H */
const int my_constant = 42;
This can be placed in any translation unit. Now the compiler will not be able to sew the value of the constant into the code, but will have to make some reference to it. The linker will receive only one object file, in which there will be a constant value, and then substitute the final addresses into the code. Of course there may be options, but in general, the compiler alone is helpless before such a trick and is forced to do what is described above. However, there is a small nuance [21] . diff -ru ./linux-3.4.108/arch/arm/mach-imapx200/Makefile ../linux-3.4.108/arch/arm/mach-imapx200/Makefile --- ./linux-3.4.108/arch/arm/mach-imapx200/Makefile 2015-09-09 12:17:52.483020878 +0300 +++ ../linux-3.4.108/arch/arm/mach-imapx200/Makefile 2015-09-08 17:11:45.775035963 +0300 @@ -6,7 +6,7 @@ #IMAPX200 support files -obj-$(CONFIG_CPU_IMAPX200) += irq.o clock.o time.o devices.o pwm.o +obj-$(CONFIG_CPU_IMAPX200) += irq.o clock.o time.o devices.o pwm.o constants.o diff -ru ./linux-3.4.108/arch/arm/mach-imapx200/include/mach/imapx_base_reg.h ../linux-3.4.108/arch/arm/mach-imapx200/include/mach/imapx_base_reg.h --- ./linux-3.4.108/arch/arm/mach-imapx200/include/mach/imapx_base_reg.h 2015-09-09 12:17:52.498020874 +0300 +++ ../linux-3.4.108/arch/arm/mach-imapx200/include/mach/imapx_base_reg.h 2015-09-08 17:11:45.778035706 +0300 @@ -15,13 +15,23 @@ #define IMAPX200_SDRAM_PA (0x40000000) /************************Virtual address for peripheral*************************/ -#define IMAP_VA_SYSMGR IMAP_ADDR(0x00200000) -#define IMAP_VA_IRQ IMAP_ADDR(0x00000000) -#define IMAP_VA_TIMER IMAP_ADDR(0x00300000) -#define IMAP_VA_WATCHDOG IMAP_ADDR(0x00600000) -#define IMAP_VA_GPIO IMAP_ADDR(0x00400000) -#define IMAP_VA_NAND IMAP_ADDR(0x00500000) -#define IMAP_VA_FB IMAP_ADDR(0x00700000) +#if defined(IMAP_USE_MACRO_CONSTANTS) || defined(__ASSEMBLY__) +# define IMAP_VA_SYSMGR IMAP_ADDR(0x00200000) +# define IMAP_VA_IRQ IMAP_ADDR(0x00000000) +# define IMAP_VA_TIMER IMAP_ADDR(0x00300000) +# define IMAP_VA_WATCHDOG IMAP_ADDR(0x00600000) +# define IMAP_VA_GPIO IMAP_ADDR(0x00400000) +# define IMAP_VA_NAND IMAP_ADDR(0x00500000) +# define IMAP_VA_FB IMAP_ADDR(0x00700000) +#else +extern const void __iomem __force * const IMAP_VA_SYSMGR; +extern const void __iomem __force * const IMAP_VA_IRQ; +extern const void __iomem __force * const IMAP_VA_TIMER; +extern const void __iomem __force * const IMAP_VA_WATCHDOG; +extern const void __iomem __force * const IMAP_VA_GPIO; +extern const void __iomem __force * const IMAP_VA_NAND; +extern const void __iomem __force * const IMAP_VA_FB; +#endif /* defined(IMAP_USE_MACRO_CONSTANTS) || defined(__ASSEMBLY__) */ #define PERIPHERAL_BASE_ADDR_PA (0x20C00000) diff -ru ./linux-3.4.108/arch/arm/plat-imap/cpu.c ../linux-3.4.108/arch/arm/plat-imap/cpu.c --- ./linux-3.4.108/arch/arm/plat-imap/cpu.c 2015-09-09 12:17:52.607021038 +0300 +++ ../linux-3.4.108/arch/arm/plat-imap/cpu.c 2015-09-08 17:18:30.646035384 +0300 @@ -1,3 +1,5 @@ +#define IMAP_USE_MACRO_CONSTANTS + /******************************************************************************** ** linux-2.6.28.5/arch/arm/plat-imap/cpu.c ** diff -ru ./linux-3.4.108/arch/arm/plat-imap/gpio.c ../linux-3.4.108/arch/arm/plat-imap/gpio.c --- ./linux-3.4.108/arch/arm/plat-imap/gpio.c 2015-09-09 12:17:52.614020935 +0300 +++ ../linux-3.4.108/arch/arm/plat-imap/gpio.c 2015-09-08 17:18:38.566035206 +0300 @@ -1,3 +1,5 @@ +#define IMAP_USE_MACRO_CONSTANTS + /* arch/arm/plat-imapx200/gpiolib.c * * Copyright 2008 Openmoko, Inc. diff -ru ./linux-3.4.108/arch/arm/plat-imap/pm_imapx200.c ../linux-3.4.108/arch/arm/plat-imap/pm_imapx200.c --- ./linux-3.4.108/arch/arm/plat-imap/pm_imapx200.c 2015-09-09 12:17:52.631020886 +0300 +++ ../linux-3.4.108/arch/arm/plat-imap/pm_imapx200.c 2015-09-08 17:18:52.102036874 +0300 @@ -1,3 +1,5 @@ +#define IMAP_USE_MACRO_CONSTANTS + #include <linux/init.h> #include <linux/suspend.h> #include <linux/serial_core.h> diff -ru ./linux-3.4.108/drivers/video/infotm/imapfb.c ../linux-3.4.108/drivers/video/infotm/imapfb.c --- ./linux-3.4.108/drivers/video/infotm/imapfb.c 2015-09-09 12:17:53.350020920 +0300 +++ ../linux-3.4.108/drivers/video/infotm/imapfb.c 2015-09-08 17:34:34.814042727 +0300 @@ -1,3 +1,5 @@ +#define IMAP_USE_MACRO_CONSTANTS + /***************************************************************************** ** drivers/video/infotm/imapfb.c ** diff -ru --new-file ./linux-3.4.108/arch/arm/mach-imapx200/constants.c ../linux-3.4.108/arch/arm/mach-imapx200/constants.c --- ./linux-3.4.108/arch/arm/mach-imapx200/constants.c 1970-01-01 03:00:00.000000000 +0300 +++ ../linux-3.4.108/arch/arm/mach-imapx200/constants.c 2015-09-09 14:56:53.513487879 +0300 @@ -0,0 +1,11 @@ +#include <linux/compiler.h> + +#include <mach/imapx_base_reg.h> + +const void __iomem __force * const IMAP_VA_SYSMGR = IMAP_ADDR(0x00200000); +const void __iomem __force * const IMAP_VA_IRQ = IMAP_ADDR(0x00000000); +const void __iomem __force * const IMAP_VA_TIMER = IMAP_ADDR(0x00300000); +const void __iomem __force * const IMAP_VA_WATCHDOG = IMAP_ADDR(0x00600000); +const void __iomem __force * const IMAP_VA_GPIO = IMAP_ADDR(0x00400000); +const void __iomem __force * const IMAP_VA_NAND = IMAP_ADDR(0x00500000); +const void __iomem __force * const IMAP_VA_FB = IMAP_ADDR(0x00700000);
# diff -ru 1.log 2.log
--- 1.log 2015-09-11 16:57:28.430158628 +0300 +++ 2.log 2015-09-11 16:57:20.627161803 +0300 @@ -1,4 +1,4 @@ -Data Size: 17844272 Bytes = 17426.05 kB = 17.02 MB +Data Size: 17843856 Bytes = 17425.64 kB = 17.02 MB Load Address: 0x40008000 Entry Point: 0x40008000 --- 22012015-rom/sizes.txt 2015-01-28 15:25:51.107945315 +0300 +++ 28012015-rom/sizes.txt 2015-01-28 15:15:48.052949785 +0300 @@ -1,25 +1,25 @@ -imapx200_timer_mask - 44 -imapx200_timer_unmask - 52 -imapx200_timer_ack - 44 +imapx200_timer_mask - 52 +imapx200_timer_unmask - 60 +imapx200_timer_ack - 52 imapx200_irq_add - 24 imapx200_irq_init - 32 imapx200_irq_wake - 44 -imapx200_irq_unmask - 136 -imapx200_irq_mask - 132 -imapx200_irq_ack - 120 +imapx200_irq_unmask - 172 +imapx200_irq_mask - 160 +imapx200_irq_ack - 152 imap_clk_enable - 60 imap_clkcon_enable - 76 -imapx200_gettimeoffset - 64 -imapx200_timer_setup - 164 -imapx200_timer_interrupt - 64 +imapx200_gettimeoffset - 68 +imapx200_timer_setup - 168 +imapx200_timer_interrupt - 76 imap_pwm_suspend - 188 imap_pwm_resume - 184 imap_pwm_start - 164 imap_timer_setup - 404 imap_default_idle - 20 -imapx_poweroff - 56 -imapx_reset - 64 -imapx200_idle - 52 +imapx_poweroff - 88 +imapx_reset - 68 +imapx200_idle - 48 imap_set_board - 112 imapx200_gpio_setpull_updown - 56 imapx200_gpio_getpull_updown - 36 @@ -48,7 +48,7 @@ imapx200_pm_prepare - 24 imapx200_pm_finish - 20 imapx200_pm_do_save - 88 -imapx200_pm_enter - 436 +imapx200_pm_enter - 500 imapx200_pm_configure_extint - 20 imapx200_pm_prepare - 24 imapx200_pm_init - 80 @@ -86,8 +86,8 @@ imapfb_resume - 196 imapfb_suspend - 204 imapfb_backlight_power_supply - 20 -imapfb_set_clk - 44 -imapfb_set_gpio - 88 +imapfb_set_clk - 52 +imapfb_set_gpio - 96 imapfb_set_brightness - 36 imapfb_lcd_power_supply - 32 con_get_unimap - 360 @@ -153,7 +153,7 @@ imap_nand_irq - 92 ehci_imapx200_drv_remove - 80 ehci_imapx200_init - 1148 -ehci_imapx200_drv_probe - 552 +ehci_imapx200_drv_probe - 556 ohci_hcd_imapx200_drv_remove - 80 ohci_imapx200_start - 100 ohci_hcd_imapx200_drv_probe - 512 @@ -196,22 +196,22 @@ imapx200_i2c_probe - 824 imapx200_i2c_irq - 920 imapx200_decode_poll - 184 -imapx200_decode_suspend - 132 +imapx200_decode_suspend - 44 imapx200_decode_resume - 68 -imapx200_decode_release - 192 +imapx200_decode_release - 104 imapx200_decode_open - 124 imapx200_decode_remove - 208 imapx200_decode_ioctl - 384 -imapx200_decode_probe - 908 +imapx200_decode_probe - 816 imapx200_decode_irq_handle - 264 imapx200_encode_poll - 84 -imapx200_encode_suspend - 116 +imapx200_encode_suspend - 28 imapx200_encode_ioctl - 348 imapx200_encode_resume - 68 -imapx200_encode_release - 188 +imapx200_encode_release - 100 imapx200_encode_open - 120 imapx200_encode_remove - 232 -imapx200_encode_probe - 1080 +imapx200_encode_probe - 988 imapx200_encode_irq_handle - 136 sdhci_imap_set_clk_src - 52 sdhci_imap_resume - 36 @@ -220,7 +220,7 @@ sdhci_imap_get_timeout_clk - 40 imapfb_probe - 2952 imapfb_init - 28 -sdhci_imap_probe - 604 +sdhci_imap_probe - 608 sdhci_imap_remove - 20 name_imapx200 - 12 imapfb_a1rgb232_8 - 48 @@ -342,8 +342,8 @@ __kstrtab_imap_get_reservemem_paddr - 26 __kstrtab_con_copy_unimap - 16 __kstrtab_con_set_default_unimap - 23 -imapx200_init_clocks - 1120 -imapx200_timer_init - 120 +imapx200_init_clocks - 1104 +imapx200_timer_init - 124 imapx200_register_device - 56 imap_init_pwm - 308 imapx200_fixup - 36 @@ -542,7 +542,7 @@ imapx200_i2c_driver - 116 imapx200_i2c_driver - 116 imapx200_decode_driver - 80 -imapx200_decode_fops - 144 +imapx200_decode_fops - 148 imapx200_encode_driver - 80 imapx200_encode_fops - 180 sdhci_imap_driver - 80
--- 0xc0019c40-t-imapx200_timer_ack-2.listing 2015-11-18 22:12:24.196113878 +0300 +++ 0xc0019c50-imapx200_timer_ack-2.listing 2015-11-18 22:12:24.297113880 +0300 @@ -9,10 +9,12 @@ XXXXXXXX: e92dd800 push {fp, ip, lr, pc} XXXXXXXX: e24cb004 sub fp, ip, #4 ; 0x4 XXXXXXXX: e1a00000 nop (mov r0,r0) +c0019c60: e59f2018 ldr r2, [pc, #24] ; c0019c80 <_binary_0xc0019c50_imapx200_timer_ack_start+0x30> XXXXXXXX: e590Y000 ldr rY, [r0] XXXXXXXX: e3a0X001 mov rX, #1 ; 0x1 -c0019c58: e3a0120f mov r1, #-268435456 ; 0xf0000000 +c0019c6c: e5921000 ldr r1, [r2] XXXXXXXX: e1a0XX1Y lsl rX, rX, rY XXXXXXXX: e581X010 str rX, [r1, #16] XXXXXXXX: e581X000 str rX, [r1] XXXXXXXX: e89da800 ldm sp, {fp, sp, pc} +c0019c80: c04e858c subgt r8, lr, ip, lsl #11
c0019c58: e3a0120f mov r1, #-268435456 ; 0xf0000000
c0019c60: e59f2018 ldr r2, [pc, #24] ; c0019c80
- four bytes two.Source: https://habr.com/ru/post/270885/
All Articles