mirror of
https://github.com/Fishwaldo/build.git
synced 2025-07-23 05:18:55 +00:00
Update pine64-default patches part 3
This commit is contained in:
parent
6478f4a5c9
commit
dc9c7ea5c2
3 changed files with 129 additions and 235 deletions
|
@ -5,7 +5,6 @@ BOOTCONFIG="pine64_so_defconfig"
|
||||||
#
|
#
|
||||||
MODULES="sunxi_codec sunxi_i2s sunxi_sndcodec 8723bs"
|
MODULES="sunxi_codec sunxi_i2s sunxi_sndcodec 8723bs"
|
||||||
MODULES_NEXT=""
|
MODULES_NEXT=""
|
||||||
GOVERNOR="userspace"
|
|
||||||
#
|
#
|
||||||
KERNEL_TARGET="default,dev"
|
KERNEL_TARGET="default,dev"
|
||||||
CLI_TARGET="xenial:default"
|
CLI_TARGET="xenial:default"
|
||||||
|
|
|
@ -1,234 +0,0 @@
|
||||||
diff --git a/arch/arm64/include/asm/arch_timer.h b/arch/arm64/include/asm/arch_timer.h
|
|
||||||
index f298ce1a..57eb84e2 100755
|
|
||||||
--- a/arch/arm64/include/asm/arch_timer.h
|
|
||||||
+++ b/arch/arm64/include/asm/arch_timer.h
|
|
||||||
@@ -23,9 +23,51 @@
|
|
||||||
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
+#include <linux/stringify.h>
|
|
||||||
|
|
||||||
#include <clocksource/arm_arch_timer.h>
|
|
||||||
|
|
||||||
+#define read_sysreg(r) ({ \
|
|
||||||
+ u64 __val; \
|
|
||||||
+ asm volatile("mrs %0, " __stringify(r) : "=r" (__val)); \
|
|
||||||
+ __val; \
|
|
||||||
+})
|
|
||||||
+
|
|
||||||
+#define write_sysreg(v, r) do { \
|
|
||||||
+ u64 __val = (u64)v; \
|
|
||||||
+ asm volatile("msr " __stringify(r) ", %x0" \
|
|
||||||
+ : : "rZ" (__val)); \
|
|
||||||
+} while (0)
|
|
||||||
+
|
|
||||||
+u32 __fsl_a008585_read_cntp_tval_el0(void);
|
|
||||||
+u32 __fsl_a008585_read_cntv_tval_el0(void);
|
|
||||||
+u64 __fsl_a008585_read_cntvct_el0(void);
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * The number of retries is an arbitrary value well beyond the highest number
|
|
||||||
+ * of iterations the loop has been observed to take.
|
|
||||||
+ */
|
|
||||||
+#define __fsl_a008585_read_reg(reg) ({ \
|
|
||||||
+ u64 _old, _new; \
|
|
||||||
+ int _retries = 200; \
|
|
||||||
+ \
|
|
||||||
+ do { \
|
|
||||||
+ _old = read_sysreg(reg); \
|
|
||||||
+ _new = read_sysreg(reg); \
|
|
||||||
+ _retries--; \
|
|
||||||
+ } while (unlikely(_old != _new) && _retries); \
|
|
||||||
+ \
|
|
||||||
+ WARN_ON_ONCE(!_retries); \
|
|
||||||
+ _new; \
|
|
||||||
+})
|
|
||||||
+
|
|
||||||
+#define arch_timer_reg_read_stable(reg) \
|
|
||||||
+({ \
|
|
||||||
+ u64 _val; \
|
|
||||||
+ _val = __fsl_a008585_read_##reg(); \
|
|
||||||
+ _val; \
|
|
||||||
+})
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* These register accessors are marked inline so the compiler can
|
|
||||||
* nicely work out which register we want, and chuck away the rest of
|
|
||||||
@@ -60,29 +102,23 @@ void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u32 val)
|
|
||||||
static __always_inline
|
|
||||||
u32 arch_timer_reg_read_cp15(int access, enum arch_timer_reg reg)
|
|
||||||
{
|
|
||||||
- u32 val;
|
|
||||||
-
|
|
||||||
if (access == ARCH_TIMER_PHYS_ACCESS) {
|
|
||||||
switch (reg) {
|
|
||||||
case ARCH_TIMER_REG_CTRL:
|
|
||||||
- asm volatile("mrs %0, cntp_ctl_el0" : "=r" (val));
|
|
||||||
- break;
|
|
||||||
+ return read_sysreg(cntp_ctl_el0);
|
|
||||||
case ARCH_TIMER_REG_TVAL:
|
|
||||||
- asm volatile("mrs %0, cntp_tval_el0" : "=r" (val));
|
|
||||||
- break;
|
|
||||||
+ return arch_timer_reg_read_stable(cntp_tval_el0);
|
|
||||||
}
|
|
||||||
} else if (access == ARCH_TIMER_VIRT_ACCESS) {
|
|
||||||
switch (reg) {
|
|
||||||
case ARCH_TIMER_REG_CTRL:
|
|
||||||
- asm volatile("mrs %0, cntv_ctl_el0" : "=r" (val));
|
|
||||||
- break;
|
|
||||||
+ return read_sysreg(cntv_ctl_el0);
|
|
||||||
case ARCH_TIMER_REG_TVAL:
|
|
||||||
- asm volatile("mrs %0, cntv_tval_el0" : "=r" (val));
|
|
||||||
- break;
|
|
||||||
+ return arch_timer_reg_read_stable(cntv_tval_el0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- return val;
|
|
||||||
+ BUG();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline u32 arch_timer_get_cntfrq(void)
|
|
||||||
@@ -135,48 +171,11 @@ static inline void arch_timer_evtstrm_enable(int divider)
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
-#ifdef CONFIG_ARCH_SUN50I
|
|
||||||
-#define ARCH_VCNT_TRY_MAX_TIME (8)
|
|
||||||
-#define ARCH_VCNT_MAX_DELTA (8)
|
|
||||||
-static inline u64 arch_counter_get_cntvct(void)
|
|
||||||
-{
|
|
||||||
- u64 cval0;
|
|
||||||
- u64 cval1;
|
|
||||||
- u64 delta;
|
|
||||||
- u32 retry = 0;
|
|
||||||
-
|
|
||||||
- /* sun50i vcnt maybe imprecise,
|
|
||||||
- * we should try to fix this.
|
|
||||||
- */
|
|
||||||
- while (retry < ARCH_VCNT_TRY_MAX_TIME) {
|
|
||||||
- isb();
|
|
||||||
- asm volatile("mrs %0, cntvct_el0" : "=r" (cval0));
|
|
||||||
- isb();
|
|
||||||
- asm volatile("mrs %0, cntvct_el0" : "=r" (cval1));
|
|
||||||
- delta = cval1 - cval0;
|
|
||||||
- if ((cval1 >= cval0) && (delta < ARCH_VCNT_MAX_DELTA)) {
|
|
||||||
- /* read valid vcnt */
|
|
||||||
- return cval1;
|
|
||||||
- }
|
|
||||||
- /* vcnt value error, try again */
|
|
||||||
- retry++;
|
|
||||||
- }
|
|
||||||
- /* Do not warry for this, just return the last time vcnt.
|
|
||||||
- * arm64 have enabled CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE.
|
|
||||||
- */
|
|
||||||
- return cval1;
|
|
||||||
-}
|
|
||||||
-#else
|
|
||||||
static inline u64 arch_counter_get_cntvct(void)
|
|
||||||
{
|
|
||||||
- u64 cval;
|
|
||||||
-
|
|
||||||
isb();
|
|
||||||
- asm volatile("mrs %0, cntvct_el0" : "=r" (cval));
|
|
||||||
-
|
|
||||||
- return cval;
|
|
||||||
+ return arch_timer_reg_read_stable(cntvct_el0);
|
|
||||||
}
|
|
||||||
-#endif /* CONFIG_ARCH_SUN50I */
|
|
||||||
|
|
||||||
static inline int arch_timer_arch_init(void)
|
|
||||||
{
|
|
||||||
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
|
|
||||||
index 4cf3c47e..d01a93bd 100644
|
|
||||||
--- a/drivers/clocksource/arm_arch_timer.c
|
|
||||||
+++ b/drivers/clocksource/arm_arch_timer.c
|
|
||||||
@@ -192,6 +192,22 @@ static __always_inline void timer_set_mode(const int access, int mode,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+u32 __fsl_a008585_read_cntp_tval_el0(void)
|
|
||||||
+{
|
|
||||||
+ return __fsl_a008585_read_reg(cntp_tval_el0);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+u32 __fsl_a008585_read_cntv_tval_el0(void)
|
|
||||||
+{
|
|
||||||
+ return __fsl_a008585_read_reg(cntv_tval_el0);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+u64 __fsl_a008585_read_cntvct_el0(void)
|
|
||||||
+{
|
|
||||||
+ return __fsl_a008585_read_reg(cntvct_el0);
|
|
||||||
+}
|
|
||||||
+EXPORT_SYMBOL(__fsl_a008585_read_cntvct_el0);
|
|
||||||
+
|
|
||||||
static void arch_timer_set_mode_virt(enum clock_event_mode mode,
|
|
||||||
struct clock_event_device *clk)
|
|
||||||
{
|
|
||||||
@@ -215,49 +231,23 @@ static void arch_timer_set_mode_phys_mem(enum clock_event_mode mode,
|
|
||||||
{
|
|
||||||
timer_set_mode(ARCH_TIMER_MEM_PHYS_ACCESS, mode, clk);
|
|
||||||
}
|
|
||||||
-#ifdef CONFIG_ARCH_SUN50I
|
|
||||||
-#define ARCH_TVAL_TRY_MAX_TIME (8)
|
|
||||||
-static __always_inline void set_next_event(const int access, unsigned long evt,
|
|
||||||
- struct clock_event_device *clk)
|
|
||||||
-{
|
|
||||||
- unsigned int retry = 0;
|
|
||||||
- unsigned long ctrl;
|
|
||||||
- unsigned long tval;
|
|
||||||
|
|
||||||
- ctrl = arch_timer_reg_read(access, ARCH_TIMER_REG_CTRL, clk);
|
|
||||||
- ctrl |= ARCH_TIMER_CTRL_ENABLE;
|
|
||||||
- ctrl &= ~ARCH_TIMER_CTRL_IT_MASK;
|
|
||||||
-
|
|
||||||
- /* sun50i timer maybe imprecise,
|
|
||||||
- * we should try to fix this.
|
|
||||||
- */
|
|
||||||
- while (retry < ARCH_VCNT_TRY_MAX_TIME) {
|
|
||||||
- arch_timer_reg_write(access, ARCH_TIMER_REG_TVAL, evt, clk);
|
|
||||||
- tval = arch_timer_reg_read(access, ARCH_TIMER_REG_TVAL, clk);
|
|
||||||
- if (tval <= evt) {
|
|
||||||
- /* set tval succeeded, let timer running */
|
|
||||||
- arch_timer_reg_write(access, ARCH_TIMER_REG_CTRL, ctrl, clk);
|
|
||||||
- return;
|
|
||||||
- }
|
|
||||||
- /* tval set value error, try again */
|
|
||||||
- retry++;
|
|
||||||
- }
|
|
||||||
- /* set tval fail, just let timer running */
|
|
||||||
- printk("notice: set tval failed.\n");
|
|
||||||
- arch_timer_reg_write(access, ARCH_TIMER_REG_CTRL, ctrl, clk);
|
|
||||||
-}
|
|
||||||
-#else
|
|
||||||
static __always_inline void set_next_event(const int access, unsigned long evt,
|
|
||||||
struct clock_event_device *clk)
|
|
||||||
{
|
|
||||||
unsigned long ctrl;
|
|
||||||
+ u64 cval = evt + arch_counter_get_cntvct();
|
|
||||||
ctrl = arch_timer_reg_read(access, ARCH_TIMER_REG_CTRL, clk);
|
|
||||||
ctrl |= ARCH_TIMER_CTRL_ENABLE;
|
|
||||||
ctrl &= ~ARCH_TIMER_CTRL_IT_MASK;
|
|
||||||
- arch_timer_reg_write(access, ARCH_TIMER_REG_TVAL, evt, clk);
|
|
||||||
+
|
|
||||||
+ if (access == ARCH_TIMER_PHYS_ACCESS)
|
|
||||||
+ write_sysreg(cval, cntp_cval_el0);
|
|
||||||
+ else if (access == ARCH_TIMER_VIRT_ACCESS)
|
|
||||||
+ write_sysreg(cval, cntv_cval_el0);
|
|
||||||
+
|
|
||||||
arch_timer_reg_write(access, ARCH_TIMER_REG_CTRL, ctrl, clk);
|
|
||||||
}
|
|
||||||
-#endif /* CONFIG_ARCH_SUN50I */
|
|
||||||
|
|
||||||
static int arch_timer_set_next_event_virt(unsigned long evt,
|
|
||||||
struct clock_event_device *clk)
|
|
||||||
@@ -432,7 +422,7 @@ static cycle_t arch_counter_read_cc(const struct cyclecounter *cc)
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct clocksource clocksource_counter = {
|
|
||||||
- .name = "arch_sys_counter",
|
|
||||||
+ .name = "arch_sys_counter_ool",
|
|
||||||
.rating = 400,
|
|
||||||
.read = arch_counter_read,
|
|
||||||
.mask = CLOCKSOURCE_MASK(56),
|
|
|
@ -0,0 +1,129 @@
|
||||||
|
diff --git a/u-boot-pine64/board/sunxi/common/power_check.c b/u-boot-pine64/board/sunxi/common/power_check.c
|
||||||
|
index d427081ad2..12aa7d94ba 100644
|
||||||
|
--- a/u-boot-pine64/board/sunxi/common/power_check.c
|
||||||
|
+++ b/u-boot-pine64/board/sunxi/common/power_check.c
|
||||||
|
@@ -57,7 +57,7 @@ static void EnterNormalShutDownMode(void)
|
||||||
|
|
||||||
|
static void EnterLowPowerShutDownMode(void)
|
||||||
|
{
|
||||||
|
- printf("battery ratio is low without dc or ac, should be ShowDown\n");
|
||||||
|
+ printf("Warning: Low battery power, shutting down\n");
|
||||||
|
sunxi_bmp_display("bat\\low_pwr.bmp");
|
||||||
|
__msdelay(3000);
|
||||||
|
sunxi_board_shutdown();
|
||||||
|
@@ -66,7 +66,7 @@ static void EnterLowPowerShutDownMode(void)
|
||||||
|
|
||||||
|
static void EnterShutDownWithChargeMode(void)
|
||||||
|
{
|
||||||
|
- printf("battery low power and vol with dc or ac, should charge longer\n");
|
||||||
|
+ printf("Warning: Low battery power, shutting down to recharge\n");
|
||||||
|
sunxi_bmp_display("bat\\bempty.bmp");
|
||||||
|
__msdelay(3000);
|
||||||
|
sunxi_board_shutdown();
|
||||||
|
@@ -75,7 +75,7 @@ static void EnterShutDownWithChargeMode(void)
|
||||||
|
|
||||||
|
static void EnterAndroidChargeMode(void)
|
||||||
|
{
|
||||||
|
- printf("sunxi_bmp_charger_display\n");
|
||||||
|
+ printf("Warning: shutting down\n");
|
||||||
|
sunxi_bmp_display("bat\\battery_charge.bmp");
|
||||||
|
#if 1 /* shutdowon instead of update charge variable */
|
||||||
|
__msdelay(3000);
|
||||||
|
@@ -88,12 +88,10 @@ static void EnterAndroidChargeMode(void)
|
||||||
|
|
||||||
|
static void EnterNormalBootMode(void)
|
||||||
|
{
|
||||||
|
- printf("sunxi_bmp_logo_display\n");
|
||||||
|
+ /* printf("sunxi_bmp_logo_display\n"); */
|
||||||
|
sunxi_bmp_display("bootlogo.bmp");
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
-
|
||||||
|
int ProbePreSystemMode(void)
|
||||||
|
{
|
||||||
|
int PreSysMode = 0;
|
||||||
|
diff --git a/u-boot-pine64/common/cmd_sunxi_bmp.c b/u-boot-pine64/common/cmd_sunxi_bmp.c
|
||||||
|
index 59f1210dc1..bfcefca44e 100644
|
||||||
|
--- a/u-boot-pine64/common/cmd_sunxi_bmp.c
|
||||||
|
+++ b/u-boot-pine64/common/cmd_sunxi_bmp.c
|
||||||
|
@@ -31,6 +31,8 @@
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <sunxi_bmp.h>
|
||||||
|
#include <sunxi_board.h>
|
||||||
|
+#include <fs.h>
|
||||||
|
+#include <vsprintf.h>
|
||||||
|
|
||||||
|
static int sunxi_bmp_probe_info (uint addr);
|
||||||
|
static int sunxi_bmp_show(sunxi_bmp_store_t bmp_info);
|
||||||
|
@@ -179,42 +181,41 @@ U_BOOT_CMD(
|
||||||
|
|
||||||
|
int sunxi_bmp_display(char *name)
|
||||||
|
{
|
||||||
|
-
|
||||||
|
- sunxi_bmp_store_t bmp_info;
|
||||||
|
+ sunxi_bmp_store_t bmp_info;
|
||||||
|
char bmp_name[32];
|
||||||
|
- char bmp_addr[32] = {0};
|
||||||
|
- char* bmp_buff = NULL;
|
||||||
|
+ char *bmp_buff = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
//const size_t bmp_buff_len = 10<<20; //10M
|
||||||
|
//size_t file_size = 0;
|
||||||
|
- char * bmp_argv[6] = { "fatload", "mmc", getenv("boot_part"), "00000000", bmp_name, NULL };
|
||||||
|
|
||||||
|
// free() function will take a long time,so not use malloc memory
|
||||||
|
- bmp_buff = (char*)CONFIG_SYS_SDRAM_BASE;
|
||||||
|
- if(bmp_buff == NULL)
|
||||||
|
+ bmp_buff = (char*)CONFIG_SYS_SDRAM_BASE;
|
||||||
|
+ if (bmp_buff == NULL)
|
||||||
|
{
|
||||||
|
printf("sunxi bmp: alloc buffer for %s fail\n", name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
//set bmp decode addr is CONFIG_SYS_SDRAM_BASE
|
||||||
|
- sprintf(bmp_addr,"%lx", (ulong)bmp_buff);
|
||||||
|
- bmp_argv[3] = bmp_addr;
|
||||||
|
+ if (fs_set_blk_dev("mmc", getenv("boot_part"), FS_TYPE_ANY))
|
||||||
|
+ return -1;
|
||||||
|
|
||||||
|
- memset(bmp_name, 0, 32);
|
||||||
|
- strcpy(bmp_name, name);
|
||||||
|
- if(do_fat_fsload(0, 0, 5, bmp_argv))
|
||||||
|
+ snprintf(bmp_name, 32, "%s", name);
|
||||||
|
+ if (!fs_exists(bmp_name))
|
||||||
|
{
|
||||||
|
- printf("sunxi bmp info error : unable to open logo file %s\n", bmp_argv[4]);
|
||||||
|
- return -1;
|
||||||
|
+ snprintf(bmp_name, 32, "\\boot\\%s", name);
|
||||||
|
+ if (!fs_exists(bmp_name))
|
||||||
|
+ {
|
||||||
|
+ printf("sunxi bmp: unable to open file %s\n", bmp_name);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
- //file_size = simple_strtoul(getenv("filesize"), NULL, 16);
|
||||||
|
-
|
||||||
|
+ fs_read(bmp_name, (ulong)bmp_buff, 0, 0);
|
||||||
|
#if defined(CONFIG_SUNXI_LOGBUFFER)
|
||||||
|
bmp_info.buffer = (void *)(CONFIG_SYS_SDRAM_BASE + gd->ram_size - SUNXI_DISPLAY_FRAME_BUFFER_SIZE);
|
||||||
|
#else
|
||||||
|
bmp_info.buffer = (void *)(SUNXI_DISPLAY_FRAME_BUFFER_ADDR);
|
||||||
|
#endif
|
||||||
|
- printf("bmp file buffer: 0x%lx, bmp_info.buffer: %lx\n",(ulong)bmp_buff,(ulong)bmp_info.buffer);
|
||||||
|
+ /* printf("bmp file buffer: 0x%lx, bmp_info.buffer: %lx\n",(ulong)bmp_buff,(ulong)bmp_info.buffer); */
|
||||||
|
if(!sunxi_bmp_decode((ulong)bmp_buff, &bmp_info))
|
||||||
|
{
|
||||||
|
debug("decode bmp ok\n");
|
||||||
|
diff --git a/include/configs/sun50iw1p1.h b/include/configs/sun50iw1p1.h
|
||||||
|
index 62eeeb1b29..80ab660011 100644
|
||||||
|
--- a/u-boot-pine64/include/configs/sun50iw1p1.h
|
||||||
|
+++ b/u-boot-pine64/include/configs/sun50iw1p1.h
|
||||||
|
@@ -444,6 +444,7 @@
|
||||||
|
#define CONFIG_CMD_ECHO
|
||||||
|
#define CONFIG_CMD_SOURCE
|
||||||
|
#define CONFIG_CMD_SUNXI_UMS
|
||||||
|
+#define CONFIG_SYS_VSNPRINTF
|
||||||
|
|
||||||
|
#define CONFIG_PINE64_MODEL
|
||||||
|
#define CONFIG_PINE64_MODEL_PINEBOOK_DETECTION
|
Loading…
Add table
Add a link
Reference in a new issue