页次: 1
@xboot
楼主精通底层技术,赞一个。
上面的验签过程,有两种应用场景,需求不同,思路也会不同。
第一种,自己的产品防盗版,没有升级需求,或者loader没有升级需求,也就是某部分固件,完全不变化,且需防盗版抄袭。
这种需求,你需要将CPU ID + 固件或者loader,两者所有信息进行sha256摘要运算,并用ECDSA256对SHA256的摘要进行签名,存储在EFUSE里。当别人复制产品时,复制了SPI NOR FLASH,复制了EFUSE 签名,因CPU ID不同,也无法正常验签。第二种,自己是方案商仅出主控芯片,客户自行烧录生产,有固件及各种烧写工具。这种情况要求客户必须从你这里走芯片,而不能从市面上随便购买。
对于这种需求,仅需要对CPU ID 进行SHA256摘要运算,并用ECDSA256对SHA256的摘要进行签名,存储在EFUSE里,烧录好,出给客户就可以了。客户可以随便刷机,升级,但不能随便购买芯片。当然,固件完整性,固件防逆向,这些需求,可结合坑网之前的讨论的帖子,来实现。
最后一句话,攻防手段千千万,但几千年来,唯一不变的,还是人心,人性。
请问应用程序验签的时候使用什么库?openssl吗?还是用SOC内嵌的安全算法?
自己整了个小项目,用软件yuv转rgb太慢了。有没有大神帮助提供下调用de-fe硬件转yuv的代码。
用的是f1c100s,主线linux 5.2
500元红包答谢:)
联系:1171262261@qq.com
楼主的硬件转RGB搞定了吗?我现在用widora tiny200 R3,采用了aodzip大佬的 buildroot一键生成生成的image可以用modetest做四层叠加,但是只能支持RGB格式的图像,如果是yuv格式的图像,则会显示成全绿色。有没有什么线索在主线drm中使用这个硬件转码功能? @晕哥 有线索吗?
@aodzip 感谢楼主的贡献,让我们能够站在前人的肩膀上工作而不要重新造轮子。
从楼主的git库,取最新的版本,build了一个sysimage-sdcard.img,烧到sd卡,在tiny200 R3上电启动,加载rootfs时出错。
[
[ 1.776903] Kernel panic - not syncing: VFS: Unable to mount root fs on unkno wn-block(31,2)
[ 1.785238] CPU: 0 PID: 1 Comm: swapper Not tainted 5.4.99 #1
[ 1.790965] Hardware name: Allwinner suniv Family
[ 1.795734] [<c010e1c8>] (unwind_backtrace) from [<c010b964>] (show_stack+0x1 0/0x14)
[ 1.803513] [<c010b964>] (show_stack) from [<c06eea9c>] (panic+0xe8/0x2e4)
[ 1.810403] [<c06eea9c>] (panic) from [<c090135c>] (mount_block_root+0x2bc/0x 31c)
[ 1.817882] [<c090135c>] (mount_block_root) from [<c0901568>] (prepare_namesp ace+0x128/0x188)
[ 1.826412] [<c0901568>] (prepare_namespace) from [<c06f68d4>] (kernel_init+0 x8/0x108)
[ 1.834326] [<c06f68d4>] (kernel_init) from [<c01010e0>] (ret_from_fork+0x14/ 0x34)
[ 1.841873] Exception stack(0xc2839fb0 to 0xc2839ff8)
]
似乎kernel使用的bootargs参数错了,这个bootargs是从spi flash上加载rootfs,而我们是从tf卡启动的,rootfs也在tf卡上。
[
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 5.4.99 (yocto@85-159-213-31) (gcc version 8.4.0 (Buildroot -g21de572)) #1 Sun Nov 20 09:53:48 UTC 2022
[ 0.000000] CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=0005317f
[ 0.000000] CPU: VIVT data cache, VIVT instruction cache
[ 0.000000] OF: fdt: Machine model: Widora MangoPi R3
[ 0.000000] Memory policy: Data cache writeback
[ 0.000000] cma: Reserved 16 MiB at 0x82c00000
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 15883
[ 0.000000] Kernel command line: console=ttyS0,115200 rootwait init=/preinit root=/dev/mtdblock2 rootfstype=squashfs overlayfsdev=/dev/mtdblock3 net.ifnames=0 vt.global_cursor_default=0
[ 0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, lin ear)
[ 0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, line ar)
]
我进去uboot的命令行,bootcmd变量打印出来看了,似乎uboot没有设置bootargs环境变量?那么kernel启动的bootargs从哪里来的?是kernel编译时候的缺省参数?
[
boot_device=mmc0
boot_slot_0=empty
boot_slot_1=empty
boot_targets=fel dfu mmc0 mmc1 spi loopdfu
bootcmd=setenv lcd_bl_pin 134; run distro_bootcmd;
bootcmd_dfu=if test "${boot_device}" != "mmc0" || test "${boot_slot_1}" = "empty"; then run dfu_boot; fi;
bootcmd_fel=if test "${boot_device}" = "fel"; then run fel_boot; fi;
bootcmd_loopdfu=setenv dfu_wait_timeout; run bootcmd_dfu;
bootcmd_mmc0=if test "${boot_device}" = "mmc0"; then devnum=0; run mmc_boot; fi;
bootcmd_mmc1=if test "${boot_device}" = "mmc1"; then devnum=1; run mmc_boot; fi;
bootcmd_spi=if test "${boot_device}" = "spi"; then run nor_nand_boot; fi;
bootm_size=0x1800000
dfu_boot=if test "${boot_slot_1}" = "spi-nand"; then echo "DFU waiting on SPI-NAND..."; run dfu_nand; fi; if test "${boot_slot_1}" = "spi-nor"; then echo "DFU waiting on SPI-NOR..."; run dfu_nor; fi; if test "${boot_slot_1}" = "mmc1"; then echo "DFU waiting on MMC1..."; setenv dfu_mmc_dev 1; run dfu_mmc; fi; if test "${boot_slot_1}" = "empty" && test "${boot_slot_0}" = "mmc0"; then echo "DFU waiting on MMC0..."; setenv dfu_mmc_dev 0; run dfu_mmc; fi;
dfu_mmc=mmc dev ${dfu_mmc_dev}; run mmc_dfu_info; dfu 0 mmc ${dfu_mmc_dev} ${dfu_wait_timeout};
dfu_nand=run nand_dfu_info; dfu 0 mtd spi-nand0 ${dfu_wait_timeout};
dfu_nor=run nor_dfu_info; dfu 0 sf 0:0 ${dfu_wait_timeout};
dfu_wait_timeout=3
distro_bootcmd=run scan_boot_slot; run show_splash; for target in ${boot_targets}; do run bootcmd_${target}; done
fdtcontroladdr=82e5f9b0
fel_boot=echo "Booting from FEL..."; bootm ${kernel_addr_r};
kernel_addr_r=0x81000000
mmc_boot=mmc dev ${devnum}; echo "Booting from MMC${devnum}..."; load mmc ${devnum}:${mmc_bootpart} $kernel_addr_r ${mmc_kernel}; bootm ${kernel_addr_r};
mmc_bootdev=0
mmc_bootpart=2
mmc_dfu_info=setenv dfu_alt_info "all raw 0x0 0x37000;u-boot raw 0x10 0x7f0;boot part ${dfu_mmc_dev} ${mmc_bootpart};rom part ${dfu_mmc_dev} ${mmc_rootpart};kernel fat ${dfu_mmc_dev} ${mmc_bootpart}"
mmc_kernel=kernel.itb
mmc_rootpart=3
mmc_splash=splash.bmp
mmc_ubootpart=1
nand_boot=echo "Booting from SPI-NAND..."; mtd read spi-nand0 ${kernel_addr_r} ${nand_kernel_offset} ${nand_kernel_length}; bootm ${kernel_addr_r};
nand_dfu_info=setenv dfu_alt_info "all raw 0x0 ${nand_size};u-boot raw 0x0 0x80000;kernel raw ${nand_kernel_offset} ${nand_kernel_length};rom raw 0x600000 0x2a00000;vendor raw 0x3000000 0x1000000"
nand_kernel_length=0x500000
nand_kernel_offset=0x100000
nand_size=0x8000000
nand_splash_offset=0x80000
nor_boot=echo "Booting from SPI-NOR..."; sf probe; sf read ${kernel_addr_r} ${sf_kernel_offset} ${sf_kernel_length}; bootm ${kernel_addr_r};
nor_dfu_info=setenv dfu_alt_info "all raw 0x0 ${sf_size};u-boot raw 0x0 0x80000;kernel raw ${sf_kernel_offset} ${sf_kernel_length};rom raw 0x600000 0x700000"
nor_nand_boot=if test "${boot_slot_1}" = "spi-nor"; then run nor_boot; fi; if test "${boot_slot_1}" = "spi-nand"; then run nand_boot; fi;
scan_boot_slot=run scan_boot_slot_0; run scan_boot_slot_1; echo "========================="; echo "Boot Device: ${boot_device}"; echo "Boot Slot 0: ${boot_slot_0}"; echo "Boot Slot 1: ${boot_slot_1}"; echo "=========================";
scan_boot_slot_0=if mmc dev 0; then setenv boot_slot_0 mmc0; fi;
scan_boot_slot_1=if mmc dev 1; then setenv boot_slot_1 mmc1; else if sf probe; then setenv boot_slot_1 spi-nor; else if mtd list; then setenv boot_slot_1 spi-nand; fi; fi; fi;
sf_kernel_length=0x500000
sf_kernel_offset=0x100000
sf_size=0x1000000
sf_splash_offset=0x80000
show_splash=run splash_${boot_device}; bmp display ${splash_addr}; gpio set ${lcd_bl_pin};
splash_addr=0x80000000
splash_length=0x80000
splash_mmc=load mmc ${devnum}:${mmc_bootpart} ${splash_addr} ${mmc_splash};
splash_nand=mtd read spi-nand0 ${splash_addr} ${nand_splash_offset} ${splash_length};
splash_nor=sf probe; sf read ${splash_addr} ${sf_splash_offset} ${splash_length};
splash_spi=if test "${boot_slot_1}" = "spi-nor"; then run splash_nor; fi; if test "${boot_slot_1}" = "spi-nand"; then run splash_nand; fi;
stderr=serial
stdin=serial
stdout=serial
]
最后手动加了一个bootargs环境变量
[console=ttyS0,115200 rootwait init=/preinit root=/dev/mmcblk0p3 rw net.ifnames=0 vt.global_cursor_default=0]
这次成功启动了
[[ 1.735975] Waiting for root device /dev/mmcblk0p3...
[ 1.764950] mmc0: host does not support reading read-only switch, assuming write-enable
[ 1.775198] mmc0: new high speed SDHC card at address 1234
[ 1.782943] mmcblk0: mmc0:1234 SA32G 29.1 GiB
[ 1.793292] mmcblk0: p1 p2 p3
[ 1.966257] EXT4-fs (mmcblk0p3): mounted filesystem with ordered data mode. Opts: (null)
[ 1.974644] VFS: Mounted root (ext4 filesystem) on device 179:3.
[ 1.982569] devtmpfs: mounted
[ 1.991513] Freeing unused kernel memory: 1024K
[ 1.996158] Run /preinit as init process
[ 2.495549] EXT4-fs (mmcblk0p3): re-mounted. Opts: (null)
Starting syslogd: OK
Starting klogd: OK
Running sysctl: OK
Populating /dev using udev: [ 3.168942] udevd[88]: starting version 3.2.9
[ 3.314178] udevd[89]: starting eudev-3.2.9
[ 5.142050] Goodix-TS 0-005d: 0-005d supply AVDD28 not found, using dummy regulator
[ 5.150141] Goodix-TS 0-005d: 0-005d supply VDDIO not found, using dummy regulator
[ 5.178156] ov2640 0-0030: Product ID error fa:fa
[ 5.363941] Goodix-TS 0-005d: i2c test failed attempt 1: -6
[ 5.408790] Goodix-TS 0-005d: i2c test failed attempt 2: -6
[ 5.448939] Goodix-TS 0-005d: I2C communication failure: -6
done
Saving random seed: OK
Starting haveged: haveged: listening socket at 3
OK
Starting system message bus: done
Starting network: OK
Starting ofono ... done.
Starting uMTPrd: [ 8.085344] file system registered
[ 8.424268] read descriptors
[ 8.427221] read strings
OK
Welcome to Widora MangoPi R3
]
结论:
楼主的u-boot里面bootargs环境变量没有设置,kernel启动缺省从spi flash里面加载rootfs,如果是从tf卡启动的用户,需要增加这个环境变量,否则加载rootfs失败。
另外由于u-boot映像中没有包含saveenv命令,所以添加的bootargs变量无法保存,下次启动就又丢失了。要想解决问题,必须重新编译u-boot。
后记:
无意中发现,kernel 采用的bootargs来自dtb文件
[ chosen {
#address-cells = <1>;
#size-cells = <1>;
ranges;
bootargs = "console=ttyS0,115200 rootwait init=/preinit root=/dev/mtdblock2 rootfstype=squashfs overlayfsdev=/dev/mtdblock3";
simplefb_lcd: framebuffer-lcd0 {
compatible = "allwinner,simple-framebuffer",
"simple-framebuffer";
allwinner,pipeline = "de_be0-lcd0";
clocks = <&ccu CLK_BUS_DE_BE>, <&ccu CLK_DE_BE>,
<&ccu CLK_DRAM_DE_BE>, <&ccu CLK_BUS_LCD>,
<&ccu CLK_TCON>;
status = "disabled";
};
};]
感觉有点乱。。。所以,不想修改u-boot源代码,那就修改dts文件吧。
@晕哥
楼主,我用licheepi zero(V3S)。在主线5.19.3的内核中尝试初始化LCD的时候,也遇到了fb0设备不出现的问题。
按照你的方法打印了drm的初始化log
[ 0.056344] [drm:0xc070eda1] Initialized
[ 0.056506] [drm:0xc02a4577] Adding component /soc/mixer@1100000
[ 0.056609] [drm:0xc02a4577] Adding component /soc/lcd-controller@1c0c000
[ 0.056676] [drm:0xc02a43ff] Endpoint is our panel... skipping
[ 0.060684] panel-simple panel: supply power not found, using dummy regulator
[ 0.060947] panel-simple panel: Specify missing connector_type
能帮着分析一下是什么原因导致的吗?还是说V3S DE设备的初始化只能在v5.2内核版本下工作?
吊诡的是,panel设备不出现,对应的backlight设备也没有出现在设备树当中。
我用的dts文件是参照licheepi zero官方的修改而来,官方的内核版本是v5.2
[ backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm 0 1000000 0>;
brightness-levels = <0 30 40 50 60 70 100>;
default-brightness-level = <6>;
};
panel: panel {
compatible = "urt,umsh-8596md-t", "simple-panel";
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
backlight = <&backlight>;
#address-cells = <1>;
#size-cells = <0>;
panel_input: endpoint@0 {
reg = <0>;
remote-endpoint = <&tcon0_out_lcd>;
};
};
};
&de {
status = "okay";
};
&pwm {
pinctrl-names = "default";
pinctrl-0 = <&pwm0_pins>;
status = "okay";
};
&tcon0 {
pinctrl-names = "default";
pinctrl-0 = <&lcd_rgb666_pins_a>;
status = "okay";
};
&tcon0_out {
tcon0_out_lcd: endpoint@0 {
reg = <0>;
remote-endpoint = <&panel_input>;
};
};
]
官方的v5.2版本,fb设备初始化成功的时候,还有下面的打印信息,我这边就没有
[
[ 1.259771] sun8i-v3s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pe not found, using dummy regulator
[ 1.272296] sun4i-drm display-engine: bound 1100000.mixer (ops 0xc0773d40)
[ 1.279881] sun4i-drm display-engine: bound 1c0c000.lcd-controller (ops 0xc07 7103c)
[ 1.287569] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[ 1.294258] [drm] No driver support for vblank timestamp query.
[ 1.301264] [drm] Initialized sun4i-drm 1.0.0 20150629 for display-engine on
]
TKM32F499GT8评估板资料集
https://whycan.com/t_5861.html18、TK499_LCD_TK035F5589_TK80_DMA例程.rar
楼主你用的是这个Demo吗? 是基于这个Demo 修改吗?
你发的这个例程是并口的,我用的是spi串口初始化的。我看了一下寄存器设置也不太一样。
@memory
这是我们的初始化代码,可以看到读device id都是成功的,就是代码中的byte1和byte2。感觉spi口时序已经对了。
{
unsigned char byte1,byte2;
/* Initialize the pins */
if (r61408_enable_gpio(cfg) != 0)
return ;
gpio_set_value(cfg->csx_pin, 1);
mdelay(20);
gpio_set_value(cfg->csx_pin, 0);
gpio_set_value(cfg->reset_pin, 0);
mdelay(200);
gpio_set_value(cfg->reset_pin, 1);
mdelay(200);
#if 1
// Enter read mode
SPI_WriteComm(0xB0);
SPI_WriteData(0x04);
SPI_WriteComm(0xBF);
SPI_ReadData();
printf("DDB0=%x, DDB1=%x\n", SPI_ReadData(), SPI_ReadData());
byte1 = SPI_ReadData();
byte2 = SPI_ReadData();
// Enter read mode
SPI_WriteComm(0xB0);
SPI_WriteData(0x04);
if (byte1==0x15 && byte2==0x29) {
printf("R61259 found!\n");
r61529_Reg_Fill();
}
gpio_set_value(cfg->csx_pin, 1);
#else
#endif
}
static void r61529_Reg_Fill(void)
{
SPI_WriteComm(0xB4);
SPI_WriteData(0x00);
SPI_WriteComm(0xB0);
SPI_WriteData(0x04);
SPI_WriteComm(0x20);
SPI_WriteComm(0x36); //Set_address_mode
SPI_WriteData(0x6A); //
SPI_WriteComm(0x3A);
SPI_WriteData(0x77);
SPI_WriteComm(0xB3);
SPI_WriteData(0x02);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x20);
SPI_WriteComm(0xc0);
SPI_WriteData(0x03);
SPI_WriteData(0xdf);
SPI_WriteData(0x40);
SPI_WriteData(0x12);
SPI_WriteData(0x00);
SPI_WriteData(0x01);
SPI_WriteData(0x00);
SPI_WriteData(0x55);//
SPI_WriteComm(0xc1);
SPI_WriteData(0x07);
SPI_WriteData(0x28);
SPI_WriteData(0x08);//
SPI_WriteData(0x08);//
SPI_WriteData(0x00);//
SPI_WriteComm(0xc4);
SPI_WriteData(0x70);//
SPI_WriteData(0x00);
SPI_WriteData(0x03);
SPI_WriteData(0x01);
SPI_WriteComm(0xc6);
SPI_WriteData(0x1d);//1d
SPI_WriteComm(0xc8);
SPI_WriteData(0x06);
SPI_WriteData(0x0c);
SPI_WriteData(0x16);
SPI_WriteData(0x24);
SPI_WriteData(0x30);
SPI_WriteData(0x48);
SPI_WriteData(0x3d);
SPI_WriteData(0x28);
SPI_WriteData(0x20);
SPI_WriteData(0x14);
SPI_WriteData(0x0c);
SPI_WriteData(0x04);
SPI_WriteData(0x06);
SPI_WriteData(0x0C);
SPI_WriteData(0x16);
SPI_WriteData(0x24);
SPI_WriteData(0x30);
SPI_WriteData(0x48);
SPI_WriteData(0x3D);
SPI_WriteData(0x28);
SPI_WriteData(0x20);
SPI_WriteData(0x14);
SPI_WriteData(0x0C);
SPI_WriteData(0x04);
SPI_WriteComm(0xC9);
SPI_WriteData(0x06);
SPI_WriteData(0x0C);
SPI_WriteData(0x16);
SPI_WriteData(0x24);
SPI_WriteData(0x30);
SPI_WriteData(0x48);
SPI_WriteData(0x3D);
SPI_WriteData(0x28);
SPI_WriteData(0x20);
SPI_WriteData(0x14);
SPI_WriteData(0x0C);
SPI_WriteData(0x04);
SPI_WriteData(0x06);
SPI_WriteData(0x0C);
SPI_WriteData(0x16);
SPI_WriteData(0x24);
SPI_WriteData(0x30);
SPI_WriteData(0x48);
SPI_WriteData(0x3D);
SPI_WriteData(0x28);
SPI_WriteData(0x20);
SPI_WriteData(0x14);
SPI_WriteData(0x0C);
SPI_WriteData(0x04);
SPI_WriteComm(0xCA);
SPI_WriteData(0x06);
SPI_WriteData(0x0C);
SPI_WriteData(0x16);
SPI_WriteData(0x24);
SPI_WriteData(0x30);
SPI_WriteData(0x48);
SPI_WriteData(0x3D);
SPI_WriteData(0x28);
SPI_WriteData(0x20);
SPI_WriteData(0x14);
SPI_WriteData(0x0C);
SPI_WriteData(0x04);
SPI_WriteData(0x06);
SPI_WriteData(0x0C);
SPI_WriteData(0x16);
SPI_WriteData(0x24);
SPI_WriteData(0x30);
SPI_WriteData(0x48);
SPI_WriteData(0x3D);
SPI_WriteData(0x28);
SPI_WriteData(0x20);
SPI_WriteData(0x14);
SPI_WriteData(0x0C);
SPI_WriteData(0x04);
SPI_WriteComm(0xD0);
SPI_WriteData(0x95);
SPI_WriteData(0x0A);
SPI_WriteData(0x08);
SPI_WriteData(0x10);
SPI_WriteData(0x39);
SPI_WriteComm(0xD1);
SPI_WriteData(0x02);
SPI_WriteData(0x2c);//
SPI_WriteData(0x2c);//
SPI_WriteData(0x44);//
SPI_WriteData(0x00);//0x08
SPI_WriteComm(0x11);
mdelay(100);
SPI_WriteComm(0x29);
mdelay(100);
SPI_WriteComm(0x2C);
SPI_WriteComm(0x36);
#if LCD_RGB_ORIENTATION //
SPI_WriteData(0x09);
#else
SPI_WriteData(0x08);
#endif
}
@memory
我们的初始化代码,RGB时序都是根据卖家提供的一大堆资料连蒙带猜出来的。上逻辑分析仪当然可以,但是最好卖家能确认一下我们当前的设置是不是对的。
感觉卖家的态度就是,一切都由买家自己决定。。。
下面是卖家提供的初始化代码。比如第一条指令0xB4和第二条指令0xB0,按照瑞萨R61529的手册,必须先执行0xB0指令打开寄存器保护,否则任何寄存器访问都是无效的。也就是说第一条指令0xB4是一个无效访问。
void Lcd_Initialize(void) //LCD初始化函数
{
LCD_SPI_CS(1);
LCD_delay(20);
LCD_SPI_CS(0);
LCD_Reset();
SPI_WriteComm(0xB4);
SPI_WriteData(0x00);
SPI_WriteComm(0xB0);
SPI_WriteData(0x04);
SPI_WriteComm(0x20);
SPI_WriteComm(0x36); //Set_address_mode
SPI_WriteData(0x6A); //横屏
SPI_WriteComm(0x3A);
SPI_WriteData(0x77);
SPI_WriteComm(0xB3);
SPI_WriteData(0x02);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x20);
SPI_WriteComm(0xc0);
SPI_WriteData(0x03);
SPI_WriteData(0xdf);
SPI_WriteData(0x40);
SPI_WriteData(0x12);
SPI_WriteData(0x00);
SPI_WriteData(0x01);
SPI_WriteData(0x00);
SPI_WriteData(0x55);//
SPI_WriteComm(0xc1);
SPI_WriteData(0x07);
SPI_WriteData(0x28);
SPI_WriteData(0x08);//
SPI_WriteData(0x08);//
SPI_WriteData(0x00);//
SPI_WriteComm(0xc4);
SPI_WriteData(0x70);//
SPI_WriteData(0x00);
SPI_WriteData(0x03);
SPI_WriteData(0x01);
SPI_WriteComm(0xc6);
SPI_WriteData(0x1d);//1d
SPI_WriteComm(0xc8);
SPI_WriteData(0x06);
SPI_WriteData(0x0c);
SPI_WriteData(0x16);
SPI_WriteData(0x24);
SPI_WriteData(0x30);
SPI_WriteData(0x48);
SPI_WriteData(0x3d);
SPI_WriteData(0x28);
SPI_WriteData(0x20);
SPI_WriteData(0x14);
SPI_WriteData(0x0c);
SPI_WriteData(0x04);
SPI_WriteData(0x06);
SPI_WriteData(0x0C);
SPI_WriteData(0x16);
SPI_WriteData(0x24);
SPI_WriteData(0x30);
SPI_WriteData(0x48);
SPI_WriteData(0x3D);
SPI_WriteData(0x28);
SPI_WriteData(0x20);
SPI_WriteData(0x14);
SPI_WriteData(0x0C);
SPI_WriteData(0x04);
SPI_WriteComm(0xC9);
SPI_WriteData(0x06);
SPI_WriteData(0x0C);
SPI_WriteData(0x16);
SPI_WriteData(0x24);
SPI_WriteData(0x30);
SPI_WriteData(0x48);
SPI_WriteData(0x3D);
SPI_WriteData(0x28);
SPI_WriteData(0x20);
SPI_WriteData(0x14);
SPI_WriteData(0x0C);
SPI_WriteData(0x04);
SPI_WriteData(0x06);
SPI_WriteData(0x0C);
SPI_WriteData(0x16);
SPI_WriteData(0x24);
SPI_WriteData(0x30);
SPI_WriteData(0x48);
SPI_WriteData(0x3D);
SPI_WriteData(0x28);
SPI_WriteData(0x20);
SPI_WriteData(0x14);
SPI_WriteData(0x0C);
SPI_WriteData(0x04);
SPI_WriteComm(0xCA);
SPI_WriteData(0x06);
SPI_WriteData(0x0C);
SPI_WriteData(0x16);
SPI_WriteData(0x24);
SPI_WriteData(0x30);
SPI_WriteData(0x48);
SPI_WriteData(0x3D);
SPI_WriteData(0x28);
SPI_WriteData(0x20);
SPI_WriteData(0x14);
SPI_WriteData(0x0C);
SPI_WriteData(0x04);
SPI_WriteData(0x06);
SPI_WriteData(0x0C);
SPI_WriteData(0x16);
SPI_WriteData(0x24);
SPI_WriteData(0x30);
SPI_WriteData(0x48);
SPI_WriteData(0x3D);
SPI_WriteData(0x28);
SPI_WriteData(0x20);
SPI_WriteData(0x14);
SPI_WriteData(0x0C);
SPI_WriteData(0x04);
SPI_WriteComm(0xD0);
SPI_WriteData(0x95);
SPI_WriteData(0x0A);
SPI_WriteData(0x08);
SPI_WriteData(0x10);
SPI_WriteData(0x39);
SPI_WriteComm(0xD1);
SPI_WriteData(0x02);
SPI_WriteData(0x2c);//
SPI_WriteData(0x2c);//
SPI_WriteData(0x44);//
SPI_WriteData(0x00);//0x08
SPI_WriteComm(0x11);
LCD_delay(100);
SPI_WriteComm(0x29);
LCD_delay(100);
SPI_WriteComm(0x2C);
SPI_WriteComm(0x36);
#if LCD_RGB_ORIENTATION //是否旋转90度
SPI_WriteData(0x09);
#else
SPI_WriteData(0x08);
#endif
}
页次: 1