坑多多之NT98539

FwUpgrade烧写

qsenk fail

FB_1600_8192Mb_8192Mb,DDR管脚复用不匹配,有FB TB两种类型。

NE8K5S1K2HEAN00000350000003700AN100000100s100FXS1S1S1S1S1S1K:U3RDTCPU1100 overclock to 3200
zq_trim[0x16], ldo_trim[0x8]
DRAM1_DDR4x2_3199_32b_FB ini_ver: 0x31240401
DONE
>qsenk fail
RE K

null partition

TB_1600_8192Mb_8192Mb,编译固件应该根据硬件设计选择正确的配置,使用的配置cfg_539_IPC_NAND_RAMDISK_EVB配置编译的固件烧写到使用eMMC的板子导致,应该使用cfg_539_IPC_EMMC_RAMDISK_EVB编译固件。

NE8DCRCDCRCK5S1K2HEAN00000350000003700AN100000100s100FXS1S1S1S1S1S1K:U3RDTCPU1100 overclock to 3200
zq_trim[0x16], ldo_trim[0x8]
DRAM1_DDR4x2_3199_32b_TB ini_ver: 0x31240401
DONE
>in TB pinmux
rperbit
ddr init done real chip
bl_lowlevel_init done

UNZOK!
Loader Start ...
LD_VER 02.07.07

539_DDR4_1600_8192Mb_8192Mb 11/06/2024 18:26:16

[8bit]
Boot from USB ...
USBFW UPDATE
usbrom_exit >1
fdt addr 0x080000D4
fdt size 0x00021962
tmp_addr 0x08000000
LdCtrl2 0x00000001
upd_src_addr= 0x08000000
upd_src_size= 0x01990A54
E:bl_get_partition-1
E:nul p_emb_partition_bl31
E:bl_get_partition-1
E:null p_emb_partition_uboot
core_cnt= 0x00000002
smp(bl31)
fdt 0x00100000
shm 0x00A00000
        core2_jump 0xF0D40800
  code2JumpCodelen 0x00000010
      core2_entry2 0x00010000
       core2_entry 0xF0D40810
 code2EntryCodelen 0x00000188
      core2_entry2 0x00010000
bl_core2_reset
$64wfi64core2_jump_program 0x01007610
64code2JumpCodelen 0x00000228
warm reset core0
jump_entry 0xFFFFFFFF
ARC64warmrst*21

d1 s not matched(invalid dtb)

内存配置使用TB_1333_4096Mb_4096Mb(或TB_1333_4096Mb_0Mb)时,loader与SDK设备树中u-boot内存布局配置不一致导致。硬件设计为TB_1333_4096Mb_4096Mb,实测内存配置使用TB_1600_8192Mb_8192Mb也可以正常烧写。loader内存大小小于nvt-mem-tbl.dtsi中的内存大小时发生,反之可以正常烧写并启动进系统。

DRAM1_DDR4x2_2665_32b_TB ini_ver: 0x21240124
DONE
>in TB pinmux
rperbit
ddr init done real chip
bl_lowlevel_init done

UNZOK!
Loader Start ...
LD_VER 02.07.07

539_DDR4_1333_4096Mb_4096Mb 11/06/2024 18:56:00

[8bit]
Boot from USB ...
USBFW UPDATE
usbrom_exit >1
fdt addr 0x080000D4
fdt size 0x000218D1
tmp_addr 0x08000000
E:fw_d1_s 0x80000000
E:ld_d1_s 0x40000000
E:d1 s not matched
E:dtb get shmem fail
LdCtrl2 0x00000001
E:dtb get shmem fail
E:dtb get shmem fail
E:null p_bininfo
EMMC: 8 bits
EMMC
RE:invalid dtb
E:bl_chk_fdt errorload fdt failed
patch
--- a/Linux/cfg_539_IPC_EMMC_RAMDISK_EVB/nvt-mem-tbl.dtsi
+++ b/Linux/cfg_539_IPC_EMMC_RAMDISK_EVB/nvt-mem-tbl.dtsi
@@ -11,17 +11,17 @@
        nvt_memory_cfg {
                #address-cells = <1>;
                #size-cells = <1>;
-               dram {          reg = <0x00000000 0x80000000>;  };
+               dram {          reg = <0x00000000 0x40000000>;  };
                core2entry1 {   reg = <0x00000000 0x00010000>;  };
                core2entry2 {   reg = <0x00010000 0x00010000>;  };
                fdt {           reg = <0x00100000 0x00100000>;  };
                shmem{          reg = <0x00A00000 0x00100000>;  };
                loader {        reg = <0x01000000 0x00100000>;  };
                atf {           reg = <0x01F00000 0x00100000>;  };
-               linuxtmp {      reg = <0x02000000 0x72F00000>;  };
-               all_in_one {    reg = <0x74F00000 0x07800000>;  };
-               kernel_img {    reg = <0x7C700000 0x01900000>;  };
-               uboot{          reg = <0x7E000000 0x02000000>;  };
+               linuxtmp {      reg = <0x02000000 0x32F00000>;  };
+               all_in_one {    reg = <0x34F00000 0x07800000>;  };
+               kernel_img {    reg = <0x3C700000 0x01900000>;  };
+               uboot{          reg = <0x3E000000 0x02000000>;  };
        };
        /* Linux system memory region*/
        memory { device_type = "memory"; reg = <0x0 0x00000000 0x0 0x18000000>; };

 正常烧写

