add lt8911exb driver

This commit is contained in:
hyx 2026-04-02 19:13:49 +08:00
parent 6e767291b5
commit 5516f07924
38 changed files with 1712 additions and 138 deletions

View File

@ -1,5 +1,6 @@
make distclean
rm source/uboot-2021.10/include/configs/image_cfg.json
#rm source/uboot-2021.10/include/configs/image_cfg.json
rm -fr output/*
rm tools/scripts/Cryptodome/Cipher/AES.pyc
rm tools/scripts/Cryptodome/Cipher/__init__.pyc
rm tools/scripts/Cryptodome/Cipher/_mode_cbc.pyc

View File

@ -39,6 +39,7 @@ CONFIG_BT_HCIUART=y
CONFIG_BT_HCIUART_H4=y
CONFIG_BT_HCIUART_RTL=y
CONFIG_CFG80211=y
# CONFIG_CFG80211_CRDA_SUPPORT is not set
CONFIG_CFG80211_WEXT=y
CONFIG_MAC80211=y
CONFIG_RFKILL=y
@ -98,7 +99,6 @@ CONFIG_INPUT_EVDEV=y
CONFIG_KEYBOARD_GPIO=y
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_ARTINCHIP=y
CONFIG_TOUCHSCREEN_GT9XX=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
@ -127,11 +127,12 @@ CONFIG_FB=y
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_BACKLIGHT_PWM=y
CONFIG_BACKLIGHT_GPIO=y
CONFIG_LT8911EXB=y
CONFIG_ARTINCHIP_GE=y
CONFIG_ARTINCHIP_VE=y
CONFIG_ARTINCHIP_FB=y
CONFIG_AIC_DISP_LVDS=y
CONFIG_AIC_PANEL_LVDS_GENERAL=y
CONFIG_AIC_DISP_MIPI_DSI=y
CONFIG_AIC_PANEL_DSI_SIMPLE=y
CONFIG_SOUND=y
CONFIG_SND=y
CONFIG_SND_SOC=y

View File

@ -24,6 +24,7 @@ source "drivers/video/fbdev/Kconfig"
endmenu
source "drivers/video/backlight/Kconfig"
source "drivers/video/lt8911exb/Kconfig"
config VGASTATE
tristate

View File

@ -9,6 +9,7 @@ obj-y += backlight/
obj-y += fbdev/
obj-y += artinchip/
obj-y += lt8911exb/
obj-$(CONFIG_VIDEOMODE_HELPERS) += display_timing.o videomode.o
ifeq ($(CONFIG_OF),y)

View File

@ -71,15 +71,15 @@ static struct aic_panel_funcs panel_funcs = {
/* Init the videomode parameter, dts will override the initial value. */
static struct videomode panel_vm = {
.pixelclock = 130000000,
.hactive = 1200,
.hfront_porch = 160,
.hback_porch = 160,
.hsync_len = 40,
.vactive = 1920,
.vfront_porch = 10,
.vback_porch = 20,
.vsync_len = 8,
.pixelclock = 150 * 1000 * 1000,
.hactive = 1920,
.hfront_porch = 188,
.hback_porch = 148,
.hsync_len = 44,
.vactive = 1080,
.vfront_porch = 4,
.vback_porch = 36,
.vsync_len = 5,
.flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE
};

View File

@ -0,0 +1,10 @@
config LT8911EXB
tristate "LT8911EXB Driver"
default n
help
Control LT8911EXB Chip
Select m:build as a separate module;
Select y:Build into the kernel
Select n:Not build

View File

@ -0,0 +1,32 @@
#include "include/include.h"
bool g_irq_flag = 0;
int LT8911EXB_Main(void *data)
{
printk("LT8911EXB Init Start:");
LT8911_Reset();
msleep(100);
LT8911_ChipID();
LT8911_SetVideoTiming(&video);
LT8911_Init(&video);
LT8911_LinkTrain();
LT8911_LinkTrainResultCheck();
LT8911_video_check() ;
LT8911_pcr_mk_printk();
LT8911_htotal_stable_printk();
while(!atomic_read(&thread_should_stop))
{
LT8911_MainLoop(&video);
msleep(500);
}
return 0;
}

