页次: 1
gpt - GUID Partition Table
Usage:
gpt <command> <interface> <dev> <partitions_list>
- GUID partition table restoration and validity check
Restore or verify GPT information on a device connected
to interface
Example usage:
gpt write mmc 0 $partitions
gpt verify mmc 0 $partitions</code>
我的快播小方 RK3188已经可以进入UBOOT了,EMMC也识别到了,所以刚下单的泰山派不打算要了,目前嘉立创商城缺货了,有人需要的话请留言。
快播小方开机 日志,下一步就是进入kernel了。
Model: Radxa Rock
MPIDR: 0x80000000
Serial: raw, 0x20064000
DRAM: 1 GiB
Sysmem: init
------Time:09:25:04------0
Relocation Offset: 00000000
Relocation fdt: 9de43ce0 - 9de48de8
CR: M/C/I
I2c1 speed: 400000Hz
VDD_ARM -5 uV
*** Warning - No MMC card found, using default environment
MMC: dwmmc@1021c000: 0
In: serial
Out: serial
Err: serial
Model: Radxa Rock
MPIDR: 0x80000000
## Error: "rkimg_bootdev" not defined
defalut set mmc 0
Bootdev(scan): mmc 0
rockchip_get_bootdev:257 -> dev_type=6 devnum=0
blk_get_devnum_by_type 90
MMC0: High Speed, 37Mhz
## Unknown partition table type 0
PartType: <NULL>
No misc partition
boot mode: None
CLK: (uboot. arm: enter 0 KHz, init 0 KHz, kernel 0N/A)
apll 600000 KHz
dpll 300000 KHz
cpll 132000 KHz
gpll 891000 KHz
Net: Net Initialization Skipped
No ethernet found.
Hit key to stop autoboot('CTRL+C'): 0
## Error: "version" not defined
=> mmc info
Device: dwmmc@1021c000
Manufacturer ID: 15
OEM: 100
Name: M8G1W
Timing Interface: High Speed
Tran Speed: 37500000
Rd Block Len: 512
MMC version 4.4.1
High Capacity: Yes
Capacity: 7.3 GiB
Bus Width: 8-bit
Erase Group Size: 512 KiB
HC WP Group Size: 1 MiB
User Capacity: 7.3 GiB WRREL
Boot Capacity: 2 MiB ENH
RPMB Capacity: 128 KiB ENH
diff --git a/DefineHeader.h b/DefineHeader.h
index cea0f02..cebc639 100644
--- a/DefineHeader.h
+++ b/DefineHeader.h
@@ -21,12 +21,22 @@
#include <sstream>
#include <algorithm>
using namespace std;
-typedef unsigned char BYTE, *PBYTE;
-typedef unsigned char UCHAR;
-typedef unsigned short WCHAR;
-typedef unsigned short USHORT;
-typedef unsigned int UINT;
-typedef unsigned int DWORD;
+// typedef unsigned char BYTE, *PBYTE;
+// typedef unsigned char UCHAR;
+// typedef unsigned short WCHAR;
+// typedef unsigned short USHORT;
+// typedef unsigned int UINT;
+// typedef unsigned int DWORD;
+
+#define PBYTE unsigned char *
+#define BYTE unsigned char
+#define UCHAR unsigned char
+#define WCHAR unsigned short
+#define USHORT unsigned short
+#define UINT unsigned int
+#define DWORD unsigned int
+
+
#define ALIGN(x, a) __ALIGN_MASK((x), (a) - 1)
#define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask))
#define RK28_SEC2_RESERVED_LEN 473
diff --git a/RKLog.cpp b/RKLog.cpp
index 37dc62b..c24bbfe 100644
--- a/RKLog.cpp
+++ b/RKLog.cpp
@@ -74,8 +74,11 @@ bool CRKLog::Write(string text)
char szDateTime[100];
string strName;
FILE *file=NULL;
- time(&now);
- localtime_r(&now, &timeNow);
+ //time(&now);
+ //localtime_r(&now, &timeNow);
+
+ now =time(0);
+ localtime_s(&timeNow,&now);
sprintf(szDateTime, "%04d-%02d-%02d.txt", timeNow.tm_year + 1900, timeNow.tm_mon + 1, timeNow.tm_mday);
strName = m_path + m_name+szDateTime;
diff --git a/crc.cpp b/crc.cpp
index 8bd2647..9dd6ab8 100644
--- a/crc.cpp
+++ b/crc.cpp
@@ -188,15 +188,52 @@ unsigned int crc32_le(unsigned int crc, unsigned char *p, unsigned int len)
}
return nAccum;
*/
+#if 0
+
+ unsigned long long addr =(unsigned long long) p;
+ unsigned int *tab = crc32table_le;
+ crc = crc ^ 0xFFFFFFFF;
+ if(( (addr & 3) && len)){
+ do {
+ unsigned char *p = (unsigned char *)addr;
+ DO_CRC(*p++);
+ addr = (unsigned long long)p;
+ } while ((--len) && (addr &3 ));
+ }
+ if((len >= 4)){
+ unsigned int save_len = len & 3;
+ len = len >> 2;
+ addr-=4;
+ do {
+ addr +=4;
+ crc ^= *((unsigned int *)addr);
+ DO_CRC(0);
+ DO_CRC(0);
+ DO_CRC(0);
+ DO_CRC(0);
+ } while (--len);
+ addr+=4;
+ len = save_len;
+ }
+ if(len){
+ do {
+ unsigned char *p = (unsigned char *)addr;
+ DO_CRC(*p++);
+ addr = (unsigned long long)p;
+ } while (--len);
+ }
+ crc = crc ^ 0xFFFFFFFF;
+ return crc;
+#else
unsigned int *b =(unsigned int *)p;
unsigned int *tab = crc32table_le;
crc = crc ^ 0xFFFFFFFF;
- if((((long)b)&3 && len)){
+ if(( (((unsigned long long)b) & 3) && len)){
do {
unsigned char *p = (unsigned char *)b;
DO_CRC(*p++);
b = (unsigned int *)p;
- } while ((--len) && ((long)b)&3 );
+ } while ((--len) && ((unsigned long long)b)&3 );
}
if((len >= 4)){
unsigned int save_len = len & 3;
@@ -221,7 +258,7 @@ unsigned int crc32_le(unsigned int crc, unsigned char *p, unsigned int len)
}
crc = crc ^ 0xFFFFFFFF;
return crc;
-
+#endif
}
#define CRC16_CCITT 0x1021 //CRC operator
diff --git a/main.cpp b/main.cpp
index 72bd94b..0e864ca 100644
--- a/main.cpp
+++ b/main.cpp
@@ -3292,7 +3292,7 @@ bool handle_command(int argc, char* argv[], CRKScan *pScan)
return bSuccess;
}
-
+#include <unistd.h>
int main(int argc, char* argv[])
{
CRKScan *pScan = NULL;
@@ -3303,10 +3303,11 @@ int main(int argc, char* argv[])
struct stat statBuf;
g_ConfigItemVec.clear();
- sprintf(szProgramProcPath, "/proc/%d/exe", getpid());
- if (readlink(szProgramProcPath, szProgramDir, 256) == -1)
- strcpy(szProgramDir, ".");
- else {
+ // sprintf(szProgramProcPath, "/proc/%d/exe", getpid());
+ // if (readlink(szProgramProcPath, szProgramDir, 256) == -1)
+ // strcpy(szProgramDir, ".");
+ // else
+ {
char *pSlash;
pSlash = strrchr(szProgramDir, '/');
if (pSlash)
@@ -3317,7 +3318,7 @@ int main(int argc, char* argv[])
strConfigFile = szProgramDir;
strConfigFile += "/config.ini";
if (opendir(strLogDir.c_str()) == NULL)
- mkdir(strLogDir.c_str(), S_IRWXU | S_IRWXG | S_IROTH);
+ mkdir(strLogDir.c_str());
g_pLogObject = new CRKLog(strLogDir.c_str(), "log",true);
if(stat(strConfigFile.c_str(), &statBuf) < 0) {
@晕哥,请教一下brcmfmac43430-sdio.clm_blob 这个文件是做什么的,我目前/lib/brcm目录下只放了brcmfmac43430-sdio.txt brcmfmac43430-sdio.bin文件,加载模块的时候,可以识别到wlan0,但是配置不了WIFI。
# wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf
Successfully initialized wpa_supplicant
wlan0: CTRL-EVENT-SCAN-FAILED ret=-22 retry=1
wlan0: CTRL-EVENT-SCAN-FAILED ret=-22 retry=1
wlan0: CTRL-EVENT-SCAN-FAILED ret=-22 retry=1
wlan0: CTRL-EVENT-SCAN-FAILED ret=-22 retry=1
wlan0: CTRL-EVENT-SCAN-FAILED ret=-22 retry=1
^Cwlan0: CTRL-EVENT-DSCP-POLICY clear_all
wlan0: CTRL-EVENT-DSCP-POLICY clear_all
nl80211: deinit ifname=wlan0 disabled_11b_rates=0
wlan0: CTRL-EVENT-TERMINATING
# iwconfig wlan0
wlan0 IEEE 802.11 ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=31 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:on
# iw
iwconfig iwgetid iwlist iwpriv iwspy
# iwlist wlan0 scanning
wlan0 Interface doesn't support scanning : Invalid argument
# iwconfig wlan0 essid wifishare key qwer1234
Error for wireless request "Set Encode" (8B2A) :
invalid argument "qwer1234".
# iwlist wlan0 scanning
[ 1658.378623] ieee80211 phy0: brcmf_run_escan: error (-52)
[ 1658.384010] ieee80211 phy0: brcmf_cfg80211_scan: scan error (-52)
wlan0 Interface doesn't support scanning : Invalid exchange
解决办法2个:
1.将相关功能编译成模块。
.config - Linux/arm 5.4.63 Kernel Configuration
> Networking support > Wireless ──────────────────────────────────────────────────────────────────────────────────────
┌─────────────────────────────────────────────────── Wireless ────────────────────────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty submenus ----). Highlighted letters │
│ are hotkeys. Pressing <Y> includes, <N> excludes, <M> modularizes features. Press <Esc><Esc> to exit, <?> │
│ for Help, </> for Search. Legend: [*] built-in [ ] excluded <M> module < > module capable │
│ │
│ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ --- Wireless │ │
│ │ <M> cfg80211 - wireless configuration API │ │
│ │ [ ] nl80211 testmode command │ │
│ │ [ ] enable developer warnings │ │
│ │ [*] enable powersave by default │ │
│ │ [ ] cfg80211 DebugFS entries │ │
│ │ [*] cfg80211 wireless extensions compatibility │ │
│ │ [ ] lib80211 debugging messages │ │
│ │ <M> Generic IEEE 802.11 Networking Stack (mac80211) │ │
│ │ Default rate control algorithm (Minstrel) ---> │ │
│ │ [*] Enable mac80211 mesh networking support │ │
│ │ [ ] Enable LED triggers │ │
│ │ [ ] Export mac80211 internals in DebugFS │ │
│ │ [ ] Trace all mac80211 debug messages │ │
│ │ [ ] Select mac80211 debugging features ---- │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
2.骚操作,不建议用
在include/linux/init.h下新增
#define last_initcall(fn) __define_initcall(fn, 8)
#define last_initcall_sync(fn) __define_initcall(fn, 8s)
net/wireless/reg.c 下新增
last_initcall(regulatory_init_db);
//late_initcall(regulatory_init_db);
init/main.c 中新增
extern initcall_entry_t __initcall_start[];
extern initcall_entry_t __initcall0_start[];
extern initcall_entry_t __initcall1_start[];
extern initcall_entry_t __initcall2_start[];
extern initcall_entry_t __initcall3_start[];
extern initcall_entry_t __initcall4_start[];
extern initcall_entry_t __initcall5_start[];
extern initcall_entry_t __initcall6_start[];
extern initcall_entry_t __initcall7_start[];
extern initcall_entry_t __initcall8_start[]; //新增
extern initcall_entry_t __initcall_end[];
static initcall_entry_t *initcall_levels[] __initdata = {
__initcall0_start,
__initcall1_start,
__initcall2_start,
__initcall3_start,
__initcall4_start,
__initcall5_start,
__initcall6_start,
__initcall7_start,
__initcall8_start, //新增
__initcall_end,
};
static void __init do_initcalls(void)
{
int level;
for (level = 0; level < ARRAY_SIZE(initcall_levels) - 2; level++) // -1 改为-2
do_initcall_level(level);
}
static void __init do_last_initcalls(void)
{
do_initcall_level(ARRAY_SIZE(initcall_levels) - 2);
}
在这个kernel_init_freeable函数最末尾调用do_last_initcalls();
在include/asm-generic/vmlinux.lds.h中
#define INIT_CALLS \
__initcall_start = .; \
KEEP(*(.initcallearly.init)) \
INIT_CALLS_LEVEL(0) \
INIT_CALLS_LEVEL(1) \
INIT_CALLS_LEVEL(2) \
INIT_CALLS_LEVEL(3) \
INIT_CALLS_LEVEL(4) \
INIT_CALLS_LEVEL(5) \
INIT_CALLS_LEVEL(rootfs) \
INIT_CALLS_LEVEL(6) \
INIT_CALLS_LEVEL(7) \
INIT_CALLS_LEVEL(8) \ //新增
__initcall_end = .;
[ 1.707503] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[ 1.717596] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[ 1.724231] ALSA device list:
[ 1.727198] #0: sun8i-a33-audio
[ 1.731001] platform regulatory.0: loading regulatory.db failed
[ 1.736936] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[.db
[ 1.748784] VFS: Mounted root (squashfs filesystem) readonly on device 31:6.
[ 1.759426] devtmpfs: mounted
[ 1.759791] mmc0: new high speed SDIO card at address 0001
[ 1.769257] Freeing unused kernel memory: 1024K
[ 1.770834] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1
[ 1.819524] Run /sbin/init as init process
[ 1.984161] brcmfmac mmc0:0001:1: loading brcm/brcmfmac43430-sdio.bin success
[ 2.051478] brcmfmac mmc0:0001:1: loading brcm/brcmfmac43430-sdio.sinovoip,bananapi-m2m.txt success
[ 2.369805] random: crng init done
日志如图,可能的原因是regulatory.db 的加载早与文件系统挂载完成,导致找不到指定文件。 因为 regulatory.db 文件确实存在于/lib/firmware中。
我尝试过在加载文件之前调用mdelay(3000)来延时,但问题依旧,表现为整个日志的时间都顺延了3S,请教一下这个问题该如何解决?
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2018, STMicroelectronics - All Rights Reserved
*/
#include <common.h>
#include <command.h>
#include <dm.h>
#include <errno.h>
#include <stdio.h>
#include <dm/pinctrl.h>
#include <dm/uclass-internal.h>
#include <asm/io.h>
#include <asm/gpio.h>
#include <asm/arch/gpio.h>
#define LIMIT_DEVNAME 30
struct gpio_describe {
const char *pGroup;
const char pins[32];
};
static const char *pname[]={"PA","PB","PC","PD","PE","PF","PG","PH","PI","PJ","PK","PL"};
static int get_serial_input(uint32_t timeout)
{
unsigned long time_start;
int input;
time_start = get_timer(0);
for(;;)
{
if(tstc()) {
input =getchar();
if(input > 0)
return input;
}
if(get_timer(time_start) > timeout){
return -1;
}
}
}
static int sunxi_gpio_output(u32 pin, u32 val)
{
u32 dat;
u32 bank = GPIO_BANK(pin);
u32 num = GPIO_NUM(pin);
struct sunxi_gpio *pio = BANK_TO_GPIO(bank);
dat = readl(&pio->dat);
if (val)
dat |= 0x1 << num;
else
dat &= ~(0x1 << num);
writel(dat, &pio->dat);
return 0;
}
static int sunxi_gpio_input(u32 pin)
{
u32 dat;
u32 bank = GPIO_BANK(pin);
u32 num = GPIO_NUM(pin);
struct sunxi_gpio *pio = BANK_TO_GPIO(bank);
dat = readl(&pio->dat);
dat >>= num;
return dat & 0x1;
}
static int get_gpio_by_name(const char *pin)
{
int group=0,idx=0;
if((pin[0] == 'p')||(pin[0]=='P'))
{
group = pin[1] - (pin[1] > 'a' ? 'a' : 'A');
idx = dectoul(&pin[2], NULL);
return (group * 32 + idx);
}
return -1;
}
#define GROUP_SIZE 8
static struct gpio_describe all_gpio[GROUP_SIZE]={
{.pGroup="PB",.pins={0,1,2,3,4,5,6,7,-1}},
{.pGroup="PC",.pins={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,-1}},
{.pGroup="PD",.pins={'x','x',2,3,4,5,6,7,10,11,12,13,14,15,18,19,20,21,22,23,24,25,26,27,-1}},
{.pGroup="PE",.pins={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,-1}},
{.pGroup="PF",.pins={0,1,'x',3,'x',5,-1}},
{.pGroup="PG",.pins={0,1,2,3,4,5,6,7,8,9,10,11,12,13,-1}},
{.pGroup="PH",.pins={0,1,2,3,4,5,6,7,8,9,-1}},
{.pGroup="PL",.pins={0,1,2,3,4,5,6,7,8,9,10,11,-1}},
};
static char gname[GROUP_SIZE*32][8];
static int gno[GROUP_SIZE*32];
static int gtotal=0;
static int tick =0;
static void create_gpio_map(void)
{
struct gpio_describe *pdescribe;
for(int i=0;i<GROUP_SIZE;i++)
{
pdescribe = &all_gpio[i];
for(int k=0;k<32;k++){
if(pdescribe->pins[k] == 'x'){
continue;
}
if(pdescribe->pins[k] < 0){
break;
}
sprintf(gname[gtotal],"%s%d",pdescribe->pGroup,pdescribe->pins[k]);
gno[gtotal] =get_gpio_by_name(gname[gtotal]);
if(gno[gtotal] > 0){
sunxi_gpio_set_cfgpin(gno[gtotal], SUNXI_GPIO_OUTPUT);
gtotal++;
}
}
}
}
static void simulate_set_bsp(int bsp)
{
tick =(1000*1000 + (bsp / 2)) / bsp;
}
static void simulate_uart_delay(void)
{
__udelay(tick);
}
static void simulate_uart_send(char *str,int gpio)
{
char data;
while(*str){
data =*str++;
sunxi_gpio_output(gpio,0); //start
simulate_uart_delay();
for(int i=0;i<8;i++){
sunxi_gpio_output(gpio,data & 0x01);
simulate_uart_delay();
data >>=1;
}
sunxi_gpio_output(gpio,1); //stop
simulate_uart_delay();
}
}
static int do_pin_detect(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
char io_name[16];
printf("show GPIO name on itself\n");
create_gpio_map();
simulate_set_bsp(2400);
while(get_serial_input(50) < 0){
for(int i=0;i<gtotal;i++){
sprintf(io_name,"%s \n",gname[i]);
simulate_uart_send(io_name,gno[i]);
}
}
return 0;
}
U_BOOT_CMD(pindetect, CONFIG_SYS_MAXARGS, 1, do_pin_detect,
"the GPIO name is displaied on itself in UART at bsp 2400",
"\nexample: pindetect - all pins name on itself gpio\n"
)
以上代码在 R16 uboot中测试通过,因公司网络限制不能上传资源,个人自行测试。
我是用mkfs.ext4格式化始终报错,我把overlayfs分区改小了,然后正常了
# mkfs.ext4 /dev/mtdblock7
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 89984 1k blocks and 22528 inodes
Filesystem UUID: bb8c5630-6d33-4e10-9730-50693acf846e
Superblock backups stored on blocks:
[ 109.076672] nand: nand_erase_nand: attempt to erase a bad block at page 0x0000ffc0
Allocating group tables: done
[ 109.087194] mtdblock: erase of region [0x57c0000, 0x20000] on "overlayfs_a" failed
Writing inode tables:
[ 109.100275] blk_update_request: I/O error, dev mtdblock7, sector 562 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 0
done
[ 109.122311] nand: nand_erase_nand: attempt to erase a bad block at page 0x0000ffc0
[ 109.129919] mtdblock: erase of region [0x57c0000, 0x20000] on "overlayfs_a" failed
[ 109.137513] blk_update_request: I/O error, dev mtdblock7, sector 11852 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 0
Creating journal (4096 blocks): [ 109.240616] nand: nand_erase_nand: attempt to erase a bad block atpage 0x0000ffc0
[ 109.250679] mtdblock: erase of region [0x57c0000, 0x20000] on "overlayfs_a" failed
[ 109.258263] blk_update_request: I/O error, dev mtdblock7, sector 65538 op 0x1:(WRITE) flags 0x4000phys_seg 32 prio class 0
[ 109.269429] nand: nand_erase_nand: attempt to erase a bad block at page 0x0000ffc0
[ 109.277005] mtdblock: erase of region [0x57c0000, 0x20000] on "overlayfs_a" failed
[ 109.284573] blk_update_request: I/O error, dev mtdblock7, sector 65546 op 0x1:(WRITE) flags 0x4000phys_seg 31 prio class 0
[ 109.295726] nand: nand_erase_nand: attempt to erase a bad block at page 0x0000ffc0
[ 109.303286] mtdblock: erase of region [0x57c0000, 0x20000] on "overlayfs_a" failed
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Direct MTD block device access
*
* Copyright © 1999-2010 David Woodhouse <dwmw2@infradead.org>
* Copyright © 2000-2003 Nicolas Pitre <nico@fluxnic.net>
*/
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/vmalloc.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/blktrans.h>
#include <linux/mutex.h>
#include <linux/major.h>
struct mtdblk_dev {
struct mtd_blktrans_dev mbd;
int count;
struct mutex cache_mutex;
unsigned char *cache_data;
unsigned long cache_offset;
unsigned int cache_size;
enum { STATE_EMPTY, STATE_CLEAN, STATE_DIRTY } cache_state;
};
/*
* Cache stuff...
*
* Since typical flash erasable sectors are much larger than what Linux's
* buffer cache can handle, we must implement read-modify-write on flash
* sectors for each block write requests. To avoid over-erasing flash sectors
* and to speed things up, we locally cache a whole flash sector while it is
* being written to until a different sector is required.
*/
static int erase_write (struct mtd_info *mtd, unsigned long pos,
unsigned int len, const char *buf)
{
struct erase_info erase;
size_t retlen;
int ret;
/*
* First, let's erase the flash block.
*/
erase.addr = pos;
erase.len = len;
ret = mtd_erase(mtd, &erase);
if (ret) {
printk (KERN_WARNING "mtdblock: erase of region [0x%lx, 0x%x] er=%d"
"on \"%s\" failed\n",
pos, len, ret,mtd->name);
return ret;
}
/*
* Next, write the data to flash.
*/
ret = mtd_write(mtd, pos, len, &retlen, buf);
if (ret)
return ret;
if (retlen != len)
return -EIO;
return 0;
}
static int write_cached_data (struct mtdblk_dev *mtdblk)
{
struct mtd_info *mtd = mtdblk->mbd.mtd;
int ret;
if (mtdblk->cache_state != STATE_DIRTY)
return 0;
pr_debug("mtdblock: writing cached data for \"%s\" "
"at 0x%lx, size 0x%x\n", mtd->name,
mtdblk->cache_offset, mtdblk->cache_size);
ret = erase_write (mtd, mtdblk->cache_offset,
mtdblk->cache_size, mtdblk->cache_data);
if (ret)
return ret;
/*
* Here we could arguably set the cache state to STATE_CLEAN.
* However this could lead to inconsistency since we will not
* be notified if this content is altered on the flash by other
* means. Let's declare it empty and leave buffering tasks to
* the buffer cache instead.
*/
mtdblk->cache_state = STATE_EMPTY;
return 0;
}
static int do_cached_write (struct mtdblk_dev *mtdblk, unsigned long pos,
int len, const char *buf)
{
struct mtd_info *mtd = mtdblk->mbd.mtd;
unsigned int sect_size = mtdblk->cache_size;
size_t retlen;
int ret;
pr_debug("mtdblock: write on \"%s\" at 0x%lx, size 0x%x\n",
mtd->name, pos, len);
if (!sect_size)
return mtd_write(mtd, pos, len, &retlen, buf);
while (len > 0) {
unsigned long sect_start = (pos/sect_size)*sect_size;
unsigned int offset = pos - sect_start;
unsigned int size = sect_size - offset;
if( size > len )
size = len;
if (size == sect_size) {
/*
* We are covering a whole sector. Thus there is no
* need to bother with the cache while it may still be
* useful for other partial writes.
*/
ret = erase_write (mtd, pos, size, buf);
if (ret)
return ret;
} else {
/* Partial sector: need to use the cache */
if (mtdblk->cache_state == STATE_DIRTY &&
mtdblk->cache_offset != sect_start) {
ret = write_cached_data(mtdblk);
if (ret)
return ret;
}
if (mtdblk->cache_state == STATE_EMPTY ||
mtdblk->cache_offset != sect_start) {
/* fill the cache with the current sector */
mtdblk->cache_state = STATE_EMPTY;
ret = mtd_read(mtd, sect_start, sect_size,
&retlen, mtdblk->cache_data);
if (ret && !mtd_is_bitflip(ret))
return ret;
if (retlen != sect_size)
return -EIO;
mtdblk->cache_offset = sect_start;
mtdblk->cache_size = sect_size;
mtdblk->cache_state = STATE_CLEAN;
}
/* write data to our local cache */
memcpy (mtdblk->cache_data + offset, buf, size);
mtdblk->cache_state = STATE_DIRTY;
}
buf += size;
pos += size;
len -= size;
}
return 0;
}
static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos,
int len, char *buf)
{
struct mtd_info *mtd = mtdblk->mbd.mtd;
unsigned int sect_size = mtdblk->cache_size;
size_t retlen;
int ret;
pr_debug("mtdblock: read on \"%s\" at 0x%lx, size 0x%x\n",
mtd->name, pos, len);
if (!sect_size) {
ret = mtd_read(mtd, pos, len, &retlen, buf);
if (ret && !mtd_is_bitflip(ret))
return ret;
return 0;
}
while (len > 0) {
unsigned long sect_start = (pos/sect_size)*sect_size;
unsigned int offset = pos - sect_start;
unsigned int size = sect_size - offset;
if (size > len)
size = len;
/*
* Check if the requested data is already cached
* Read the requested amount of data from our internal cache if it
* contains what we want, otherwise we read the data directly
* from flash.
*/
if (mtdblk->cache_state != STATE_EMPTY &&
mtdblk->cache_offset == sect_start) {
memcpy (buf, mtdblk->cache_data + offset, size);
} else {
ret = mtd_read(mtd, pos, size, &retlen, buf);
if (ret && !mtd_is_bitflip(ret))
return ret;
if (retlen != size)
return -EIO;
}
buf += size;
pos += size;
len -= size;
}
return 0;
}
static int mtdblock_readsect(struct mtd_blktrans_dev *dev,
unsigned long block, char *buf)
{
struct mtdblk_dev *mtdblk = container_of(dev, struct mtdblk_dev, mbd);
return do_cached_read(mtdblk, block<<9, 512, buf);
}
static int mtdblock_writesect(struct mtd_blktrans_dev *dev,
unsigned long block, char *buf)
{
struct mtdblk_dev *mtdblk = container_of(dev, struct mtdblk_dev, mbd);
if (unlikely(!mtdblk->cache_data && mtdblk->cache_size)) {
mtdblk->cache_data = vmalloc(mtdblk->mbd.mtd->erasesize);
if (!mtdblk->cache_data)
return -EINTR;
/* -EINTR is not really correct, but it is the best match
* documented in man 2 write for all cases. We could also
* return -EAGAIN sometimes, but why bother?
*/
}
return do_cached_write(mtdblk, block<<9, 512, buf);
}
static int mtdblock_open(struct mtd_blktrans_dev *mbd)
{
struct mtdblk_dev *mtdblk = container_of(mbd, struct mtdblk_dev, mbd);
pr_debug("mtdblock_open\n");
if (mtdblk->count) {
mtdblk->count++;
return 0;
}
/* OK, it's not open. Create cache info for it */
mtdblk->count = 1;
mutex_init(&mtdblk->cache_mutex);
mtdblk->cache_state = STATE_EMPTY;
if (!(mbd->mtd->flags & MTD_NO_ERASE) && mbd->mtd->erasesize) {
mtdblk->cache_size = mbd->mtd->erasesize;
mtdblk->cache_data = NULL;
}
pr_debug("ok\n");
return 0;
}
static void mtdblock_release(struct mtd_blktrans_dev *mbd)
{
struct mtdblk_dev *mtdblk = container_of(mbd, struct mtdblk_dev, mbd);
pr_debug("mtdblock_release\n");
mutex_lock(&mtdblk->cache_mutex);
write_cached_data(mtdblk);
mutex_unlock(&mtdblk->cache_mutex);
if (!--mtdblk->count) {
/*
* It was the last usage. Free the cache, but only sync if
* opened for writing.
*/
if (mbd->file_mode & FMODE_WRITE)
mtd_sync(mbd->mtd);
vfree(mtdblk->cache_data);
}
pr_debug("ok\n");
}
static int mtdblock_flush(struct mtd_blktrans_dev *dev)
{
struct mtdblk_dev *mtdblk = container_of(dev, struct mtdblk_dev, mbd);
mutex_lock(&mtdblk->cache_mutex);
write_cached_data(mtdblk);
mutex_unlock(&mtdblk->cache_mutex);
mtd_sync(dev->mtd);
return 0;
}
static void mtdblock_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
{
struct mtdblk_dev *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev)
return;
dev->mbd.mtd = mtd;
dev->mbd.devnum = mtd->index;
dev->mbd.size = mtd->size >> 9;
dev->mbd.tr = tr;
if (!(mtd->flags & MTD_WRITEABLE))
dev->mbd.readonly = 1;
if (add_mtd_blktrans_dev(&dev->mbd))
kfree(dev);
}
static void mtdblock_remove_dev(struct mtd_blktrans_dev *dev)
{
del_mtd_blktrans_dev(dev);
}
static struct mtd_blktrans_ops mtdblock_tr = {
.name = "mtdblock",
.major = MTD_BLOCK_MAJOR,
.part_bits = 0,
.blksize = 512,
.open = mtdblock_open,
.flush = mtdblock_flush,
.release = mtdblock_release,
.readsect = mtdblock_readsect,
.writesect = mtdblock_writesect,
.add_mtd = mtdblock_add_mtd,
.remove_dev = mtdblock_remove_dev,
.owner = THIS_MODULE,
};
static int __init init_mtdblock(void)
{
return register_mtd_blktrans(&mtdblock_tr);
}
static void __exit cleanup_mtdblock(void)
{
deregister_mtd_blktrans(&mtdblock_tr);
}
module_init(init_mtdblock);
module_exit(cleanup_mtdblock);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Nicolas Pitre <nico@fluxnic.net> et al.");
MODULE_DESCRIPTION("Caching read/erase/writeback block device emulation access to MTD devices");
erase_write 这个在业务逻辑上是否存在逻辑BUG,该函数执行了nand 的erase 和 write ,在erase之前会先检测该地址是否为坏块,为坏块了则返回错误,即擦写都失败。既然nand是存在坏块的可能的,那么擦地址和写地址应该自动偏移,跳过坏块才对。
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 5.4.253-g3055d27e195b-dirty (xialixin@NBKJ-5SLTP93) (gcc version 6.4.1 (OpenWrt/Linaro GCC 6.4-2017.11 2017-11)) #20 SMP Wed Sep 13 10:14:46 CST 2023
[ 0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
[ 0.000000] CPU: div instructions available: patching division code
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt: Machine model: Allwinner R16 EVB (Parrot)
[ 0.000000] Memory policy: Data cache writealloc
[ 0.000000] cma: Reserved 16 MiB at 0x47000000
[ 0.000000] On node 0 totalpages: 32768
[ 0.000000] Normal zone: 256 pages used for memmap
[ 0.000000] Normal zone: 0 pages reserved
[ 0.000000] Normal zone: 32768 pages, LIFO batch:7
[ 0.000000] psci: probing for conduit method from DT.
[ 0.000000] psci: Using PSCI v0.1 Function IDs from DT
[ 0.000000] percpu: Embedded 15 pages/cpu s30732 r8192 d22516 u61440
[ 0.000000] pcpu-alloc: s30732 r8192 d22516 u61440 alloc=15*4096
[ 0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 32512
[ 0.000000] Kernel command line: console=ttyS0,115200 earyprintk loglevel=8 root=/dev/mtdblock7 rootfstype=ext2 rootwait init=/sbin/init mtdparts=nand.0:17m(secret_a),384k(spl2_a),384k(spl3_a),384k(env_a),2m(u-boot_a),10m(kernel_a),-(rootfs_a)
[ 0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
[ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[ 0.000000] Memory: 103260K/131072K available (6144K kernel code, 437K rwdata, 1716K rodata, 1024Kinit, 245K bss, 11428K reserved, 16384K cma-reserved, 0K highmem)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[ 0.000000] rcu: Hierarchical RCU implementation.
[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[ 0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[ 0.000000] GIC: Using split EOI/Deactivate mode
[ 0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).
[ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[ 0.000006] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[ 0.000017] Switching to timer-based delay loop, resolution 41ns
[ 0.000237] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[ 0.000759] Console: colour dummy device 80x30
[ 0.000803] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=240000)
[ 0.000813] CPU: Testing write buffer coherency: ok
[ 0.000850] pid_max: default: 32768 minimum: 301
[ 0.000974] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[ 0.000987] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[ 0.002081] /cpus/cpu@0 missing clock-frequency property
[ 0.002103] /cpus/cpu@1 missing clock-frequency property
[ 0.002117] /cpus/cpu@2 missing clock-frequency property
[ 0.002132] /cpus/cpu@3 missing clock-frequency property
[ 0.002142] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[ 0.002756] do_one_initcall.923 fn=c010cf74
[ 0.002771] do_one_initcall.923 fn=c0905c14
[ 0.002794] Setting up static identity map for 0x40100000 - 0x40100060
[ 0.002801] do_one_initcall.923 fn=c0908a5c
[ 0.002817] do_one_initcall.923 fn=c09094f8
[ 0.002935] do_one_initcall.923 fn=c090a804
[ 0.002943] do_one_initcall.923 fn=c090bdc4
[ 0.002948] rcu: Hierarchical SRCU implementation.
[ 0.002955] do_one_initcall.923 fn=c090beac
[ 0.002961] do_one_initcall.923 fn=c090c0c4
[ 0.002967] do_one_initcall.923 fn=c090bec8
[ 0.003057] do_one_initcall.923 fn=c090dd3c
[ 0.003170] do_one_initcall.923 fn=c09101e4
[ 0.003178] do_one_initcall.923 fn=c03a71fc
[ 0.003310] do_one_initcall.923 fn=c0922e94
[ 0.003326] do_one_initcall.923 fn=c092c708
[ 0.003606] smp: Bringing up secondary CPUs ...
[ 0.004605] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
[ 0.005684] CPU2: thread -1, cpu 2, socket 0, mpidr 80000002
[ 0.006700] CPU3: thread -1, cpu 3, socket 0, mpidr 80000003
[ 0.006785] smp: Brought up 1 node, 4 CPUs
[ 0.006802] SMP: Total of 4 processors activated (192.00 BogoMIPS).
[ 0.006808] CPU: All CPU(s) started in HYP mode.
[ 0.006812] CPU: Virtualization extensions available.
[ 0.007297] devtmpfs: initialized
[ 0.012667] do_one_initcall.923 fn=c0915564
[ 0.012685] do_one_initcall.923 fn=c0925b68
[ 0.013161] do_one_initcall.923 fn=c0902930
[ 0.013181] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5
[ 0.013200] do_one_initcall.923 fn=c0902c40
[ 0.013207] do_one_initcall.923 fn=c0904204
[ 0.013215] do_one_initcall.923 fn=c090754c
[ 0.013221] do_one_initcall.923 fn=c0909288
[ 0.013228] do_one_initcall.923 fn=c0909280
[ 0.013234] do_one_initcall.923 fn=c0909ad4
[ 0.013320] do_one_initcall.923 fn=c090a458
[ 0.013345] do_one_initcall.923 fn=c090b20c
[ 0.013431] do_one_initcall.923 fn=c090bd00
[ 0.013438] do_one_initcall.923 fn=c090c9ac
[ 0.013445] do_one_initcall.923 fn=c090cfb4
[ 0.013456] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.013465] do_one_initcall.923 fn=c090d558
[ 0.013481] futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
[ 0.013600] do_one_initcall.923 fn=c090d920
[ 0.013620] do_one_initcall.923 fn=c090dc7c
[ 0.013637] do_one_initcall.923 fn=c01a75a0
[ 0.013655] do_one_initcall.923 fn=c0912790
[ 0.014127] do_one_initcall.923 fn=c09136f0
[ 0.014168] do_one_initcall.923 fn=c0913a74
[ 0.014189] do_one_initcall.923 fn=c0913b38
[ 0.014197] do_one_initcall.923 fn=c0913b54
[ 0.014204] do_one_initcall.923 fn=c0915374
[ 0.014224] do_one_initcall.923 fn=c0915e54
[ 0.014232] do_one_initcall.923 fn=c0916fe4
[ 0.014280] do_one_initcall.923 fn=c09170d4
[ 0.014285] pinctrl core: initialized pinctrl subsystem
[ 0.014408] do_one_initcall.923 fn=c0917288
[ 0.014454] do_one_initcall.923 fn=c091b124
[ 0.014804] do_one_initcall.923 fn=c091d068
[ 0.014821] do_one_initcall.923 fn=c091dc34
[ 0.014828] do_one_initcall.923 fn=c09211d0
[ 0.014840] do_one_initcall.923 fn=c09211f8
[ 0.014853] do_one_initcall.923 fn=c09259fc
[ 0.015129] do_one_initcall.923 fn=c0925ab4
[ 0.015148] do_one_initcall.923 fn=c0925b44
[ 0.015156] do_one_initcall.923 fn=c0925c9c
[ 0.015165] do_one_initcall.923 fn=c0926414
[ 0.015719] NET: Registered protocol family 16
[ 0.015916] do_one_initcall.923 fn=c09057b8
[ 0.017013] DMA: preallocated 256 KiB pool for atomic coherent allocations
[ 0.017027] do_one_initcall.923 fn=c090ba60
[ 0.017489] do_one_initcall.923 fn=c090e694
[ 0.017547] do_one_initcall.923 fn=c090e7b4
[ 0.017560] do_one_initcall.923 fn=c092caac
[ 0.017577] do_one_initcall.923 fn=c091738c
[ 0.017603] do_one_initcall.923 fn=c091b3bc
[ 0.017621] do_one_initcall.923 fn=c091bb7c
[ 0.017707] do_one_initcall.923 fn=c091cfac
[ 0.017742] do_one_initcall.923 fn=c091d92c
[ 0.017753] do_one_initcall.923 fn=c091dae8
[ 0.017770] do_one_initcall.923 fn=c091db20
[ 0.017799] do_one_initcall.923 fn=c091dc24
[ 0.017815] do_one_initcall.923 fn=c091de48
[ 0.017849] do_one_initcall.923 fn=c091e740
[ 0.017892] do_one_initcall.923 fn=c091fdbc
[ 0.017980] do_one_initcall.923 fn=c092c640
[ 0.018129] do_one_initcall.923 fn=c0902bd0
[ 0.018137] do_one_initcall.923 fn=c0902c6c
[ 0.018144] do_one_initcall.923 fn=c09048c8
[ 0.018266] hw-breakpoint: found 5 (+1 reserved) breakpoint and 4 watchpoint registers.
[ 0.018274] hw-breakpoint: maximum watchpoint size is 8 bytes.
[ 0.018284] do_one_initcall.923 fn=c0904e80
[ 0.018313] do_one_initcall.923 fn=c090508c
[ 0.018320] do_one_initcall.923 fn=c091af30
[ 0.018360] do_one_initcall.923 fn=c091ae48
[ 0.018398] do_one_initcall.923 fn=c0923190
[ 0.023867] do_one_initcall.923 fn=c0902c9c
[ 0.024222] do_one_initcall.923 fn=c09099b4
[ 0.024246] do_one_initcall.923 fn=c090a210
[ 0.029707] do_one_initcall.923 fn=c090a7c0
[ 0.029757] do_one_initcall.923 fn=c090d908
[ 0.029774] do_one_initcall.923 fn=c090dbe0
[ 0.029781] do_one_initcall.923 fn=c090e218
[ 0.030030] do_one_initcall.923 fn=c090e6f0
[ 0.030266] do_one_initcall.923 fn=c090ea20
[ 0.030275] do_one_initcall.923 fn=c09100a0
[ 0.030397] do_one_initcall.923 fn=c092c75c
[ 0.030406] do_one_initcall.923 fn=c01ed5e8
[ 0.030412] do_one_initcall.923 fn=c01ed5b8
[ 0.030418] do_one_initcall.923 fn=c0911c04
[ 0.030437] do_one_initcall.923 fn=c0911c9c
[ 0.030444] do_one_initcall.923 fn=c09155c8
[ 0.030861] do_one_initcall.923 fn=c09155d4
[ 0.031033] do_one_initcall.923 fn=c09155e0
[ 0.031178] do_one_initcall.923 fn=c09155ec
[ 0.031318] do_one_initcall.923 fn=c09155f8
[ 0.031398] do_one_initcall.923 fn=c0915734
[ 0.031406] do_one_initcall.923 fn=c091576c
[ 0.031415] do_one_initcall.923 fn=c09157ac
[ 0.031425] do_one_initcall.923 fn=c0915848
[ 0.031431] do_one_initcall.923 fn=c0915888
[ 0.031654] do_one_initcall.923 fn=c0917354
[ 0.031671] do_one_initcall.923 fn=c0917430
[ 0.031704] do_one_initcall.923 fn=c0917468
[ 0.031731] do_one_initcall.923 fn=c091752c
[ 0.031849] do_one_initcall.923 fn=c091b24c
[ 0.032772] do_one_initcall.923 fn=c091b26c
[ 0.032863] do_one_initcall.923 fn=c091ce00
[ 0.032896] do_one_initcall.923 fn=c048d56c
[ 0.032919] do_one_initcall.923 fn=c091de58
[ 0.032999] do_one_initcall.923 fn=c091df10
[ 0.033261] SCSI subsystem initialized
[ 0.033270] do_one_initcall.923 fn=c091e308
[ 0.033501] libata version 3.00 loaded.
[ 0.033510] do_one_initcall.923 fn=c091e944
[ 0.033603] do_one_initcall.923 fn=c091f20c
[ 0.033625] do_one_initcall.923 fn=c091f234
[ 0.033723] usbcore: registered new interface driver usbfs
[ 0.033778] usbcore: registered new interface driver hub
[ 0.033820] usbcore: registered new device driver usb
[ 0.033828] do_one_initcall.923 fn=c091f420
[ 0.033913] do_one_initcall.923 fn=c091f5cc
[ 0.033933] do_one_initcall.923 fn=c091f624
[ 0.033964] do_one_initcall.923 fn=c091f684
[ 0.033995] do_one_initcall.923 fn=c091f8f4
[ 0.034016] do_one_initcall.923 fn=c092053c
[ 0.034039] do_one_initcall.923 fn=c09205a4
[ 0.034057] pps_core: LinuxPPS API ver. 1 registered
[ 0.034063] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[ 0.034069] do_one_initcall.923 fn=c0920658
[ 0.034087] PTP clock support registered
[ 0.034094] do_one_initcall.923 fn=c09206f8
[ 0.034112] do_one_initcall.923 fn=c0920778
[ 0.034137] do_one_initcall.923 fn=c0921360
[ 0.034211] do_one_initcall.923 fn=c09214c4
[ 0.034238] do_one_initcall.923 fn=c09252c4
[ 0.034285] do_one_initcall.923 fn=c059e228
[ 0.034294] do_one_initcall.923 fn=c0925360
[ 0.034326] do_one_initcall.923 fn=c092537c
[ 0.034344] do_one_initcall.923 fn=c09253bc
[ 0.034377] Advanced Linux Sound Architecture Driver Initialized.
[ 0.034385] do_one_initcall.923 fn=c0925aa8
[ 0.034399] do_one_initcall.923 fn=c0925e30
[ 0.034812] do_one_initcall.923 fn=c092606c
[ 0.034826] do_one_initcall.923 fn=c0926324
[ 0.034837] do_one_initcall.923 fn=c0926330
[ 0.034877] do_one_initcall.923 fn=c092654c
[ 0.034920] do_one_initcall.923 fn=c092767c
[ 0.034937] do_one_initcall.923 fn=c0921044
[ 0.035269] do_one_initcall.923 fn=c0902d08
[ 0.035298] do_one_initcall.923 fn=c0907474
[ 0.035311] do_one_initcall.923 fn=c090ceb4
[ 0.035378] clocksource: Switched to clocksource arch_sys_counter
[ 0.035387] do_one_initcall.923 fn=c0912e34
[ 0.035451] do_one_initcall.923 fn=c09137d0
[ 0.035473] do_one_initcall.923 fn=c0913834
[ 0.035499] do_one_initcall.923 fn=c0913908
[ 0.035556] do_one_initcall.923 fn=c0913a34
[ 0.035569] do_one_initcall.923 fn=c0913e0c
[ 0.035578] do_one_initcall.923 fn=c0913e44
[ 0.035587] do_one_initcall.923 fn=c0913e80
[ 0.035595] do_one_initcall.923 fn=c0913ea8
[ 0.035603] do_one_initcall.923 fn=c0913ee4
[ 0.035612] do_one_initcall.923 fn=c0913f20
[ 0.035620] do_one_initcall.923 fn=c0913f58
[ 0.035637] do_one_initcall.923 fn=c0913f90
[ 0.035646] do_one_initcall.923 fn=c0913fb8
[ 0.035655] do_one_initcall.923 fn=c0913ff0
[ 0.035663] do_one_initcall.923 fn=c0914028
[ 0.035671] do_one_initcall.923 fn=c0914120
[ 0.035679] do_one_initcall.923 fn=c0914148
[ 0.035689] do_one_initcall.923 fn=c0914998
[ 0.035697] do_one_initcall.923 fn=c0915c40
[ 0.035704] do_one_initcall.923 fn=c0917a90
[ 0.035832] do_one_initcall.923 fn=c091cae0
[ 0.042480] do_one_initcall.923 fn=c091db50
[ 0.042500] do_one_initcall.923 fn=c09207ac
[ 0.042510] thermal_sys: Registered thermal governor 'step_wise'
[ 0.042921] do_one_initcall.923 fn=c092124c
[ 0.042934] do_one_initcall.923 fn=c0925cf0
[ 0.042990] do_one_initcall.923 fn=c09263fc
[ 0.042998] do_one_initcall.923 fn=c09272b8
[ 0.043090] NET: Registered protocol family 2
[ 0.043303] IP idents hash table entries: 2048 (order: 2, 16384 bytes, linear)
[ 0.043703] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 6144 bytes, linear)
[ 0.043733] TCP established hash table entries: 1024 (order: 0, 4096 bytes, linear)
[ 0.043754] TCP bind hash table entries: 1024 (order: 1, 8192 bytes, linear)
[ 0.043776] TCP: Hash tables configured (established 1024 bind 1024)
[ 0.043872] UDP hash table entries: 256 (order: 1, 8192 bytes, linear)
[ 0.043909] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)
[ 0.044072] do_one_initcall.923 fn=c0927234
[ 0.044082] do_one_initcall.923 fn=c092960c
[ 0.044093] NET: Registered protocol family 1
[ 0.044123] do_one_initcall.923 fn=c0929660
[ 0.044134] do_one_initcall.923 fn=c0929ac4
[ 0.044723] RPC: Registered named UNIX socket transport module.
[ 0.044735] RPC: Registered udp transport module.
[ 0.044740] RPC: Registered tcp transport module.
[ 0.044745] RPC: Registered tcp NFSv4.1 backchannel transport module.
[ 0.044753] do_one_initcall.923 fn=c0902820
[ 0.045140] do_one_initcall.923 fn=c0904b34
[ 0.045528] do_one_initcall.923 fn=c090917c
[ 0.045549] do_one_initcall.923 fn=c0909204
[ 0.045580] do_one_initcall.923 fn=c09092a0
[ 0.045649] do_one_initcall.923 fn=c09095e0
[ 0.045666] do_one_initcall.923 fn=c090bcd0
[ 0.045673] do_one_initcall.923 fn=c090bce8
[ 0.045679] do_one_initcall.923 fn=c090cbc8
[ 0.045685] do_one_initcall.923 fn=c090cf38
[ 0.045830] do_one_initcall.923 fn=c090cfd4
[ 0.045843] do_one_initcall.923 fn=c090d018
[ 0.045898] do_one_initcall.923 fn=c090d0c0
[ 0.045950] do_one_initcall.923 fn=c090d100
[ 0.046241] do_one_initcall.923 fn=c090d200
[ 0.046249] do_one_initcall.923 fn=c090d880
[ 0.046260] do_one_initcall.923 fn=c090d8a8
[ 0.046278] do_one_initcall.923 fn=c090dcfc
[ 0.046300] do_one_initcall.923 fn=c090ddf0
[ 0.046326] do_one_initcall.923 fn=c090de08
[ 0.046458] do_one_initcall.923 fn=c090e2e4
[ 0.046588] do_one_initcall.923 fn=c090e3f4
[ 0.046626] do_one_initcall.923 fn=c090e7ec
[ 0.046634] do_one_initcall.923 fn=c090fd9c
[ 0.046647] do_one_initcall.923 fn=c0910100
[ 0.046654] workingset: timestamp_bits=30 max_order=15 bucket_order=0
[ 0.046662] do_one_initcall.923 fn=c0910358
[ 0.046671] do_one_initcall.923 fn=c0911208
[ 0.046703] do_one_initcall.923 fn=c0911c74
[ 0.046713] do_one_initcall.923 fn=c0911fec
[ 0.051746] do_one_initcall.923 fn=c0912e88
[ 0.051767] do_one_initcall.923 fn=c09130f0
[ 0.051782] do_one_initcall.923 fn=c09134e0
[ 0.051795] do_one_initcall.923 fn=c0913610
[ 0.051827] do_one_initcall.923 fn=c09136b0
[ 0.051843] do_one_initcall.923 fn=c091374c
[ 0.051864] do_one_initcall.923 fn=c0913970
[ 0.052078] do_one_initcall.923 fn=c09139f4
[ 0.052096] do_one_initcall.923 fn=c0913b70
[ 0.052200] do_one_initcall.923 fn=c0913bb4
[ 0.052215] do_one_initcall.923 fn=c0914240
[ 0.052248] do_one_initcall.923 fn=c09144c0
[ 0.052875] do_one_initcall.923 fn=c091485c
[ 0.053103] do_one_initcall.923 fn=c09149f0
[ 0.053270] do_one_initcall.923 fn=c0914a50
[ 0.053280] do_one_initcall.923 fn=c0914ae0
[ 0.053906] do_one_initcall.923 fn=c0915228
[ 0.053918] do_one_initcall.923 fn=c0915240
[ 0.053924] do_one_initcall.923 fn=c0915258
[ 0.053930] NFS: Registering the id_resolver key type
[ 0.053982] Key type id_resolver registered
[ 0.053988] Key type id_legacy registered
[ 0.054008] do_one_initcall.923 fn=c0915290
[ 0.054037] do_one_initcall.923 fn=c0915354
[ 0.054045] do_one_initcall.923 fn=c0915364
[ 0.054050] do_one_initcall.923 fn=c09154dc
[ 0.054068] do_one_initcall.923 fn=c0915584
[ 0.054078] do_one_initcall.923 fn=c0915908
[ 0.054089] do_one_initcall.923 fn=c0915bbc
[ 0.054096] do_one_initcall.923 fn=c0915d20
[ 0.054133] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 248)
[ 0.054140] do_one_initcall.923 fn=c0915e3c
[ 0.054148] io scheduler mq-deadline registered
[ 0.054154] do_one_initcall.923 fn=c0915e48
[ 0.054160] io scheduler kyber registered
[ 0.054165] do_one_initcall.923 fn=c0915fb0
[ 0.058151] do_one_initcall.923 fn=c0916360
[ 0.058263] do_one_initcall.923 fn=c0916408
[ 0.058531] do_one_initcall.923 fn=c0916ff4
[ 0.058762] do_one_initcall.923 fn=c091704c
[ 0.058784] do_one_initcall.923 fn=c09170a4
[ 0.058967] sun4i-usb-phy 1c19400.phy: Couldn't request ID GPIO
[ 0.059252] do_one_initcall.923 fn=c09170b4
[ 0.059339] do_one_initcall.923 fn=c09170c4
[ 0.059412] do_one_initcall.923 fn=c09171a8
[ 0.059525] do_one_initcall.923 fn=c09171b8
[ 0.059629] do_one_initcall.923 fn=c09171c8
[ 0.059718] do_one_initcall.923 fn=c09171d8
[ 0.059796] do_one_initcall.923 fn=c09171e8
[ 0.059868] do_one_initcall.923 fn=c09171f8
[ 0.059949] sun8i-a23-r-pinctrl 1f02c00.pinctrl: Reset controller missing
[ 0.059997] do_one_initcall.923 fn=c0917208
[ 0.062750] sun8i-a33-pinctrl 1c20800.pinctrl: initialized sunXi PIO driver
[ 0.062875] do_one_initcall.923 fn=c0917218
[ 0.062964] do_one_initcall.923 fn=c0917228
[ 0.063038] do_one_initcall.923 fn=c0917238
[ 0.063109] do_one_initcall.923 fn=c0917248
[ 0.063190] do_one_initcall.923 fn=c0917258
[ 0.063283] do_one_initcall.923 fn=c0917268
[ 0.063353] do_one_initcall.923 fn=c0917278
[ 0.063440] do_one_initcall.923 fn=c091747c
[ 0.063596] do_one_initcall.923 fn=c0917e58
[ 0.063658] do_one_initcall.923 fn=c0917e68
[ 0.063719] do_one_initcall.923 fn=c0917e7c
[ 0.063792] do_one_initcall.923 fn=c09191bc
[ 0.063864] do_one_initcall.923 fn=c091a4f0
[ 0.063931] do_one_initcall.923 fn=c091a8b8
[ 0.064003] do_one_initcall.923 fn=c091a8c8
[ 0.064087] do_one_initcall.923 fn=c091a8d8
[ 0.064181] do_one_initcall.923 fn=c091a8e8
[ 0.064248] do_one_initcall.923 fn=c091ac40
[ 0.064320] do_one_initcall.923 fn=c091ad80
[ 0.064495] do_one_initcall.923 fn=c091ae08
[ 0.064567] do_one_initcall.923 fn=c091ae18
[ 0.064637] do_one_initcall.923 fn=c091ae28
[ 0.064708] do_one_initcall.923 fn=c091ae38
[ 0.064784] do_one_initcall.923 fn=c091afdc
[ 0.064856] do_one_initcall.923 fn=c091afec
[ 0.067517] do_one_initcall.923 fn=c091affc
[ 0.068088] do_one_initcall.923 fn=c091b25c
[ 0.068139] do_one_initcall.923 fn=c091b27c
[ 0.068326] do_one_initcall.923 fn=c091b538
[ 0.068335] do_one_initcall.923 fn=c091b558
[ 0.110858] do_one_initcall.923 fn=c091c748
[ 0.110876] Serial: 8250/16550 driver, 8 ports, IRQ sharing disabled
[ 0.112386] do_one_initcall.923 fn=c091cac0
[ 0.112582] sun8i-a33-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pf not found, using dummy regulator
[ 0.113376] printk: console [ttyS0] disabled
[ 0.133572] 1c28000.serial: ttyS0 at MMIO 0x1c28000 (irq = 33, base_baud = 1500000) is a U6_16550A
[ 1.942602] printk: console [ttyS0] enabled
[ 1.947151] do_one_initcall.923 fn=c091cad0
[ 1.951620] do_one_initcall.923 fn=c091cee0
[ 1.955825] do_one_initcall.923 fn=c091cee8
[ 1.960066] do_one_initcall.923 fn=c091cfb8
[ 1.964616] do_one_initcall.923 fn=c091cfc8
[ 1.969175] do_one_initcall.923 fn=c091cfd8
[ 1.973422] do_one_initcall.923 fn=c091cfe8
[ 1.977955] do_one_initcall.923 fn=c091cff8
[ 1.982416] do_one_initcall.923 fn=c091d008
[ 1.986804] do_one_initcall.923 fn=c091d018
[ 1.991092] do_one_initcall.923 fn=c091d028
[ 1.995337] do_one_initcall.923 fn=c091d038
[ 1.999787] do_one_initcall.923 fn=c091d048
[ 2.004057] do_one_initcall.923 fn=c091d058
[ 2.008350] do_one_initcall.923 fn=c0476018
[ 2.012666] do_one_initcall.923 fn=c091d8ec
[ 2.016891] do_one_initcall.923 fn=c091de10
[ 2.022364] do_one_initcall.923 fn=c091de20
[ 2.026605] do_one_initcall.923 fn=c091de2c
[ 2.030807] do_one_initcall.923 fn=c091de3c
[ 2.035004] do_one_initcall.923 fn=c091e154
[ 2.039284] do_one_initcall.923 fn=c091e730
[ 2.043577] do_one_initcall.923 fn=c091e7c8
[ 2.047864] do_one_initcall.923 fn=c091e7d8
[ 2.052142] do_one_initcall.923 fn=c091e848
[ 2.056347] do_one_initcall.923 fn=c091e8bc
[ 2.060572] do_one_initcall.923 fn=c091eddc
[ 2.064854] do_one_initcall.923 fn=c091edec
[ 2.069237] do_one_initcall.923 fn=c091eefc
[ 2.073415] CAN device driver interface
[ 2.077274] do_one_initcall.923 fn=c091ef28
[ 2.081533] do_one_initcall.923 fn=c091ef38
[ 2.085836] do_one_initcall.923 fn=c091f1a0
[ 2.090046] do_one_initcall.923 fn=c091f1dc
[ 2.094300] do_one_initcall.923 fn=c091f1ec
[ 2.098689] do_one_initcall.923 fn=c091f1fc
[ 2.103072] do_one_initcall.923 fn=c091f430
[ 2.107266] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 2.113783] do_one_initcall.923 fn=c091f4a0
[ 2.117971] ehci-platform: EHCI generic platform driver
[ 2.123563] do_one_initcall.923 fn=c091f4f4
[ 2.127778] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[ 2.133993] do_one_initcall.923 fn=c091f558
[ 2.138184] ohci-platform: OHCI generic platform driver
[ 2.143676] do_one_initcall.923 fn=c091f5ac
[ 2.147921] do_one_initcall.923 fn=c091f5bc
[ 2.152316] do_one_initcall.923 fn=c091f654
[ 2.156513] do_one_initcall.923 fn=c091f790
[ 2.160691] do_one_initcall.923 fn=c091f79c
[ 2.164868] do_one_initcall.923 fn=c091f7a8
[ 2.169115] do_one_initcall.923 fn=c091f7c0
[ 2.173459] do_one_initcall.923 fn=c091f7d0
[ 2.177788] do_one_initcall.923 fn=c091f7e0
[ 2.182005] do_one_initcall.923 fn=c091f984
[ 2.186264] do_one_initcall.923 fn=c091f994
[ 2.191143] sun6i-rtc 1f00000.rtc: registered as rtc0
[ 2.196217] sun6i-rtc 1f00000.rtc: RTC enabled
[ 2.200797] do_one_initcall.923 fn=c091fdac
[ 2.205083] do_one_initcall.923 fn=c091fe7c
[ 2.209278] i2c /dev entries driver
[ 2.212792] do_one_initcall.923 fn=c091ff34
[ 2.217147] sun8i-a33-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-ph not found, using dummy regulator
[ 2.227619] do_one_initcall.923 fn=c091ff44
[ 2.231893] do_one_initcall.923 fn=c091ff54
[ 2.236116] do_one_initcall.923 fn=c091ff60
[ 2.240293] do_one_initcall.923 fn=c091ff6c
[ 2.244470] do_one_initcall.923 fn=c091ff78
[ 2.248669] do_one_initcall.923 fn=c091ff84
[ 2.252847] do_one_initcall.923 fn=c091ff90
[ 2.257035] do_one_initcall.923 fn=c091ff9c
[ 2.261212] do_one_initcall.923 fn=c091ffa8
[ 2.265399] do_one_initcall.923 fn=c091ffb4
[ 2.269576] do_one_initcall.923 fn=c091ffc0
[ 2.273752] do_one_initcall.923 fn=c091ffcc
[ 2.277940] do_one_initcall.923 fn=c091ffd8
[ 2.282117] do_one_initcall.923 fn=c091ffe4
[ 2.286303] do_one_initcall.923 fn=c091fff0
[ 2.290480] do_one_initcall.923 fn=c091fffc
[ 2.294657] do_one_initcall.923 fn=c0920008
[ 2.298843] do_one_initcall.923 fn=c0920014
[ 2.303024] do_one_initcall.923 fn=c0920020
[ 2.307211] do_one_initcall.923 fn=c092002c
[ 2.311388] do_one_initcall.923 fn=c0920038
[ 2.315575] do_one_initcall.923 fn=c0920044
[ 2.319752] do_one_initcall.923 fn=c0920050
[ 2.323928] do_one_initcall.923 fn=c092005c
[ 2.328115] do_one_initcall.923 fn=c0920068
[ 2.332292] do_one_initcall.923 fn=c0920074
[ 2.336479] do_one_initcall.923 fn=c0920080
[ 2.340655] do_one_initcall.923 fn=c092008c
[ 2.344831] do_one_initcall.923 fn=c0920098
[ 2.349018] do_one_initcall.923 fn=c09200a4
[ 2.353194] do_one_initcall.923 fn=c09200b0
[ 2.357381] do_one_initcall.923 fn=c09200bc
[ 2.361558] do_one_initcall.923 fn=c09200c8
[ 2.365744] do_one_initcall.923 fn=c09200d4
[ 2.369924] do_one_initcall.923 fn=c09200e0
[ 2.374100] do_one_initcall.923 fn=c09200ec
[ 2.378288] do_one_initcall.923 fn=c09200f8
[ 2.382465] do_one_initcall.923 fn=c0920104
[ 2.386652] do_one_initcall.923 fn=c0920110
[ 2.390829] do_one_initcall.923 fn=c092011c
[ 2.395005] do_one_initcall.923 fn=c0920128
[ 2.399191] do_one_initcall.923 fn=c0920134
[ 2.403368] do_one_initcall.923 fn=c0920140
[ 2.407554] do_one_initcall.923 fn=c092014c
[ 2.411731] do_one_initcall.923 fn=c0920158
[ 2.415917] do_one_initcall.923 fn=c0920164
[ 2.420094] do_one_initcall.923 fn=c0920170
[ 2.424271] do_one_initcall.923 fn=c092017c
[ 2.428458] do_one_initcall.923 fn=c0920188
[ 2.432635] do_one_initcall.923 fn=c0920194
[ 2.436825] do_one_initcall.923 fn=c09201a0
[ 2.441002] do_one_initcall.923 fn=c09201ac
[ 2.445178] do_one_initcall.923 fn=c09201b8
[ 2.449365] do_one_initcall.923 fn=c09201c4
[ 2.453542] do_one_initcall.923 fn=c09201d0
[ 2.457728] do_one_initcall.923 fn=c09201dc
[ 2.461905] do_one_initcall.923 fn=c09201e8
[ 2.466091] do_one_initcall.923 fn=c09201f4
[ 2.470268] do_one_initcall.923 fn=c0920200
[ 2.474444] do_one_initcall.923 fn=c092020c
[ 2.478632] do_one_initcall.923 fn=c0920218
[ 2.482808] do_one_initcall.923 fn=c0920224
[ 2.486995] do_one_initcall.923 fn=c0920230
[ 2.491172] do_one_initcall.923 fn=c092023c
[ 2.495348] do_one_initcall.923 fn=c0920248
[ 2.499534] do_one_initcall.923 fn=c0920254
[ 2.503714] do_one_initcall.923 fn=c0920260
[ 2.507909] do_one_initcall.923 fn=c092026c
[ 2.512086] do_one_initcall.923 fn=c0920278
[ 2.516273] do_one_initcall.923 fn=c0920284
[ 2.520450] do_one_initcall.923 fn=c0920290
[ 2.524626] do_one_initcall.923 fn=c092029c
[ 2.528813] do_one_initcall.923 fn=c09202a8
[ 2.532990] do_one_initcall.923 fn=c09202b4
[ 2.537176] do_one_initcall.923 fn=c09202c0
[ 2.541353] do_one_initcall.923 fn=c09202cc
[ 2.545539] do_one_initcall.923 fn=c09202d8
[ 2.549716] do_one_initcall.923 fn=c09202e4
[ 2.553892] do_one_initcall.923 fn=c09202f0
[ 2.558078] do_one_initcall.923 fn=c09202fc
[ 2.562255] do_one_initcall.923 fn=c0920308
[ 2.566441] do_one_initcall.923 fn=c0920314
[ 2.570622] do_one_initcall.923 fn=c0920320
[ 2.574798] do_one_initcall.923 fn=c092032c
[ 2.578986] do_one_initcall.923 fn=c0920338
[ 2.583163] do_one_initcall.923 fn=c0920344
[ 2.587349] do_one_initcall.923 fn=c0920350
[ 2.591526] do_one_initcall.923 fn=c092035c
[ 2.595712] do_one_initcall.923 fn=c0920368
[ 2.599889] do_one_initcall.923 fn=c0920374
[ 2.604065] do_one_initcall.923 fn=c0920380
[ 2.608251] do_one_initcall.923 fn=c092038c
[ 2.612428] do_one_initcall.923 fn=c0920398
[ 2.616614] do_one_initcall.923 fn=c09203a4
[ 2.620791] do_one_initcall.923 fn=c09203b0
[ 2.624967] do_one_initcall.923 fn=c09203bc
[ 2.629154] do_one_initcall.923 fn=c09203c8
[ 2.633330] do_one_initcall.923 fn=c09203d4
[ 2.637520] do_one_initcall.923 fn=c09203e0
[ 2.641697] do_one_initcall.923 fn=c09203ec
[ 2.645884] do_one_initcall.923 fn=c09203f8
[ 2.650061] do_one_initcall.923 fn=c0920404
[ 2.654237] do_one_initcall.923 fn=c0920410
[ 2.658424] do_one_initcall.923 fn=c092041c
[ 2.662601] do_one_initcall.923 fn=c0920428
[ 2.666787] do_one_initcall.923 fn=c0920434
[ 2.670964] do_one_initcall.923 fn=c0920440
[ 2.675140] do_one_initcall.923 fn=c092044c
[ 2.679326] do_one_initcall.923 fn=c0920458
[ 2.683503] do_one_initcall.923 fn=c0920464
[ 2.687689] do_one_initcall.923 fn=c0920470
[ 2.691866] do_one_initcall.923 fn=c092047c
[ 2.696052] do_one_initcall.923 fn=c0920488
[ 2.700228] do_one_initcall.923 fn=c0920494
[ 2.704408] do_one_initcall.923 fn=c09204a0
[ 2.708595] do_one_initcall.923 fn=c09204ac
[ 2.712772] do_one_initcall.923 fn=c09204b8
[ 2.716959] do_one_initcall.923 fn=c09204c4
[ 2.721136] do_one_initcall.923 fn=c09204d0
[ 2.725312] do_one_initcall.923 fn=c09204dc
[ 2.729498] do_one_initcall.923 fn=c09204e8
[ 2.733675] do_one_initcall.923 fn=c09204f4
[ 2.737862] do_one_initcall.923 fn=c0920500
[ 2.742038] do_one_initcall.923 fn=c092050c
[ 2.746224] do_one_initcall.923 fn=c0920518
[ 2.750401] do_one_initcall.923 fn=c0920524
[ 2.754577] do_one_initcall.923 fn=c0920530
[ 2.758763] do_one_initcall.923 fn=c0920594
[ 2.763078] do_one_initcall.923 fn=c0920748
[ 2.767386] do_one_initcall.923 fn=c0920758
[ 2.771661] do_one_initcall.923 fn=c0920768
[ 2.775948] do_one_initcall.923 fn=c09211c0
[ 2.780465] sunxi-wdt 1c20ca0.watchdog: Watchdog enabled (timeout=16 sec, nowayout=0)
[ 2.788407] do_one_initcall.923 fn=c0921258
[ 2.792633] do_one_initcall.923 fn=c0921268
[ 2.798358] do_one_initcall.923 fn=c0921398
[ 2.802738] do_one_initcall.923 fn=c09213a8
[ 2.807044] do_one_initcall.923 fn=c09213b8
[ 2.811280] do_one_initcall.923 fn=c09214b4
[ 2.815705] do_one_initcall.923 fn=c0921510
[ 2.820031] sun8i-a33-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pe not found, using dummy regulator
[ 2.830300] do_one_initcall.923 fn=c0921520
[ 2.834487] do_one_initcall.923 fn=c0921560
[ 2.838688] do_one_initcall.923 fn=c0921a68
[ 2.843063] sun4i-ss 1c15000.crypto-engine: Die ID 5
[ 2.849576] do_one_initcall.923 fn=c0922ecc
[ 2.853811] do_one_initcall.923 fn=c0922f20
[ 2.858062] do_one_initcall.923 fn=c0922f38
[ 2.862279] do_one_initcall.923 fn=c0922f50
[ 2.866511] do_one_initcall.923 fn=c0922f68
[ 2.870715] do_one_initcall.923 fn=c0922f80
[ 2.874917] do_one_initcall.923 fn=c0922f98
[ 2.879133] do_one_initcall.923 fn=c0922fb0
[ 2.883336] do_one_initcall.923 fn=c0922fc8
[ 2.887551] do_one_initcall.923 fn=c0922fe0
[ 2.891756] do_one_initcall.923 fn=c0922ff8
[ 2.895982] do_one_initcall.923 fn=c0923010
[ 2.900196] do_one_initcall.923 fn=c0923028
[ 2.904403] do_one_initcall.923 fn=c0923040
[ 2.908621] do_one_initcall.923 fn=c0923058
[ 2.912827] do_one_initcall.923 fn=c0923070
[ 2.917070] usbcore: registered new interface driver usbhid
[ 2.922632] usbhid: USB HID core driver
[ 2.926473] do_one_initcall.923 fn=c09252a4
[ 2.930669] do_one_initcall.923 fn=c0925350
[ 2.934992] do_one_initcall.923 fn=c092536c
[ 2.939409] do_one_initcall.923 fn=c09255b8
[ 2.943794] do_one_initcall.923 fn=c09257c0
[ 2.947997] do_one_initcall.923 fn=c092582c
[ 2.952498] do_one_initcall.923 fn=c0925978
[ 2.956902] do_one_initcall.923 fn=c09262e4
[ 2.961163] do_one_initcall.923 fn=c092766c
[ 2.965342] do_one_initcall.923 fn=c092776c
[ 2.969695] do_one_initcall.923 fn=c09295a8
[ 2.973877] do_one_initcall.923 fn=c0929744
[ 2.978071] NET: Registered protocol family 17
[ 2.982536] do_one_initcall.923 fn=c09297bc
[ 2.986727] can: controller area network core (rev 20170425 abi 9)
[ 2.992972] NET: Registered protocol family 29
[ 2.997427] do_one_initcall.923 fn=c0929860
[ 3.001602] can: raw protocol (rev 20170425)
[ 3.005884] do_one_initcall.923 fn=c09298a8
[ 3.010059] can: broadcast manager protocol (rev 20170425 t)
[ 3.015728] do_one_initcall.923 fn=c0929900
[ 3.019904] can: netlink gateway (rev 20190810) max_hops=1
[ 3.025559] do_one_initcall.923 fn=c0929b84
[ 3.029785] do_one_initcall.923 fn=c0929c44
[ 3.034018] Key type dns_resolver registered
[ 3.038449] do_one_initcall.923 fn=c0902d2c
[ 3.042631] do_one_initcall.923 fn=c090485c
[ 3.046827] Registering SWP/SWPB emulation handler
[ 3.051613] do_one_initcall.923 fn=c011daf8
[ 3.055824] do_one_initcall.923 fn=c09091dc
[ 3.060010] do_one_initcall.923 fn=c09091b4
[ 3.064197] do_one_initcall.923 fn=c09094d0
[ 3.068391] do_one_initcall.923 fn=c09094a8
[ 3.072574] do_one_initcall.923 fn=c090b150
[ 3.076933] do_one_initcall.923 fn=c090b1d4
[ 3.081123] do_one_initcall.923 fn=c090b60c
[ 3.085305] do_one_initcall.923 fn=c090be00
[ 3.089502] do_one_initcall.923 fn=c090d520
[ 3.093687] do_one_initcall.923 fn=c0910224
[ 3.097882] do_one_initcall.923 fn=c0911c6c
[ 3.102059] do_one_initcall.923 fn=c0912230
[ 3.106245] do_one_initcall.923 fn=c09154d0
[ 3.110529] do_one_initcall.923 fn=c0915f78
[ 3.114709] do_one_initcall.923 fn=c0917b34
[ 3.126315] do_one_initcall.923 fn=c0470d2c
[ 3.130821] sun8i-a33-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pd not found, using dummy regulator
[ 3.143641] sun8i-a23-r-pinctrl 1f02c00.pinctrl: initialized sunXi PIO driver
[ 3.152619] sun8i-a23-r-pinctrl 1f02c00.pinctrl: 1f02c00.pinctrl supply vcc-pl not found, using dummy regulator
[ 3.163015] sunxi-rsb 1f03400.rsb: RSB running at 3000000 Hz
[ 3.169092] axp20x-rsb sunxi-rsb-3a3: AXP20x variant AXP223 found
[ 3.177792] input: axp20x-pek as /devices/platform/soc/1f03400.rsb/sunxi-rsb-3a3/axp221-pek/input/input0
[ 3.187851] axp20x-adc axp22x-adc: DMA mask not set
[ 3.193316] axp20x-battery-power-supply axp20x-battery-power-supply: DMA mask not set
[ 3.201491] vcc-3v0: supplied by regulator-dummy
[ 3.206485] vdd-sys: supplied by regulator-dummy
[ 3.211344] vdd-cpu: supplied by regulator-dummy
[ 3.216348] dcdc4: supplied by regulator-dummy
[ 3.220908] vcc-dram: supplied by regulator-dummy
[ 3.225957] dc1sw: supplied by vcc-3v0
[ 3.229836] vdd-cpus: supplied by vcc-dram
[ 3.234164] vcc-io: supplied by regulator-dummy
[ 3.238979] vdd-dll: supplied by regulator-dummy
[ 3.243844] vcc-pll-avcc: supplied by regulator-dummy
[ 3.249200] vcc-1v2-hsic: Bringing 700000uV into 1200000-1200000uV
[ 3.255607] vcc-1v2-hsic: supplied by regulator-dummy
[ 3.260762] vcc-dsp: Bringing 700000uV into 3000000-3000000uV
[ 3.266695] vcc-dsp: supplied by regulator-dummy
[ 3.271431] eldo3: Bringing 700000uV into 3000000-3000000uV
[ 3.277207] eldo3: supplied by regulator-dummy
[ 3.281745] vcc-wifi0: Bringing 700000uV into 3300000-3300000uV
[ 3.287743] vcc-wifi0: supplied by regulator-dummy
[ 3.292779] vcc-wifi1: Bringing 700000uV into 3300000-3300000uV
[ 3.298769] vcc-wifi1: supplied by regulator-dummy
[ 3.303845] vcc-3v0-csi: Bringing 700000uV into 3000000-3000000uV
[ 3.310126] vcc-3v0-csi: supplied by regulator-dummy
[ 3.315342] dldo4: supplied by regulator-dummy
[ 3.319929] rtc_ldo: supplied by regulator-dummy
[ 3.324882] ldo_io0: supplied by regulator-dummy
[ 3.329770] ldo_io1: supplied by regulator-dummy
[ 3.334610] usb0-vbus: supplied by vcc5v0
[ 3.339065] axp20x-ac-power-supply axp20x-ac-power-supply: DMA mask not set
[ 3.346376] axp20x-usb-power-supply axp20x-usb-power-supply: DMA mask not set
[ 3.354600] axp20x-rsb sunxi-rsb-3a3: AXP20X driver loaded
[ 3.361237] ehci-platform 1c1a000.usb: EHCI Host Controller
[ 3.366880] ehci-platform 1c1a000.usb: new USB bus registered, assigned bus number 1
[ 3.375201] ehci-platform 1c1a000.usb: irq 26, io mem 0x01c1a000
[ 3.405396] ehci-platform 1c1a000.usb: USB 2.0 started, EHCI 1.00
[ 3.412269] hub 1-0:1.0: USB hub found
[ 3.416077] hub 1-0:1.0: 1 port detected
[ 3.420767] ohci-platform 1c1a400.usb: Generic Platform OHCI controller
[ 3.427418] ohci-platform 1c1a400.usb: new USB bus registered, assigned bus number 2
[ 3.435449] ohci-platform 1c1a400.usb: irq 27, io mem 0x01c1a400
[ 3.510036] hub 2-0:1.0: USB hub found
[ 3.513825] hub 2-0:1.0: 1 port detected
[ 3.518620] usb_phy_generic usb_phy_generic.1.auto: usb_phy_generic.1.auto supply vcc not found, using dummy regulator
[ 3.529768] musb-hdrc musb-hdrc.2.auto: MUSB HDRC host driver
[ 3.535547] musb-hdrc musb-hdrc.2.auto: new USB bus registered, assigned bus number 3
[ 3.544162] hub 3-0:1.0: USB hub found
[ 3.547964] hub 3-0:1.0: 1 port detected
[ 3.553229] input: 1c22800.lradc as /devices/platform/soc/1c22800.lradc/input/input1
[ 3.561252] do_one_initcall.923 fn=c091f7f0
[ 3.565495] sun6i-rtc 1f00000.rtc: setting system clock to 1970-01-01T00:00:55 UTC (55)
[ 3.573487] do_one_initcall.923 fn=c0923248
[ 3.577817] do_one_initcall.923 fn=c0926d2c
[ 3.581998] do_one_initcall.923 fn=c0928478
[ 3.586208] do_one_initcall.923 fn=c03d263c
[ 3.590486] do_one_initcall.923 fn=c091b0d8
[ 3.594668] do_one_initcall.923 fn=c0925988
[ 3.598856] ALSA device list:
[ 3.601824] No soundcards found.
[ 3.605955] Waiting for root device /dev/mtdblock7...
[ 33.755403] vcc3v0: disabling
[ 33.758373] vcc3v3: disabling
[ 33.761337] vcc5v0: disabling
[ 33.764309] dc1sw: disabling
U-Boot(SPL) SPL 2023.10-rc2-g8ba06ef2-dirty (Sep 12 2023 - 14:49:02 +0800)
DRAM: 128 MiB
Trying to boot from FEL
U-Boot 2023.10-rc2-g8ba06ef2-dirty (Sep 12 2023 - 14:49:02 +0800) Allwinner Technology
CPU: Allwinner A33 (SUN8I 1667)
Model: Allwinner R16 EVB (Parrot)
DRAM: 128 MiB
Core: 26 devices, 18 uclasses, devicetree: separate
WDT: Not starting watchdog@1c20ca0
NAND: 128 MiB
Loading Environment from NAND... *** Warning - bad CRC, using default environment
Loading Environment from NAND... *** Warning - bad CRC, using default environment
In: serial,usbkbd
Out: serial
Err: serial
Allwinner mUSB OTG (Peripheral)
Net: using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC de:ad:be:ef:00:01
HOST MAC de:ad:be:ef:00:00
RNDIS ready
eth0: usb_ether
starting USB...
Bus usb@1c1a000: USB EHCI 1.00
Bus usb@1c1a400: USB OHCI 1.0
scanning bus usb@1c1a000 for devices... 1 USB Device(s) found
scanning bus usb@1c1a400 for devices... 1 USB Device(s) found
scanning usb for storage devices... 0 Storage Device(s) found
Hit any key to stop autoboot: 0
musb-hdrc: peripheral reset irq lost!
Starting download of 4377528 bytes
.................................
downloading of 4377528 bytes finished
Flashing image at offset 0x1420000
download kernel iamge addr:0x40008000 len:4377528
Starting download of 23769 bytes
downloading of 23769 bytes finished
Flashing image at offset 0x1420000
download dtb iamge addr:0x41000000 len:23769
status: -108 ep 'ep1in' trans: 4
## Booting kernel from Legacy Image at 40008000 ...
Image Name: ARM OpenWrt Linux-5.4.61
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4377464 Bytes = 4.2 MiB
Load Address: 40008000
Entry Point: 40008000
Verifying Checksum ... OK
Working FDT set to 41000000
Loading Kernel Image
Loading Device Tree to 40f2c000, end 40f34cd8 ... OK
Working FDT set to 40f2c000
Using machid 4137 from environment
Starting kernel ...
前面部分是启用MTD设备但是没有启用Raw/Parallel Nand device support的,可以执行到wait for xxx,后面部分是启用了Raw/Parallel Nand device support的,直接就死掉了。
0.拆机飞线图
1.代码拉取(参考:https://www.bilibili.com/read/cv17374238?spm_id_from=333.999.0.0)
1.0 编译环境要求(最好是ubuntu16.04, ubuntu16.04 往后的版本,编译过程中各种问题,解决很耗时间,再装一个ubuntu16比较省事)
1.1安装依赖环境:
apt-get install git zlib1g-dev libexpat1-dev python texinfo build-essential unzip libssl-dev libxml-simple-perl libxml-sax-perl libxml2-dev libxml2-utils xsltproc wget bc ccache libc6-dev-i386 lib32ncurses5-dev lib32z1-dev gnupg cpio vim curl gawk busybox
1.2 下载repo工具
./repo init -u https://github.com/tinalinux/manifest -b r16-v2.1.y -m r16/v2.1.y.xml
./repo sync
./repo start r16-v2.1.y --all
1.3 参考中的 uboot 部分不需要下载,我们只烧录rootfs1 kernel1 两个分区
2.编译 tina-linux
export FORCE_UNSAFE_CONFIGURE=1
source build/envsetup.sh
lunch astar_parrot-tina
make menuconfig
make
3.配置linux
croot
make kernel-menuconfig
4.输出文件在 out/astar-parrot 下
astar-parrot-uImage compile_dir md5sums rootfs.img staging_dir tina_astar-arrot_uart0.img boot.img image packages sha256sums tina_astar-parrot_card0.img
5. take.rootfs.kernel1.sh kernal 镜像打包、ROOTFS拷贝,执行完成后拷贝到d://xiaoai/
#!/bin/bash
if [ "1" = "$1" ] ; then
if [ -e "./astar-parrot/rootfs.img" ] ; then
cp -rf ./astar-parrot/rootfs.img /mnt/d/xiaoai && echo "copy rootfs.img to xiaoai"
else
echo "please make root image"
fi
elif [ -f "./astar-parrot/astar-parrot-uImage" ] ; then
if [ -e "./kernel.img" ] ; then
echo "1.rm kernel.img"
rm -rf kernel.img
fi
if [ -e "./kernel" ] ; then
echo "2.skip mkdir kernel "
else
echo "2.mkdir ./kernel"
mkdir ./kernel
fi
dd if=/dev/zero of=./kernel.img bs=1024 count=6144 && echo "3.create kernel.img"
mkfs.fat ./kernel.img && echo "4.mkfs kernel.img"
mount -t vfat ./kernel.img ./kernel && echo "5.mount kernel.img"
cp -r ./astar-parrot/astar-parrot-uImage ./kernel/uimage && echo "6.cp uimage to kernel.img"
umount ./kernel && echo "7.umount kernel"
cp -rf ./kernel.img /mnt/d/xiaoai && echo "8.fat is contain of uimage...."
else
echo "please make kernel image!!!"
fi
6.安装adb fastboot 驱动
下载驱动文件,把名字修修改为 xxx.exe 后安装 或者百度9008免签名驱动 把,链接资源有问题
7.烧录
1.打开串口,按住s键不松手,等待小爱上电
2.把小爱USB插入PC
3.fastboot_test 开启fastboot 模式
8.刷机脚本 fastboot.burnning.sh(我本地安装的是git_bash)
#!/bin/bash
if [ "$1" = "r" ] ; then
fastboot erase rootfs1 && fastboot flash rootfs1 rootfs.img
fastboot reboot
elif [ "$1" = "k" ] ; then
fastboot erase kernel1 && fastboot flash kernel1 kernel.img
fastboot reboot
else
fastboot erase rootfs1 && fastboot flash rootfs1 rootfs.img
fastboot erase kernel1 && fastboot flash kernel1 kernel.img
fastboot reboot
fi
9.nand驱动修改: tina-linux/lichee/linux-3.4/drivers/block/nand/sun8iw5p1/lib/src/physic/nand_id.c
在nand_id.c 中 struct __NandPhyInfoPar_t SamsungNandTbl[] 结构体内,替换原来的
chip_id ={0xec, 0xf1, 0x00, 0x95, 0xff, 0xff, 0xff, 0xff },的内容。
{ {0xec, 0xf1, 0x00, 0x95, 0xff, 0xff, 0xff, 0xff }, 1, 4, 64, 1024, 0x4000008c, 896, 30, 0, 0, 0, &PhysicArchiPara0, &DefDDRInfo, 0x000001 ,20000}, // K9F1G08 FS33NDO01GS10
10.运行结果
11.请问一下小爱mini使用的 WIFI BT芯片具体型号。
https://blog.csdn.net/github_38345754/article/details/108697710/]这里可以看出大概是bcm43438,但是不肯定
@muxi01
高通410 wifi棒子?
我已经用它推流直播了😂
【wifi棒B站24h推流测试-哔哩哔哩直播】 https://b23.tv/XG4CODS
有直播内容吗?没有版权的那种?
1.修改设备树 /board/widora/mangopi/r3/devicetree/linux/devicetree.dts
&usb_otg {
dr_mode = "host"; /* host peripheral */
status = "okay";
};
2.下载驱动源码https://codeload.github.com/aircrack-ng/rtl8188eus/zip/v5.3.9
解压后拷贝到 /output/build/linux-5.4.66/drivers/net/wireless/realtek/rtl8188eus
2.1修改/output/build/linux-5.4.66/drivers/net/wireless/realte/Kconfig,加入
source "drivers/net/wireless/realtek/rtl8188eus/Kconfig"
2.2修改/output/build/linux-5.4.66/drivers/net/wireless/realte/Makefile,加入
obj-$(CONFIG_RTL8188EU) += rtl8188eus/
2.3修改 rtl8188eus/include/osdep_service_bsd.h,第120行改为
#define LINUX_VERSION_CODE KERNEL_VERSION(5, 4, 66)
3.加入wpa_supplicant工具
make menuconfig
localtion
->Target pckages
->Networking applications
[*] wpa_supplicant
4.make linux-menuconfig 配置网络
localtion
-*- Wireless --->
<*> cfg80211 - wireless configuration API
[*] support CRDA
[*] cfg80211 wireless extensions compatibility
<*> Generic IEEE 802.11 Networking Stack (mac80211)
[*] Minstrel
[*] Networking support --->
<*> RF switch subsystem support --->
->Device Drivers
[*] Network device support --->
[*] Network core driver support
<*> IEEE 802.1AE MAC-level encryption (MACsec)
[*] Wireless LAN --->
[*] mac80211-based legacy WDS support
[*] Ralink devices
<*> Ralink driver support --->
[*] Realtek devices
<M> Realtek 8188E USB WiFi
[*] USB support --->
<*> Support for Host-side USB
*** USB Host Controller Drivers ***
<*> EHCI HCD (USB 2.0) support
<*> Generic EHCI driver for a platform device
<*> OHCI HCD (USB 1.1) support
<*> Generic OHCI driver for a platform device
MUSB Mode Selection (Host only mode) ---> #别错过这里,否则USB模式可能会出错
<*> Inventra Highspeed Dual Role Controller
<*> ChipIdea Highspeed Dual Role Controller
[*] ChipIdea host controller
5.编译,刷机。
6.安装驱动,启动网卡,创建运行需要的临时文件夹
insmod ./lib/modules/5.4.66/kernel/drivers/net/wireless/realtek/rtl8188eus/8188eu.ko
ifconfig wlan0 up
mkdir -p /var/run/wpa_supplicant
7.新建配置文件 /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
ssid="mishare" #wifi名字
psk="qwer1234" #wifi密码
}
8.链接网络
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
9.配置IP地址<暂时没有使用udhcpc工具>
ifconfig wlan0 192.168.137.202
1.tinymix 打开耳放通道
tinymix set 3 1
tinymix set 1 63
2.查看配置
# tinymix contents
Number of controls: 25
ctl type num name value
0 INT 1 DAC Playback Volume 63 (range 0->63)
1 INT 1 Headphone Playback Volume 63 (range 0->63)
2 BOOL 2 Headphone Playback Switch On, On
3 INT 1 Line In Playback Volume 0 (range 0->7)
4 INT 1 FM In Playback Volume 0 (range 0->7)
5 INT 1 Mic In Playback Volume 3 (range 0->7)
6 INT 1 Mic Boost Volume 4 (range 0->7)
7 INT 1 ADC Capture Volume 3 (range 0->7)
8 BOOL 1 ADC Mixer Right Out Capture Switch On
9 BOOL 1 ADC Mixer Left Out Capture Switch Off
10 BOOL 1 ADC Mixer Line In Capture Switch Off
11 BOOL 1 ADC Mixer Right FM In Capture Switch Off
12 BOOL 1 ADC Mixer Left FM In Capture Switch Off
13 BOOL 1 ADC Mixer Mic Capture Switch Off
14 BOOL 1 Left Mixer Right DAC Playback Switch On
15 BOOL 1 Left Mixer Left DAC Playback Switch Off
16 BOOL 1 Left Mixer FM In Playback Switch Off
17 BOOL 1 Left Mixer Line In Playback Switch Off
18 BOOL 1 Left Mixer Mic In Playback Switch Off
19 BOOL 1 Right Mixer Left DAC Playback Switch On
20 BOOL 1 Right Mixer Right DAC Playback Switch Off
21 BOOL 1 Right Mixer FM In Playback Switch Off
22 BOOL 1 Right Mixer Line In Playback Switch Off
23 BOOL 1 Right Mixer Mic In Playback Switch Off
24 ENUM 2 Headphone Source Playback Route , DACMixer, , DACMixer
3.tinyplay 播放
tinyplay startup.wav
1.tinymix 打开播放器通道
tinymix set 3 1
tinymix set 1 63
2.查看配置
# tinymix contents
Number of controls: 25
ctl type num name value
0 INT 1 DAC Playback Volume 63 (range 0->63)
1 INT 1 Headphone Playback Volume 63 (range 0->63)
2 BOOL 2 Headphone Playback Switch On, On
3 INT 1 Line In Playback Volume 0 (range 0->7)
4 INT 1 FM In Playback Volume 0 (range 0->7)
5 INT 1 Mic In Playback Volume 3 (range 0->7)
6 INT 1 Mic Boost Volume 4 (range 0->7)
7 INT 1 ADC Capture Volume 3 (range 0->7)
8 BOOL 1 ADC Mixer Right Out Capture Switch On
9 BOOL 1 ADC Mixer Left Out Capture Switch Off
10 BOOL 1 ADC Mixer Line In Capture Switch Off
11 BOOL 1 ADC Mixer Right FM In Capture Switch Off
12 BOOL 1 ADC Mixer Left FM In Capture Switch Off
13 BOOL 1 ADC Mixer Mic Capture Switch Off
14 BOOL 1 Left Mixer Right DAC Playback Switch On
15 BOOL 1 Left Mixer Left DAC Playback Switch Off
16 BOOL 1 Left Mixer FM In Playback Switch Off
17 BOOL 1 Left Mixer Line In Playback Switch Off
18 BOOL 1 Left Mixer Mic In Playback Switch Off
19 BOOL 1 Right Mixer Left DAC Playback Switch On
20 BOOL 1 Right Mixer Right DAC Playback Switch Off
21 BOOL 1 Right Mixer FM In Playback Switch Off
22 BOOL 1 Right Mixer Line In Playback Switch Off
23 BOOL 1 Right Mixer Mic In Playback Switch Off
24 ENUM 2 Headphone Source Playback Route , DACMixer, , DACMixer
3.tinyplay 播放
tinyplay startup.wav
1.make linux-menuconfig使能pty字符型设备,使能RNDIS设备
Location:
-> Device Drivers
-> Character devices
[ ] Unix98 PTY support 取消掉这个
[*] Legacy (BSD) PTY support 使用这个
(5) Maximum number of legacy PTY in use
->Device Drivers
-> USB support
-> USB Gadget Support
<M> USB Gadget functions configurable through configfs
[*] Network Control Model (CDC NCM)
[*] Ethernet Control Model (CDC ECM)
[*] Ethernet Control Model (CDC ECM) subset
[*] RNDIS
[*] Ethernet Emulation Model (EEM)
<M> USB Gadget precomposed configurations
<M> Ethernet Gadget (with CDC Ethernet support)
[*] RNDIS support
<M> CDC Composite Device (Ethernet and ACM)
<M> CDC Composite Device (ACM and mass storage
2.修改pacakge\dropbear\dropbear.mk,屏蔽掉如下内容,否则无法创建dropbear文件夹
#ln -snf /var/run/dropbear $(TARGET_DIR)/etc/dropbear
3.替换S50dropbear
#!/bin/sh
#
# Starts dropbear sshd.
#
# Allow a few customizations from a config file
test -r /etc/default/dropbear && . /etc/default/dropbear
start() {
DROPBEAR_ARGS="$DROPBEAR_ARGS -r /etc/dropbear/dropbear_rsa_host_key"
# If /etc/dropbear is a symlink to /var/run/dropbear, and
# - the filesystem is RO (i.e. we can not rm the symlink),
# create the directory pointed to by the symlink.
# - the filesystem is RW (i.e. we can rm the symlink),
# replace the symlink with an actual directory
if [ -L /etc/dropbear \
-a "$(readlink /etc/dropbear)" = "/var/run/dropbear" ]
then
if rm -f /etc/dropbear >/dev/null 2>&1; then
mkdir -p /etc/dropbear
else
echo "No persistent location to store SSH host keys. New keys will be"
echo "generated at each boot. Are you sure this is what you want to do?"
mkdir -p "$(readlink /etc/dropbear)"
fi
else
if [ ! -d /etc/dropbear ]; then
mkdir -p /etc/dropbear
fi
if [ ! -e /etc/dropbear/dropbear_rsa_host_key ]; then
/usr/bin/dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
fi
fi
printf "Starting dropbear sshd: "
umask 077
start-stop-daemon -S -q -p /var/run/dropbear.pid \
--exec /usr/sbin/dropbear -- $DROPBEAR_ARGS
[ $? = 0 ] && echo "OK" || echo "FAIL"
}
stop() {
printf "Stopping dropbear sshd: "
start-stop-daemon -K -q -p /var/run/dropbear.pid
[ $? = 0 ] && echo "OK" || echo "FAIL"
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
4.make menuconfig 使能dropbear
location
->Target packages
-> networking applications
[*] dropbear
6.usb网卡启动脚本S40network 拷贝到./widora/mangopi/r3/rootfs/etc/init.d/S40network
#!/bin/sh
#
# Start the network....
#
# Debian ifupdown needs the /run/network lock directory
mkdir -p /run/network
installRNDIS()
{
modprobe g_ether
if [ $? -eq 0 ]
then
/sbin/ifconfig usb0 up
/sbin/ifconfig usb0 '192.168.5.100'
[ $? = 0 ] && echo 'Starting network: OK' || echo "Starting network:FAIL"
else
echo 'failed to install RNDIS(ethernet over usb)'
fi
}
case "$1" in
start)
installRNDIS
# printf "Starting network: "
# /sbin/ifup -a
# [ $? = 0 ] && echo "OK" || echo "FAIL"
;;
stop)
printf "Stopping network: "
/sbin/ifdown -a
[ $? = 0 ] && echo "OK" || echo "FAIL"
;;
restart|reload)
"$0" stop
"$0" start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
7.编译
编译完成后output/target下会多出很多ko文件,find -name *.ko来查看
./lib/modules/5.4.66/kernel/drivers/input/touchscreen/goodix.ko
./lib/modules/5.4.66/kernel/drivers/input/touchscreen/tsc2007.ko
./lib/modules/5.4.66/kernel/drivers/media/i2c/ov5640.ko
./lib/modules/5.4.66/kernel/drivers/media/i2c/ov2640.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/usb_f_eem.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/u_serial.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/usb_f_obex.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/usb_f_ecm_subset.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/usb_f_rndis.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/u_ether.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/usb_f_acm.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/usb_f_ss_lb.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/usb_f_serial.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/usb_f_ecm.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/usb_f_fs.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/usb_f_ncm.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/usb_f_mass_storage.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/legacy/g_cdc.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/legacy/g_acm_ms.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/legacy/g_serial.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/legacy/gadgetfs.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/legacy/g_mass_storage.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/legacy/g_ether.ko
./lib/modules/5.4.66/kernel/drivers/usb/gadget/libcomposite.ko
8.驱动安装,压缩包里面有readme文件 https://download.csdn.net/download/Seeker_ZeroOne/13087112
9.驱动安装完成后,需要在控制面板\网络和 Internet\网络连接 中修改RNDIS网卡的IP为 :192.168.5.xxx
1.tinymix 查看控制器状态
tinymix contents
Number of controls: 25
ctl type num name value
0 INT 1 DAC Playback Volume 63 (range 0->63)
1 INT 1 Headphone Playback Volume 0 (range 0->63)
2 BOOL 2 Headphone Playback Switch Off, Off
3 INT 1 Line In Playback Volume 0 (range 0->7)
4 INT 1 FM In Playback Volume 0 (range 0->7)
5 INT 1 Mic In Playback Volume 3 (range 0->7)
6 INT 1 Mic Boost Volume 4 (range 0->7)
7 INT 1 ADC Capture Volume 3 (range 0->7)
8 BOOL 1 ADC Mixer Right Out Capture Switch Off
9 BOOL 1 ADC Mixer Left Out Capture Switch Off
10 BOOL 1 ADC Mixer Line In Capture Switch Off
11 BOOL 1 ADC Mixer Right FM In Capture Switch Off
12 BOOL 1 ADC Mixer Left FM In Capture Switch Off
13 BOOL 1 ADC Mixer Mic Capture Switch Off
14 BOOL 1 Left Mixer Right DAC Playback Switch Off
15 BOOL 1 Left Mixer Left DAC Playback Switch Off
16 BOOL 1 Left Mixer FM In Playback Switch Off
17 BOOL 1 Left Mixer Line In Playback Switch Off
18 BOOL 1 Left Mixer Mic In Playback Switch Off
19 BOOL 1 Right Mixer Left DAC Playback Switch Off
20 BOOL 1 Right Mixer Right DAC Playback Switch Off
21 BOOL 1 Right Mixer FM In Playback Switch Off
22 BOOL 1 Right Mixer Line In Playback Switch Off
23 BOOL 1 Right Mixer Mic In Playback Switch Off
2.打开控制器为13的 capture设备
tinymix set 13 1
3.录音
tinycap xixi.wav -t 2
make linux-menuconfig配置如下:
启用U盘shell指令如下:
dd if=/dev/zero of=udisk.img bs=1M count=5
insmod ./lib/modules/5.4.66/kernel/drivers/usb/gadget/libcomposite.ko
insmod ./lib/modules/5.4.66/kernel/drivers/usb/gadget/function/usb_f_mass_storage.ko
insmod ./lib/modules/5.4.66/kernel/drivers/usb/gadget/legacy/gadgetfs.ko
insmod ./lib/modules/5.4.66/kernel/drivers/usb/gadget/legacy/g_mass_storage.ko file=/udisk.img removable=1
遇到的问题:增加图4的配置即可
udc-core: couldn't find an available UDC - added [g_mass_storage] to list of pending drivers
成功连到电脑:
1.进入fel模式
按住复位 + boot,依次先后释放开复位,boot ,此时PC端会出现新的设备,WIN需要装驱动(https://widora.io/_media/zh/zadig-2_3_exe.7z),我的是MAC+ubuntu组合不需要安装驱动
2.执行dfu_nand-all.sh
3. 执行fel-uboot.sh
正常情况下可以完成刷机,win可能缺少驱动,而失败,此时需要修改 dfu_wait_timeout
R3 运行bootloader,Ctrl+C强制打断,editing dfu_wait_timeout ,修改为1000,然后运行run dfu_nand, 然后安装驱动(https://widora.io/_media/zh/zadig-2_3_exe.7z)。不出意外会顺利完成刷机。
1.新增对设备的支持
linux系统中,修改linux-5.xx/driver/mtd/nand/spi/winbond.c 第95行 加入如下代码:
SPINAND_INFO("GD51FGQ", 0x9F,
NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
NAND_ECCREQ(1, 512),
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
&write_cache_variants,
&update_cache_variants),
0,
SPINAND_ECCINFO(&w25m02gv_ooblayout, NULL)),
2.使能设备树 nand设备 board/widora/mangopi/r3/devicetree/linux/devicetree.dts
spi-nor@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "winbond,w25q128", "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <50000000>;
status = "disabled"; //这里是新增的
......
spi-nand@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "spi-nand";
reg = <0>;
spi-max-frequency = <50000000>;
status = "okay"; //默认是disabled,
.....
执行: rebuild-kernel.sh 即可
页次: 1