N00000350000003700AN100000100s100FXS1S1S1S1S1S1K:U3RDTCPU1100 zq_trim[0xe], ldo_trim[0x8]
DRAM1_DDR4x2_2665_32b_TB ini_ver: 0x21240124
DONE
>in TB pinmux
rperbit
ddr init done real chip
bl_lowlevel_init done

UNZOK!
Loader Start ...
LD_VER 02.07.07

539_DDR4_1333_4096Mb_4096Mb 11/06/2024 20:10:23

[8bit]
Boot from USB ...
USBFW UPDATE
USBFW UPDATE: Running
usbrom_exit >1
fdt addr 0x080100E0
fdt size 0x000218D1
tmp_addr 0x08000000
LdCtrl2 0x00000001
upd_src_addr= 0x08000000
upd_src_size= 0x03FB03A0
bl31_addr 0x01F00000
uboot_addr 0x3E000000
nmlcore_cnt= 0x00000002
smp(bl31)
fdt 0x00100000
shm 0x00A00000
        core2_jump 0xF0D40800
  code2JumpCodelen 0x00000010
      core2_entry2 0x00010000
       core2_entry 0xF0D40810
 code2EntryCodelen 0x00000188
      core2_entry2 0x00010000
bl_core2_reset
$64wfi64core2_jump_program 0x01007610
64code2JumpCodelen 0x00000228
warm reset core0
jump_entry 0x01F00000
ARC64warmrst*21#NOTICE:  BL31: v2.2(release):ns02302_linux_sdk_release_glibc_v3.05.100
NOTICE:  BL31: Built : 20:05:24, Nov  6 2024
NOTICE:  BL31: Found DTB
NOTICE:  TZASC config:
NOTICE: 0x00100000@0x01f00000   (RW/N)  Ree
INFO:    ARM GICv2 driver initialized
INFO:    BL31: Platform setup done
INFO:    BL31: Initializing runtime services
INFO:    BL31: Preparing for EL3 exit to normal world
INFO:    Entry point address = 0x3e000000
INFO:    SPSR = 0x3c9


U-Boot 2021.10+ (Nov 06 2024 - 20:06:22 +0800)