View File

@ -0,0 +1,283 @@
#include "include/include.h"
struct _lt8911exb *lt8911exb;
static struct task_struct *kthread_obj;
atomic_t thread_should_stop = ATOMIC_INIT(0);
char *ChipName = "lt8911exb"; //Define Lontium Chip Name
static int major = 0;
static struct cdev chip_cdev;
static struct class *chip_class;
static int chip_open(struct inode *inode, struct file *filp)
{
printk("chip open\n");
return 0;
}
static int chip_close (struct inode *node, struct file *file)
{
printk("chip close\n");
return 0;
}
static ssize_t chip_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
{
Chip_Control_Args parameter;
if (copy_from_user(&parameter, buf, sizeof(parameter))) {
return -EFAULT;
}
parameter.value = HDMI_ReadI2C_Byte(parameter.address);
if (copy_to_user(buf, &parameter, sizeof(parameter))) {
return -EFAULT;
}
return sizeof(parameter);
}
static ssize_t chip_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
{
Chip_Control_Args parameter;
if (copy_from_user(&parameter, buf, sizeof(parameter))) {
return -EFAULT;
}
HDMI_WriteI2C_Byte(parameter.address, parameter.value);
return sizeof(parameter);
}
static struct file_operations chip_drv = {
.owner = THIS_MODULE,
.open = chip_open,
.release = chip_close,
.read = chip_read,
.write = chip_write,
};
static int chip_dev_init(void)
{
int ret;
dev_t devid;
ret = alloc_chrdev_region(&devid, 0, 1, ChipName);
if (ret < 0) {
return ret;
}
major = MAJOR(devid);
cdev_init(&chip_cdev, &chip_drv);
cdev_add(&chip_cdev, devid, 1);
chip_class = class_create(THIS_MODULE, "chip_class");
if (IS_ERR(chip_class)) {
unregister_chrdev(major, ChipName);
return -1;
}
device_create(chip_class, NULL, MKDEV(major, 0), NULL, ChipName); /* /dev/ChipName */
return 0;
}
static void chip_dev_exit(void)
{
device_destroy(chip_class, MKDEV(major, 0));
class_destroy(chip_class);
cdev_del(&chip_cdev);
unregister_chrdev_region(MKDEV(major,0), 1);
}
static const struct regmap_range chip_ranges[] = {
{ .range_min = 0, .range_max = 0xffff },
};
static const struct regmap_access_table chip_table = {
.yes_ranges = chip_ranges,
.n_yes_ranges = ARRAY_SIZE(chip_ranges),
};
static const struct regmap_config chip_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
.volatile_table = &chip_table,
.cache_type = REGCACHE_NONE,
};
/*
* devm_gpiod_get_optional - If this fails, NULL is returned and no error pointer.
*
* devm_gpiod_get - If this fails, an error pointer is returned, usually ERR_PTR(-ENOENT).
*
* The devm_gpiod_get function is recommended for practical use.
*/
static int chip_parse_dts(struct device *dev)
{
//Gets the handle to power gpio in dts
lt8911exb->power_gpio=devm_gpiod_get_optional(dev, "power", GPIOD_OUT_LOW);
if (IS_ERR(lt8911exb->power_gpio)) {
dev_err(dev, "Failed to get power GPIO\n");
return PTR_ERR(lt8911exb->power_gpio);
}
//Gets the handle to reset gpio in dts
lt8911exb->reset_gpio=devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
if (IS_ERR(lt8911exb->reset_gpio)) {
dev_err(dev, "Failed to get reset GPIO\n");
return PTR_ERR(lt8911exb->reset_gpio);
}
// Additional GPIO pins can be added here if needed
return 0;
}
static int chip_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
int ret;
chip_dev_init();
lt8911exb = devm_kzalloc(&client->dev, sizeof(*lt8911exb), GFP_KERNEL);
if (lt8911exb == NULL)
return -ENOMEM;
lt8911exb->trans_i2c = client;
lt8911exb->dev = &client->dev;
lt8911exb->chip_regmap = devm_regmap_init_i2c(client, &chip_regmap_config);
if (IS_ERR(lt8911exb->chip_regmap)) {
dev_err(&client->dev, "Failed to initialize regmap\n");
return PTR_ERR(lt8911exb->chip_regmap);
}
ret = chip_parse_dts(lt8911exb->dev);
if (ret<0){
dev_err(&client->dev, "Failed to parse device tree\n");
return ret;
}
i2c_set_clientdata(client, lt8911exb);
kthread_obj = kthread_run(LT8911EXB_Main, NULL, "LT8911EXB_kthread");
if (IS_ERR(kthread_obj)) {
kthread_obj = NULL;
chip_dev_exit();
dev_err(&client->dev, "Failed to create kernel thread\n");
return PTR_ERR(kthread_obj);
}
return 0;
}
static int chip_remove(struct i2c_client *client)
{
if (kthread_obj) {
atomic_set(&thread_should_stop, 1);
kthread_stop(kthread_obj);
kthread_obj = NULL;
}
chip_dev_exit();
printk("driver removed\n");
return 0;
}
static int chip_suspend(struct device *dev)
{
//power off
atomic_set(&thread_should_stop, 1);
kthread_stop(kthread_obj);
msleep(5);
gpiod_set_value(lt8911exb->power_gpio,0);
printk(KERN_INFO "lt8911exb Suspend");
return 0;
}
static int chip_resume(struct device *dev)
{
//power on
gpiod_set_value(lt8911exb->power_gpio,1);
msleep(5);
atomic_set(&thread_should_stop, 0);
kthread_obj = kthread_run(LT8911EXB_Main, NULL, "LT8911EXB_kthread");
printk(KERN_INFO "lt8911exb Resume");
return 0;
}
static const struct dev_pm_ops chip_pm_ops = {
.suspend = chip_suspend,
.resume = chip_resume,
};
static const struct i2c_device_id chip_ids[] = {
{"lt8911exb", 0},
{ }
};
MODULE_DEVICE_TABLE(i2c, chip_ids);
static const struct of_device_id chip_id_table[] = {
{.compatible = "lontium,lt8911exb"},
{ }
};
MODULE_DEVICE_TABLE(of, chip_id_table);
static struct i2c_driver chip_driver = {
.driver = {
.owner = THIS_MODULE,
.name = "lt8911exb",
.pm = &chip_pm_ops,
.of_match_table = chip_id_table,
},
.probe = chip_probe,
.remove = chip_remove,
.id_table = chip_ids,
};
module_i2c_driver(chip_driver);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("LT8911EXB driver");
MODULE_AUTHOR("Tony <syyang@lontium.com>");