CPU:   Novatek NT @ 1099 MHz
DRAM:  nvt_print_dram_setting: dram[0x0 - 0x40000000]
nvt_print_dram_setting: core2entry1[0x0 - 0x10000]
nvt_print_dram_setting: core2entry2[0x10000 - 0x10000]
nvt_print_dram_setting: fdt[0x100000 - 0x100000]
nvt_print_dram_setting: shmem[0xa00000 - 0x100000]
nvt_print_dram_setting: loader[0x1000000 - 0x100000]
nvt_print_dram_setting: shmem_amp[0x0 - 0x0]
nvt_print_dram_setting: atf[0x1f00000 - 0x100000]
nvt_print_dram_setting: teeos[0x0 - 0x0]
nvt_print_dram_setting: nsmem[0x0 - 0x0]
nvt_print_dram_setting: linuxtmp[0x2000000 - 0x32f00000]
nvt_print_dram_setting: uboot[0x3e000000 - 0x2000000]
nvt_print_dram_setting: rtos[0x0 - 0x0]
nvt_print_dram_setting: bridge[0x0 - 0x0]
nvt_print_dram_setting: memory[0x0 - 0x18000000]
nvt_print_dram_setting: all_in_one[0x34f00000 - 0x7800000]
nvt_print_dram_setting: kernel_img[0x3c700000 - 0x1900000]
nvt_print_dram_setting: dsp[0x0 - 0x0]
nvt_print_dram_setting: rtos_s0[0x0 - 0x0]
nvt_print_dram_setting: rtos_s1[0x0 - 0x0]
nvt_print_dram_setting: rtos_s2[0x0 - 0x0]
nvt_print_dram_setting: logo-fb[0x0 - 0x0]
nvt_print_dram_setting: logo2-fb[0x0 - 0x0]
1 GiB
Relocation to 0x3ff7b000, Offset is 0x01f7b000 sp at 3fc57500
nvt_shminfo_init:  The fdt buffer addr: 0x3fc79bc0
otp_init[1.00.003]
otp_timing_reg= 0xff6050
MMC:   nvt_pinmux_probe(pinmux= top_base=00000002f0010000, length=00000002f0010000):
pinmux_config_uart = 0x00000001
sdio pinmux(0x711)
sdio pinmux(0x711)
NVT_MMC2: pinmux 8 bit, but dts not 8 bits => assume 4 bits
NVT_MMC0: 0, NVT_MMC2: 2
Loading Environment from nowhere... OK
 misc_init_r: Firmware name: FW98539A.bin FW98539T.bin FW98539A.fdt.bin
 misc_init_r: boot time: 60240975(us)
CMD8 timeout, status 44
end_command IS NULL
CMD55 timeout, status 44
end_command IS NULL
switch to partitions #0, OK
mmc2(part 0) is current device
nvt_emmc_set_bootbus: Set EMMC boot bus to 4-bit mode
Set to BOOT_BUS_WIDTH = 0x1, RESET = 0x0, BOOT_MODE = 0x0
Starting to update firmware from USB/ETH
        firmware image at: 0x03fb03a0@0x08000000
 nvt_getfdt_emb_part_info: Skip this partition node: partition_fdt.restore
 nvt_getfdt_emb_part_info: Skip this partition node: partition_fdt.restore
nvt_chk_mtd_fdt_is_null: nvt_chk_mtd_fdt_is_null: cmd:mmc read 0x3fca12c0 0x200 0x200

MMC read: dev # 2, block # 512, count 512 ... 512 blocks read: OK
 modelext is empty
 Update: loader
nvt_switch_boot_patition, mmc partconf 2 1 1 1

MMC write: dev # 2, block # 0, count 128 ... 128 blocks written: OK
nvt_switch_boot_patition, mmc partconf 2 1 1 0
 Update: fdt

MMC write: dev # 2, block # 512, count 269 ... 269 blocks written: OK
 Update: ATF

MMC write: dev # 2, block # 1536, count 81 ... 81 blocks written: OK
 Update: uboot

MMC write: dev # 2, block # 2048, count 812 ... 812 blocks written: OK
 Update: linux

MMC write: dev # 2, block # 6656, count 5965 ... 5965 blocks written: OK
 Update: rootfs0

MMC write: dev # 2, block # 23040, count 5222 ... 5222 blocks written: OK
 Update: rootfs1
Update: nvt_update_fs_partition EXT4 or FAT size=0x032e1368
Flashing sparse ext4 image at offset 0x55a00
Flashing Sparse Image

MMC write: dev # 2, block # 350720, count 8 ... 8 blocks written: OK

pinmux_show之坑

cat /proc/nvt_info/nvt_pinmux/pinmux_show查看到的管脚复用与实际不符。ns02302_pinmux.h

--- a/drivers/pinctrl/novatek/ns02302/ns02302_pinmux.h
+++ b/drivers/pinctrl/novatek/ns02302/ns02302_pinmux.h
@@ -330,8 +330,8 @@ typedef enum {
        func_SN3_XVSXHS,
        func_SN4_MCLK,
        func_SN4_XVSXHS,
-       func_SN5_MCLK,
-       func_SN5_XVSXHS,
+       //func_SN5_MCLK,
+       //func_SN5_XVSXHS,
        func_MIPI,
        func_I2S_1,
        func_I2S_2,

emmc启动之坑

eMMC设备树bus-width配置与BS管脚配置不一致会导致烧写后不会从eMMC启动。

--- a/Linux/cfg_539_IPC_EMMC_RAMDISK_EVB/nvt-peri.dtsi
+++ b/Linux/cfg_539_IPC_EMMC_RAMDISK_EVB/nvt-peri.dtsi
@@ -151,7 +151,7 @@
                interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
                max-frequency = <48000000>;
                max-voltage = <3300>;
-               bus-width = <4>;
+               bus-width = <8>;
                neg-sample-edge = <0>;
                driving = <2 2 2 3 2 2 5 4 4 6 5 5>;
        };

 debug

echo 0 > /sys/class/block/mmcblk2boot0/force_ro
dd if=/dev/zero of=/dev/mmcblk2boot0
reboot

SPI设备配置之坑

设备树SPI设备配置GPIO中断后,驱动的probe函数不会被调用。

mcp2515

配置GPIO中断后,驱动的probe函数不会被调用;不配置GPIO中断,请求中断出错。问题进入僵局。SDK中没有设备树GPIO中断配置示例,企微联系技术支持,理解所问的问题都费劲,只能分析内核源码来解决。

config

CONFIG_CAN_MCP251X=y
CONFIG_CAN=y
CONFIG_CAN_DEV=y

 dts

/ {
       clk16m: clk16m {
               compatible = "fixed-clock";
               #clock-cells = <0>;
               clock-frequency = <16000000>;
       };
};

&spi2 {
       #address-cells = <1>;
       #size-cells = <0>;

       can0:can0@0 {
               compatible = "microchip,mcp2515";
               reg = <0x0>;
               clocks = <&clk16m>;
               spi-cpol;
               spi-cpha;
               interrupt-parent = <&gpio>;
               interrupts = <GIC_SPI 45 IRQ_TYPE_EDGE_FALLING>;
               spi-max-frequency = <5000000>;
               status = "okay";
       };
};

spi_drv_probe

drivers/spi/spi.c

 382 static int spi_drv_probe(struct device *dev)
 383 {
 384     const struct spi_driver     *sdrv = to_spi_driver(dev->driver);
 385     struct spi_device       *spi = to_spi_device(dev);
 386     int ret;
 387
 388     ret = of_clk_set_defaults(dev->of_node, false);
 389     if (ret)
 390         return ret;
 391
 392     if (dev->of_node) {
 393         spi->irq = of_irq_get(dev->of_node, 0);
 394         if (spi->irq == -EPROBE_DEFER)
 395             return -EPROBE_DEFER;
 396         if (spi->irq < 0)
 397             spi->irq = 0;
 398     }

 of_irq_get

drivers/of/irq.c

378 /**
379  * of_irq_get - Decode a node's IRQ and return it as a Linux IRQ number
380  * @dev: pointer to device tree node
381  * @index: zero-based index of the IRQ
382  *
383  * Returns Linux IRQ number on success, or 0 on the IRQ mapping failure, or
384  * -EPROBE_DEFER if the IRQ domain is not yet created, or error code in case
385  * of any other failure.
386  */
387 int of_irq_get(struct device_node *dev, int index)
388 {
389     int rc;
390     struct of_phandle_args oirq;
391     struct irq_domain *domain;
392
393     rc = of_irq_parse_one(dev, index, &oirq);
394     if (rc)
395         return rc;
396
397     domain = irq_find_host(oirq.np);
398     if (!domain)
399         return -EPROBE_DEFER;
400
401     return irq_create_of_mapping(&oirq);
402 }
403 EXPORT_SYMBOL_GPL(of_irq_get);

failed to acquire irq

dts
interrupts = <45 IRQ_TYPE_EDGE_FALLING>;
mcp251x_open
1229     ret = request_threaded_irq(spi->irq, NULL, mcp251x_can_ist,
1230                    flags | IRQF_ONESHOT, dev_name(&spi->dev),
1231                    priv);
1232     if (ret) {
1233         dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq);
1234         goto out_close;
1235     }
 debug
+       if (spi->irq < 0) {
+               /* P_GPIO21 */
+               spi->irq = gpio_to_irq(53);
+       }

irq domain

irq_find_host

include/linux/irqdomain.h