View File

@ -0,0 +1,5 @@
lt8911exb-y := LontiumDrv.o LT8911EXB_Main.o OcmI2cMaster.o lt8911.o
obj-$(CONFIG_LT8911EXB) += lt8911exb.o

View File

@ -0,0 +1,72 @@
#include "include/include.h"
static unsigned char g_ucLogLevel = LOG_DEBUG;
static char *messageTypeStr[] = {"DEBUG","INFO","WARN", "ERROR","CRIT"};
//void Ocm_PrintLevel_Set(unsigned char ucLvl)
//{
// g_ucLogLevel = ucLvl;
//}
void LTLog(unsigned char ucLvl, const char *fmt, ...)
{
char buf[MAX_NUMBER_BYTES] = {0};
va_list args;
if (ucLvl > LOG_NOTRACE)
{
return;
}
//打印大于等于该级别的字符串
if(ucLvl >= g_ucLogLevel)
{
va_start(args, fmt);
vsprintf(buf, fmt, args);
va_end(args);
//左对齐5个字符
printk("\n[%-5s] %s", messageTypeStr[ucLvl], buf);
}
}
int HDMI_WriteI2C_Byte(u8 addr,u8 data)
{
int ret = 0;
ret = regmap_write(lt8911exb->chip_regmap, addr, data);
if (ret < 0) {
printk("regmap_write error: (0x%02x 0x%02x 0x%02x) %d",
lt8911exb->trans_i2c->addr, addr, data, ret);
return ret;
}
return 0;
}
int HDMI_ReadI2C_Byte(u8 addr)
{
int ret = 0;
unsigned int val = 0;
ret = regmap_read(lt8911exb->chip_regmap, addr, &val);
if (ret < 0) {
printk("regmap_read error: (0x%02x 0x%02x) %d",
lt8911exb->trans_i2c->addr, addr, ret);
return ret;
}
return (u8)val;
}
EXPORT_SYMBOL(HDMI_WriteI2C_Byte);
EXPORT_SYMBOL(HDMI_ReadI2C_Byte);

View File

@ -0,0 +1,11 @@
#ifndef _LT8911EXB_MAIN_H_
#define _LT8911EXB_MAIN_H_
extern bool g_irq_flag;
extern int LT8911EXB_Main(void *data);
#endif

View File

@ -0,0 +1,27 @@
#ifndef _LONTIUMDRV_H_
#define _LONTIUMDRV_H_
struct _lt8911exb{
struct device *dev;
struct mutex ocm_lock;
struct gpio_desc *reset_gpio;
struct gpio_desc *power_gpio;
struct i2c_client *trans_i2c;
struct regmap *chip_regmap;
};
typedef struct
{
u8 address; // 寄存器地址
u8 value; // 寄存器值
} Chip_Control_Args;
extern struct _lt8911exb *lt8911exb;
extern atomic_t thread_should_stop;
#endif

View File

@ -0,0 +1,22 @@
#ifndef _OCMI2CMASTER_H_
#define _OCMI2CMASTER_H_
#define MAX_NUMBER_BYTES 128
typedef enum
{
LOG_DEBUG =0x00,
LOG_INFO,
LOG_WARN,
LOG_ERROR,
LOG_CRITICAL,
LOG_NOTRACE,
} LT_LogLevel;
void LTLog(unsigned char ucLvl, const char *fmt, ...);
extern int HDMI_WriteI2C_Byte(u8 addr,u8 data);
extern int HDMI_ReadI2C_Byte(u8 addr);
#endif

View File

@ -0,0 +1,39 @@
#ifndef _INCLUDE_H_
#define _INCLUDE_H_
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/regmap.h>
#include <linux/gpio.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/printk.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/kmod.h>
#include <linux/gfp.h>
#include <linux/module.h>
#include <linux/kthread.h>
#include <linux/atomic.h>
#include "type.h"
#include "LontiumDrv.h"
#include "LT8911EXB_Main.h"
#include "lt8911.h"
#include "OcmI2cMaster.h"
#endif

View File