298 static inline
299 struct irq_domain *irq_find_matching_fwnode(struct fwnode_handle *fwnode,
300                         enum irq_domain_bus_token bus_token)
301 {
302     struct irq_fwspec fwspec = {
303         .fwnode = fwnode,
304     };
305
306     return irq_find_matching_fwspec(&fwspec, bus_token);
307 }
308
309 static inline struct irq_domain *irq_find_matching_host(struct device_node *node,
310                             enum irq_domain_bus_token bus_token)
311 {
312     return irq_find_matching_fwnode(of_node_to_fwnode(node), bus_token);
313 }
314
315 static inline struct irq_domain *irq_find_host(struct device_node *node)
316 {
317     struct irq_domain *d;
318
319     d = irq_find_matching_host(node, DOMAIN_BUS_WIRED);
320     if (!d)
321         d = irq_find_matching_host(node, DOMAIN_BUS_ANY);
322
323     return d;
324 }

irq_find_matching_fwspec

kernel/irq/irqdomain.c

373 struct irq_domain *irq_find_matching_fwspec(struct irq_fwspec *fwspec,
 374                         enum irq_domain_bus_token bus_token)
 375 {
 376     struct irq_domain *h, *found = NULL;
 377     struct fwnode_handle *fwnode = fwspec->fwnode;
 378     int rc;
 379
 380     /* We might want to match the legacy controller last since
 381      * it might potentially be set to match all interrupts in
 382      * the absence of a device node. This isn't a problem so far
 383      * yet though...
 384      *
 385      * bus_token == DOMAIN_BUS_ANY matches any domain, any other
 386      * values must generate an exact match for the domain to be
 387      * selected.
 388      */
 389     mutex_lock(&irq_domain_mutex);
 390     list_for_each_entry(h, &irq_domain_list, link) {
 391         if (h->ops->select && fwspec->param_count)
 392             rc = h->ops->select(h, fwspec, bus_token);
 393         else if (h->ops->match)
 394             rc = h->ops->match(h, to_of_node(fwnode), bus_token);
 395         else
 396             rc = ((fwnode != NULL) && (h->fwnode == fwnode) &&
 397                   ((bus_token == DOMAIN_BUS_ANY) ||
 398                    (h->bus_token == bus_token)));
 399
 400         if (rc) {
 401             found = h;
 402             break;
 403         }
 404     }
 405     mutex_unlock(&irq_domain_mutex);
 406     return found;
 407 }
 408 EXPORT_SYMBOL_GPL(irq_find_matching_fwspec);

__irq_domain_add

is_fwnode_irqchip

include/linux/irqdomain.h

288 extern const struct fwnode_operations irqchip_fwnode_ops;
289
290 static inline bool is_fwnode_irqchip(struct fwnode_handle *fwnode)
291 {
292     return fwnode && fwnode->ops == &irqchip_fwnode_ops;
293 }

arm,cortex-a7-gic

configs/Linux/cfg_539_IPC_EMMC_RAMDISK_EVB/nvt-basic.dtsi
/proc/device-tree/interrupt-controller@2,fff0000

drivers/irqchip/irq-gic.c

gpio-nvt

drivers/gpio/gpio-nvt.c

nvt_install_irq_chip时调用irq_domain_add_linear,此函数的第一个参数为空导致,irq_find_host找不到对应的irq_domain。

400 static int nvt_install_irq_chip(struct nvt_gpio_chip *chip)
401 {
402     int n = 0;
403
404     /* To create GPIO IRQ domain with total expend irq number */
405     chip->domain = irq_domain_add_linear(NULL, GPIO_IRQ_TOTAL,
406                          &nvt_gpio_domain_ops, chip);
407     if (!chip->domain)
408         return -ENOMEM;
409
410     /* To create virq <-> hwirq mapping */
411     for (n = 0; n < GPIO_IRQ_TOTAL; n++)
412         irq_create_mapping(chip->domain, n);
413
414     /*
415      * Assign handler to gpio hw irq which is used to connect ARM GIC
416      * Once HWIRQ is triggered by gpio controller, this handler will be called.
417      */
418     for (n = 0; n < GPIO_IRQ_NUM; n++) {
419         irq_set_chained_handler_and_data(chip->irq_base[n], nvt_summary_irq_handler, chip);
420     }
421
422     return 0;
423 }
patch
--- a/drivers/gpio/gpio-nvt.c
+++ b/drivers/gpio/gpio-nvt.c
@@ -402,7 +402,7 @@ static int nvt_install_irq_chip(struct nvt_gpio_chip *chip)
        int n = 0;

        /* To create GPIO IRQ domain with total expend irq number */