@ -0,0 +1,72 @@
#ifndef _LT8911EXB_H_
#define _LT8911EXB_H_
//////////////////////LT8911 Config///////////////////
//#define _1920x1200_eDP_Panel_
#define _1080P_eDP_Panel_
//#define _1366x768_eDP_Panel_
//#define _1280x800_eDP_Panel_
//#define _1600x900_eDP_Panel_
#define SCRAMBLE_MODE 0x00 //0x80: edp, 0x00: dp
//#define sync_polarity 0x00 //0x00: no_adj; 0x20: vs_adj; 0x10: hs_adj; 0x30: H/Vs adj;
//#define _6bit_
//#define _dither_enable_
#define _eDP_2G7_
//#define _eDP_1G62_
#define _link_train_enable_
//////////option for debug///////////
//#define _read_edid_
//#define _EDP_Pattern_
//#define _Msa_Active_Only_
#define _pcr_mk_printk_
#define _htotal_stable_check_
//#define _gpio_sync_output_
//#define sync_source 0x01 //gpio output lvds Rx sync
#define sync_source 0x02 //gpio output lvds portA sync
//#define sync_source 0x03 //gpio output lvds portB sync
//gpio2: de, gpio3: vs, gpio4: hs.
struct video_timing{
u16 hfp;
u16 hs;
u16 hbp;
u16 hact;
u16 htotal;
u16 vfp;
u16 vs;
u16 vbp;
u16 vact;
u16 vtotal;
u32 pclk_khz;
};
struct Lane_No{
u8 swing_high_byte;
u8 swing_low_byte;
u8 emph_high_byte;
u8 emph_low_byte;
};
extern struct video_timing video;
extern void LT8911_Reset(void);
extern void LT8911_ChipID(void);
extern void LT8911_SetVideoTiming(struct video_timing *video_format);
extern void LT8911_Init(struct video_timing *video_format);
extern void LT8911_LinkTrain(void);
extern void LT8911_LinkTrainResultCheck(void);
extern void LT8911_video_check(void);
extern void LT8911_pcr_mk_printk(void);
extern void LT8911_htotal_stable_printk(void);
extern void LT8911_MainLoop(struct video_timing *video_format);
#endif

View File

@ -0,0 +1,10 @@
#ifndef _TYPE_H_
#define _TYPE_H_
#define HIGH 1
#define LOW 0
#endif

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,4 @@
---- LT8911_Init Matches (3 in 3 files) ----
Lt8911.c (d:\龙迅产品程序整理(深圳)\lt8911\lt8911\lt8911exb\democode\for linux\lt8911exb_linux_driver_v1.0.2):void LT8911_Init(struct video_timing *video_format)
Lt8911.h (d:\龙迅产品程序整理(深圳)\lt8911\lt8911\lt8911exb\democode\for linux\lt8911exb_linux_driver_v1.0.2\include):extern void LT8911_Init(struct video_timing *video_format);
LT8911EXB_Main.c (d:\龙迅产品程序整理(深圳)\lt8911\lt8911\lt8911exb\democode\for linux\lt8911exb_linux_driver_v1.0.2): LT8911_Init();

Binary file not shown.

View File

@ -138,8 +138,8 @@ CONFIG_DM_VIDEO=y
CONFIG_DISPLAY=y
CONFIG_ARTINCHIP_GRAPHICS=y
CONFIG_VIDEO_ARTINCHIP=y
CONFIG_AIC_DISP_LVDS=y
CONFIG_AIC_PANEL_LVDS_GENERAL=y
CONFIG_AIC_DISP_MIPI_DSI=y
CONFIG_AIC_PANEL_DSI_SIMPLE=y
# CONFIG_WATCHDOG is not set
# CONFIG_WATCHDOG_AUTOSTART is not set
CONFIG_WDT=y

View File

@ -139,12 +139,16 @@ static struct aic_pll clk_plls[] = {
0, AIC_PLL_INT),
CLK_PLL(CLK_PLL_INT1, PLL_INT1_GEN_REG, PLL_INT1_CFG_REG,
0, AIC_PLL_INT),
// CLK_PLL(CLK_PLL_FRA0, PLL_FRA0_GEN_REG, PLL_FRA0_CFG_REG,
// PLL_FRA0_SDM_REG, AIC_PLL_SDM),
CLK_PLL(CLK_PLL_FRA0, PLL_FRA0_GEN_REG, PLL_FRA0_CFG_REG,
PLL_FRA0_SDM_REG, AIC_PLL_SDM),
PLL_FRA0_SDM_REG, AIC_PLL_FRA),
CLK_PLL(CLK_PLL_FRA1, PLL_FRA1_GEN_REG, PLL_FRA1_CFG_REG,
PLL_FRA1_SDM_REG, AIC_PLL_FRA),
// CLK_PLL_VIDEO(CLK_PLL_FRA2, PLL_FRA2_GEN_REG, PLL_FRA2_CFG_REG,
// PLL_FRA2_SDM_REG, AIC_PLL_SDM, 0, 1200000000),
CLK_PLL_VIDEO(CLK_PLL_FRA2, PLL_FRA2_GEN_REG, PLL_FRA2_CFG_REG,
PLL_FRA2_SDM_REG, AIC_PLL_SDM, 0, 1200000000),
PLL_FRA2_SDM_REG, AIC_PLL_FRA, 0, 1200000000),
};

View File

@ -192,6 +192,16 @@ static const struct spinand_info gigadevice_spinand_table[] = {
SPINAND_HAS_QE_BIT,
SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
gd5fxgq4uexxg_ecc_get_status)),
SPINAND_INFO("GD5F2GM7UEY1G",
SPINAND_ID(0x92),
NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
NAND_ECCREQ(8, 512),
SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
&write_cache_variants,
&update_cache_variants),
SPINAND_HAS_QE_BIT,
SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
gd5fxgq4uexxg_ecc_get_status)),
};
static int gigadevice_spinand_detect(struct spinand_device *spinand)

View File