-       chip->domain = irq_domain_add_linear(NULL, GPIO_IRQ_TOTAL,
+       chip->domain = irq_domain_add_linear(chip->dev->of_node, GPIO_IRQ_TOTAL,
                                             &nvt_gpio_domain_ops, chip);
        if (!chip->domain)
                return -ENOMEM;

debugfs

--- a/arch/arm64/configs/ns02302_ipc_a64_evb_defconfig_emmc_release
+++ b/arch/arm64/configs/ns02302_ipc_a64_evb_defconfig_emmc_release
@@ -55,7 +55,7 @@ CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
 CONFIG_HANDLE_DOMAIN_IRQ=y
 CONFIG_IRQ_FORCED_THREADING=y
 CONFIG_SPARSE_IRQ=y
-# CONFIG_GENERIC_IRQ_DEBUGFS is not set
+CONFIG_GENERIC_IRQ_DEBUGFS=y
 # end of IRQ subsystem

 CONFIG_GENERIC_IRQ_MULTI_HANDLER=y

gpio_config之坑

nvt-gpio.dtsi 文件注释中所说的gpio_config不工作。设备树中GPIO寄存器基址配置错误导致。

402     nvt_mem_base = platform_get_resource(pdev, IORESOURCE_MEM, 2);
403     info->gpio_base = devm_ioremap_resource(&pdev->dev, nvt_mem_base);
404     if (IS_ERR(info->gpio_base)) {
405         dev_err(&pdev->dev, "fail to get gpio mem base\n");
406         return -ENOMEM;
407     }

patch

--- a/Linux/cfg_539_IPC_EMMC_RAMDISK_EVB/nvt-peri.dtsi
+++ b/Linux/cfg_539_IPC_EMMC_RAMDISK_EVB/nvt-peri.dtsi
@@ -275,7 +275,7 @@
                reg = <
                        0x2 0xf0010000 0x0 0x1100
                        0x2 0xf0030000 0x0 0x2000
-                       0x2 0xf0070000 0x0 0x10000
+                       0x2 0xf0040000 0x0 0x10000
                >;
        };

make tools

multiple definition of 'junk'

编译iozone报错。

aarch64-ca53-linux-gnu/bin/ld: libbif.o:(.bss+0x0): multiple definition of `junk'; iozone_linux.o:(.bss+0x0): first defined here

 iozone.c 1634行junk增加static修饰。

1634 static int junk;

command not found

编译gdb时报错。

makeinfo: command not found

 安装texinfo,sudo apt install texinfo

No package 'zlib' found

mtd-utils没有编译。

configure:14311: checking for ZLIB
configure:14318: $PKG_CONFIG --exists --print-errors "zlib"
Package zlib was not found in the pkg-config search path.
Perhaps you should add the directory containing `zlib.pc'
to the PKG_CONFIG_PATH environment variable
No package 'zlib' found
configure:14321: $? = 1
configure:14335: $PKG_CONFIG --exists --print-errors "zlib"
Package zlib was not found in the pkg-config search path.
Perhaps you should add the directory containing `zlib.pc'
to the PKG_CONFIG_PATH environment variable
No package 'zlib' found
configure:14338: $? = 1
configure:14352: result: no
No package 'zlib' found
patch
--- a/Makefile
+++ b/Makefile
@@ -96,7 +96,7 @@ mtd-utils: zlib lzo libuuid
        @echo ">>>>>>>>>>>>>>>>>>> $@ compiling >>>>>>>>>>>>>>>>>>>"
        $(call check_exist, ${MTD_UTILS})
        cd ${MTD_UTILS}; \
-       CFLAGS=-I${TOOLS}/${INSTALL_DIR}/include CPPFLAGS=-I${TOOLS}/${INSTALL_DIR}/include LDFLAGS=-L${TOOLS}/${INSTALL_DIR}/lib ./configure --host=${NVT_HOST} --prefix=${TOOLS}/${INSTALL_DIR} --without-xattr; \
+       PKG_CONFIG_PATH=${TOOLS}/${INSTALL_DIR}/lib/pkgconfig CFLAGS=-I${TOOLS}/${INSTALL_DIR}/include CPPFLAGS=-I${TOOLS}/${INSTALL_DIR}/include LDFLAGS=-L${TOOLS}/${INSTALL_DIR}/lib ./configure --host=${NVT_HOST} --prefix=${TOOLS}/${INSTALL_DIR} --without-xattr; \
        make; make install;

 memtester: init

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值