@ -62,6 +62,15 @@ static struct aic_panel_funcs panel_funcs = {
/* Init the videomode parameter, dts will override the initial value. */
static struct fb_videomode panel_vm = {
.pixclock = 150 * 1000 * 1000,
.xres = 1920,
.right_margin = 188,
.left_margin = 148,
.hsync_len = 44,
.yres = 1080,
.lower_margin = 4,
.upper_margin = 36,
.vsync_len = 5,
.flag = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE
};

View File

@ -0,0 +1 @@
/home/hyx/work/linuxOS_D21X/target/d211/demo128_nand/image_cfg.json

View File

@ -35,7 +35,6 @@ BR2_LINUX_KERNEL_DEFCONFIG="d211_demo128_nand"
BR2_LINUX_KERNEL_IMAGEGZ=y
BR2_PACKAGE_LINUX_TOOLS_SELFTESTS=y
# BR2_PACKAGE_AIC_AUTHORIZATION is not set
BR2_PACKAGE_LVGL_UI=y
# BR2_PACKAGE_TEST_DVP is not set
# BR2_PACKAGE_TEST_TOUCHSCREEN is not set
BR2_PACKAGE_BUSYBOX_CONFIG="package/third-party/busybox/configs/d211_demo128_nand_defconfig"

View File

@ -34,7 +34,7 @@ kernel_comp_size=0x1000000
# set_commonargs=setenv bootargs earlycon=${earlycon} earlyprintk rdinit=${init} initramfs_dbg=${ramfs_dbg}
set_commonargs_recovery=setenv bootargs earlycon=${earlycon} earlyprintk rdinit=/linuxrc
# Case 2: Mount rootfs directly
set_commonargs=setenv bootargs quiet earlycon=${earlycon} earlyprintk init=/linuxrc firmware_class.path=/etc/firmware
set_commonargs=setenv bootargs earlycon=${earlycon} earlyprintk init=/linuxrc firmware_class.path=/etc/firmware
#===============================================================================

View File

@ -167,90 +167,31 @@
};
#endif
panel_rgb {
compatible = "artinchip,aic-general-rgb-panel";
status = "disabled";
enable-gpios = <&gpio_e 19 GPIO_ACTIVE_HIGH>;
rgb-mode = <PRGB>;
interface-format = <PRGB_16BIT_LD>;
clock-phase = <DEGREE_0>;
data-order = <RGB>;
disp-dither = <DITHER_RGB565>;
panel_dsi {
compatible = "artinchip,aic-dsi-panel-simple";
u-boot,dm-pre-reloc;
port {
u-boot,dm-pre-reloc;
panel_rgb_in: endpoint {
remote-endpoint = <&rgb0_out>;
u-boot,dm-pre-reloc;
};
};
display-timings {
native-mode = <&timing0>;
u-boot,dm-pre-reloc;
timing0: 1024x600 {
clock-frequency = <52000000>;
hactive = <1024>;
vactive = <600>;
hback-porch = <160>;
hfront-porch = <160>;
hsync-len = <20>;
vback-porch = <12>;
vfront-porch = <20>;
vsync-len = <3>;
de-active = <1>;
pixelclk-active = <1>;
u-boot,dm-pre-reloc;
};
};
};
panel_lvds {
compatible = "artinchip,aic-general-lvds-panel";
data-mapping = "vesa-24";
data-channel = "single-link1";
backlight = <&backlight>;
status = "okay";
u-boot,dm-pre-reloc;
enable-gpios = <&gpio_c 7 GPIO_ACTIVE_HIGH>;
sleep-gpios = <&gpio_a 3 GPIO_ACTIVE_HIGH>;
//reset-gpios = <&gpio_e 1 GPIO_ACTIVE_HIGH>;
port {
panel_lvds_in: endpoint {
remote-endpoint = <&lvds0_out>;
u-boot,dm-pre-reloc;
};
};
display-timings {
native-mode = <&timing1>;
u-boot,dm-pre-reloc;
timing1: 1024x600 {
clock-frequency = <52000000>;
hactive = <1024>;
vactive = <600>;
hback-porch = <160>;
hfront-porch = <160>;
hsync-len = <20>;
vback-porch = <20>;
vfront-porch = <12>;
vsync-len = <3>;
de-active = <1>;
pixelclk-active = <1>;
panel_dsi_in: endpoint {
u-boot,dm-pre-reloc;
remote-endpoint = <&dsi0_out>;
};
};
};
};
backlight: backlight {
compatible = "pwm-backlight";
/* pwm node name; pwm device No.; period_ns; pwm_polarity */
pwms = <&pwm 3 1000000 0>;
pwms = <&pwm 0 1000000 0>;
brightness-levels = <0 10 20 30 40 50 60 70 80 90 100>;
default-brightness-level = <6>;
u-boot,dm-pre-reloc;
status = "disabled";
status = "okay";
};
rfkill_bt {
compatible = "rfkill-gpio";
@ -409,11 +350,16 @@
&i2c0 {
pinctrl-names = "default";
pinctrl-0 = <&i2c0_pins_b>;
status = "disabled";
rtc@32 {
compatible = "epson,rx8010";
reg = <0x32>;
status = "okay";
lt8911exb@29 {
status = "okay";
compatible = "lontium,lt8911exb";
reg = <0x29>;
reset-gpios = <&gpio_e 6 GPIO_ACTIVE_HIGH>;
power-gpios = <&gpio_e 2 GPIO_ACTIVE_HIGH>;
};
};
&i2c1 {
@ -431,10 +377,10 @@
&i2c3 {
pinctrl-names = "default";
pinctrl-0 = <&i2c3_pins_a>;
status = "okay";
status = "disabled";
gt9xx@5d {
status = "okay";
status = "disabled";
compatible = "goodix,gt9xx";
reg = <0x5d>;
reset-gpios = <&gpio_a 8 GPIO_ACTIVE_LOW>;
@ -610,9 +556,9 @@
};
};
pwm3_pins_d: pwm3-3 {
pwm0_pins_d: pwm0-3 {
pins {
pinmux = <AIC_PINMUX('E', 19, 5)>;
pinmux = <AIC_PINMUX('E', 1, 8)>;
bias-disable;
drive-strength = <3>;
};
@ -643,12 +589,12 @@
gpio_f: bank-5 {
u-boot,dm-pre-reloc;
};
lvds1_pins: lvds1-0 {
u-boot,dm-pre-reloc;
pins {
u-boot,dm-pre-reloc;
};
};
dsi_pins: dsi-0 {
u-boot,dm-pre-reloc;
pins {
u-boot,dm-pre-reloc;
};
};
uart0_pins_a: uart0-0 {
u-boot,dm-pre-reloc;
pins1 {
@ -664,6 +610,12 @@
u-boot,dm-pre-reloc;
};
};
pwm0_pins_d: pwm0-3 {
u-boot,dm-pre-reloc;
pins {
u-boot,dm-pre-reloc;
};
};
sdmc1_pins: sdmc1-0 {
u-boot,dm-pre-reloc;
pins {
@ -683,7 +635,7 @@
aic,use_extclk;
status = "okay";
status = "disabled";
gmac0_mdio: mdio {
compatible = "aicmac-mdio";
@ -718,7 +670,7 @@
&fb0 {
artinchip,uboot-logo-on=<1>;
height-virtual = <1200>;
height-virtual = <2160>;
u-boot,dm-pre-reloc;
port {
u-boot,dm-pre-reloc;
@ -739,6 +691,7 @@
port@0 {
reg = <0>;
u-boot,dm-pre-reloc;
de0_in: endpoint {
remote-endpoint = <&fb0_out>;
u-boot,dm-pre-reloc;
@ -747,48 +700,27 @@
port@1 {
reg = <1>;
u-boot,dm-pre-reloc;
de0_out: endpoint {
remote-endpoint = <&lvds0_in>;
remote-endpoint = <&dsi0_in>;
u-boot,dm-pre-reloc;
};
};
};
&rgb0 {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&lcd_rgb565_ld_pins>;
pinctrl-1 = <&lcd_rgb565_ld_sleep_pins>;
u-boot,dm-pre-reloc;
status = "disabled";
port@0 {
reg = <0>;
u-boot,dm-pre-reloc;
rgb0_in: endpoint {
remote-endpoint = <&rgb0_in>;
u-boot,dm-pre-reloc;
};
};
port@1 {
reg = <1>;
u-boot,dm-pre-reloc;
rgb0_out: endpoint {
remote-endpoint = <&panel_rgb_in>;
u-boot,dm-pre-reloc;
};
};
};
&lvds0 {
&dsi0 {
pinctrl-names = "default";
pinctrl-0 = <&lvds1_pins>;
pinctrl-0 = <&dsi_pins>;
status = "okay";
u-boot,dm-pre-reloc;
data-lanes = <3 2 1 0>;
lane-polarities = <0 0 0 0>;
port@0 {
reg = <0>;
lvds0_in: endpoint {
u-boot,dm-pre-reloc;
dsi0_in: endpoint {
remote-endpoint = <&de0_out>;
u-boot,dm-pre-reloc;
};
@ -796,8 +728,9 @@
port@1 {
reg = <1>;
lvds0_out: endpoint {
remote-endpoint = <&panel_lvds_in>;
u-boot,dm-pre-reloc;
dsi0_out: endpoint {
remote-endpoint = <&panel_dsi_in>;
u-boot,dm-pre-reloc;
};
};
@ -877,10 +810,10 @@
};
&pwm {
status = "disabled";
status = "okay";
u-boot,dm-pre-reloc;
pinctrl-names = "default";
pinctrl-0 = <&pwm3_pins_d>;
pinctrl-0 = <&pwm0_pins_d>;
/* mode: up-count, down-count, up-down-count
action: none, low, high, inverse */
pwm0 {
@ -891,7 +824,7 @@
/* CBD, CBU, CAD, CAU, PRD, ZRO */
aic,action0 = "none", "none", "none", "low", "none", "high";
aic,action1 = "none", "none", "none", "high", "none", "low";
status = "disabled";
status = "okay";
u-boot,dm-pre-reloc;
};