⑴ 如何在ARM linux上使用FDT和initrd
这文章算是最近工作的备忘。
FDT是ARM
Linux最新的设备驱动程序信息表,使用FDT的内核,就不用像过去的内核那样,一个板子加一个mach的C文件,所有的设备信息可以记录在一个树状信息文件里面。
目前这方面资料比较少,我以AM335x处理器为例概括一下FDT的使用:
FDT仅仅是一个信息的目录和参数表,要使用某个功能内核中还必须有相应的驱动程序代码
FDT的源文件位置在:arch/arm/boot/dts,例如,TI的Beagle bone black,源文件是arch/arm/boot/dts/am335x_boneblack.dts
FDT在make ARCH=arm的时候就会自动生成,也可用make ARCH=arm
dtbs来生成,例如TI的Beagle bone black生成的文件是arch/arm/boot/dts/am335x_boneblack.dtb,这是一个二进制文件
要想新增你自定义的FDT,请修改arch/arm/boot/dts/Makefile,并在相应的Kconfig中增加config选项,例如,TI的Beagle
bone black,Kconfig的位置在arch/arm/mach-omap2/Kconfig
FDT的dtb文件由u-boot传递给内核,u-boot必须把这个文件拷贝到内核解压地址之后的某个位置,确保内核解压的时候不会覆盖,然后使用“bootm
[内核地址] - [dtb地址]”来启动内核
如果dtb文件不正确,对于3.10以上的内核,可能什么显示都没有,3.8内核,可能就显示到Uncompressing kernel......done
FDT的编写规则说明在Documentation/devicetree/bindings,不同的设备有相应的txt文件说明,其中的“compatible”可以作为关键字搜索驱动程序的源文件,例如,AM335x的GPIO,用“ti,omap4-gpio”为关键字,可以找到其代码位于drivers/gpio/gpio-omap.c
FDT可以包含子文件,比如am335x_boneblack.dts就包含了am33xx.dtsi,am335x-bone-common.dtsi
以一个例子来说明编写规则,我的板子上,I2C0上挂了一个音频CODEC,其地址是0x18,型号是TLV320AIC3104IRHBT。
先找到i2c0节点的位置,这在arch/arm/boot/dts/am33xx.dtsi中:
i2c0: i2c@44e0b000
{
compatible =
"ti,omap4-i2c";
#address-cells =
<1>;
#size-cells =
<0>;
ti,hwmods =
"i2c1";
reg = <0x44e0b000
0x1000>;
interrupts =
<70>;
status =
"disabled";
};
要在这个节点上挂东西,可以直接在am33xx.dtsi中挂,可以写成这样:
i2c0: i2c@44e0b000
{
compatible =
"ti,omap4-i2c";
#address-cells =
<1>;
#size-cells =
<0>;
ti,hwmods =
"i2c1";
reg = <0x44e0b000
0x1000>;
interrupts =
<70>;
status =
"okay";
tlv320aic3x: tlv320aic3x@18 {
compatible = "ti,tlv320aic3x";
reg = <0x18>;
status = "okay";
AVDD-supply = <&ldo4_reg>;
IOVDD-supply = <&ldo4_reg>;
DRVDD-supply = <&ldo4_reg>;
DVDD-supply = <&ldo4_reg>;
};
};
其中compatible字串“ti,tlv320aic3x”是在Documentation/devicetree/bindings里面全文搜索“tlv320aic”获得的,“tlv320aic3x:
tlv320aic3x@18”遵循的是“标识符:名称@地址”的格式,前面的“i2c0:
i2c@44e0b000”也是这个格式。这里的标识符可以在包含这个文件的文件或这个文件的其他位置引用,因此,可以使用arch/arm/boot/dts/am335x-boneblack.dts包含arch/arm/boot/dts/am33xx.dtsi,然后在am335x-boneblack.dts里写:
&i2c0 {
status = "okay";
tlv320aic3x: tlv320aic3x@18 {
compatible = "ti,tlv320aic3x";
reg = <0x18>;
status = "okay";
AVDD-supply = <&ldo4_reg>;
IOVDD-supply = <&ldo4_reg>;
DRVDD-supply = <&ldo4_reg>;
DVDD-supply = <&ldo4_reg>;
};
};
&i2c0表示引用了i2c0这个标识符,然后把括号里的内容挂载到标识符下,如果属性的名字相同,例如status出现两次,前面是“disabled”后面是“okay”,以后面的为准,引用标识符的次数不受限制。
也许一开始会觉得FDT的工作过程很神秘,但你只要用compatible的字串去全文搜索一下C文件,然后仔细阅读一下,就会发现很简单,没过几分钟你就可以自定义FDT节点的属性了。反倒是这些操作过程我没找到什么文档说,比较头痛,所以我把这些写出来,希望能给大家帮助。
下面说说initrd,initrd的用处是给内核一个初始的基本文件系统,用来加载内核模块之类的东西。很多人觉得嵌入式系统不需要initrd,也可以把initrd作为最终的根文件系统。我用initrd是用来校验真正的根文件系统,因为在嵌入式设备上,无法预测用户到底什么时候关机,可能会造成文件系统问题。
initrd可以用buildroot,像制作正常文件系统一样做,最后把根下的linuxrc换成一个例如下面这样的文件:
#!/bin/sh
/bin/echo Now Check SD Card
/sbin/fsck.ext4 /dev/mmcblk0p5
虽然Documentation/initrd.txt里面说,内核会执行initrd里面的/sbin/init,但在我用的linux-3.8.13上,init/do_mounts_initrd.c里面,执行的是/linuxrc,不知道是不是文档没有更新过来。具体的调用顺序是,kernel_init(init/main.c)
> kernel_init_freeable(init/main.c)
> prepare_namespace(init/do_mounts.c)
> initrd_load(init/do_mounts_initrd.c) > handle_initrd
(init/do_mounts_initrd.c)。
在使用initrd的时候有几点需要注意的:
不建议在initrd上挂载别的东西,会引起未知的问题,貌似看到个文章说这个,找不到了
因为上面的这条,而且在initrd的时候,内核还没有挂载devtmpfs,因此建议使用静态设备节点,以AM335x为例(内核参数console=/dev/ttyO0,115200n8),必须的节点有:
/dev/null
/dev/console
/dev/ttyO0
这些节点可以用fakeroot之后mknod在buildroot的output/target/dev里创建,除了/dev/console,buildroot会自己创建,其他也可以写到buildroot的system/device_table.txt里面让buildroot自动创建:
#
/dev/null
c 666 0 0
1 3
-
-
-
/dev/ttyO0 c 600
0 0 250
0
-
-
-
如果你用的是Atmel的处理器,上面的ttyO0可能是ttyS0,如果是三星的,可能是ttySAC0,而且major和minor也会不一样,请自行解决。如果你像我一样要检验SD卡,那就还必须加上SD卡的分区对应的节点。
/linuxrc可以是个程序也可以是个脚本,脚本的话,命令写绝对路径,而且记得把/linuxrc的mode改为755
使用initrd只需要用u-boot把buildroot制作的文件系统映像拷贝到内存里,然后传递initrd=[地址],[容量]这样的参数给内核,例如initrd=0x81300000,8M,最终的root参数可以不变,例如root=/dev/mmcblk0p5,这表示最终的root是SD卡上扩展分区中的第一个逻辑分区。给两个内核参数的例子:
console=ttyO0,115200n8 root=/dev/mmcblk0p5 initrd=0x81300000,8M vram=16M
consoleblank=0
console=ttyO0,115200n8 initrd=0x81300000,8M root=/dev/nfs rw
nfsroot=192.168.5.226:/home/c/nfsroot
ip=192.168.5.222:192.168.5.226:192.168.5.1:255.255.255.0:core335x:eth0:off
vram=16M consoleblank=0
第一个不解释了,第二个表示使用initrd,同时使用nfsroot。
最后啰嗦一句,使用initrd需要在内核配置里打开支持,这个网上的资料太多了,我就不说在哪里了。
⑵ 编译linux内核设备树文件使用什么命令
Linux源码的arch/powerpc/boot/dts/目录下存放了很多dts文件,可以作为参考文件。另外dtc编译器在内核回源码2.6.25版本之后已经答被包含进去。在2.6.26版本之后,生成blob的简单规则已经加入makefile,如下命令:
$ make ARCH=powerpc canyonlands.dtb
也可以根据自己的硬件修改好dts文件后,用下面类似命令生成dtb文件。
$ dtc -f -I dts -O dtb -R 8 -S 0x3000 test.dts > mpc836x_mds.dtb
$ mkimage -A ppc -O Linux -T flat_dt -C none -a 0x300000 -e 0 -d mpc836x_mds.dtb mpc836x_mds.dtu
⑶ Linux触摸屏驱动中什么时候会调用suspend这个函数
android系统摁下电源键后会让系统进入休眠以达到节电的目的。内核驱动中和休眠相关的就是suspend和resume函数。
suspend函数用于休眠,resume函数用于唤醒。下面分析驱动中的这两个函数是如何被调用到的。
驱动部分:
首先需要分析驱动的注册过程,较新的内核都是采用DTS方式来取代在内核中直接定义platform_device数据结构的注册方式,本文是基于DTS机制的内核来分析。
proct对应的dts文件在编译时被编译为dtb文件,uboot在启动时候会将其地址传给内核,内核在启动过程中会去解析,具体解析是在start_kernel()->setup_arch() --> unflatten_device_tree()中具体分析可以参考网上,解析的最终结果会存放在allnodes地址处,这个allnodes随后在machine的init函数
中被使用,init函数中会根据allnodes中的节点数据组合成platform_device数据结构,然后将其注册到platform总线上,下面简要分析一下并重点关注这些初始化过程中和
pm相关的初始化。
我参与的项目中machine的init函数就是via_init_machine函数,在这个函数中就是调用了of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL)这个函数来解析allnodes的。of_platform_populate是系统提供的接口。下面分析这个接口的实现:
[html] view plain
int of_platform_populate(struct device_node *root,
const struct of_device_id *matches,
const struct of_dev_auxdata *lookup,
struct device *parent)
{
struct device_node *child;
int rc = 0;
root = root ? of_node_get(root) : of_find_node_by_path("/");
if (!root)
return -EINVAL;
for_each_child_of_node(root, child) {
rc = of_platform_bus_create(child, matches, lookup, parent, true);
if (rc)
break;
}
of_node_put(root);
return rc;
}
root最后就是取到的根节点,然后其作为参数传递给of_platform_bus_create,of_platform_device_create_pdata的实现如下:
[html] view plain
static int of_platform_bus_create(struct device_node *bus,
const struct of_device_id *matches,
const struct of_dev_auxdata *lookup,
struct device *parent, bool strict)
{
const struct of_dev_auxdata *auxdata;
struct device_node *child;
struct platform_device *dev;
const char *bus_id = NULL;
void *platform_data = NULL;
int rc = 0;
/* Make sure it has a compatible property */
if (strict && (!of_get_property(bus, "compatible", NULL))) {
pr_debug("%s() - skipping %s, no compatible prop\n",
__func__, bus->full_name);
return 0;
}
auxdata = of_dev_lookup(lookup, bus);
if (auxdata) {
bus_id = auxdata->name;
platform_data = auxdata->platform_data;
}
if (of_device_is_compatible(bus, "arm,primecell")) {
of_amba_device_create(bus, bus_id, platform_data, parent);
return 0;
}
dev = of_platform_device_create_pdata(bus, bus_id, platform_data, parent);
if (!dev || !of_match_node(matches, bus))
return 0;
for_each_child_of_node(bus, child) {
pr_debug(" create child: %s\n", child->full_name);
rc = of_platform_bus_create(child, matches, lookup, &dev->dev, strict);
if (rc) {
of_node_put(child);
break;
}
}
return rc;
}
根据传入参数,我们这里直接分析of_platform_device_create_padate函数,如下:
[html] view plain
struct platform_device *of_platform_device_create_pdata(
struct device_node *np,
const char *bus_id,
void *platform_data,
struct device *parent)
{
struct platform_device *dev;
if (!of_device_is_available(np))
return NULL;
dev = of_device_alloc(np, bus_id, parent);
if (!dev)
return NULL;
#if defined(CONFIG_MICROBLAZE)
dev->archdata.dma_mask = 0xffffffffUL;
#endif
dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
dev->dev.bus = &platform_bus_type;
dev->dev.platform_data = platform_data;
/* We do not fill the DMA ops for platform devices by default.
* This is currently the responsibility of the platform code
* to do such, possibly using a device notifier
*/
if (of_device_add(dev) != 0) {
platform_device_put(dev);
return NULL;
}
return dev;
}
of_platform_device_create_padate->of_device_alloc->platform_device_alloc
便在platform_device_alloc函数中进行进行alloc和初始化了,实现如下:
[html] view plain
struct platform_device *platform_device_alloc(const char *name, int id)
{
struct platform_object *pa;
pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
if (pa) {
strcpy(pa->name, name);
pa->pdev.name = pa->name;
pa->pdev.id = id;
device_initialize(&pa->pdev.dev);
pa->pdev.dev.release = platform_device_release;
arch_setup_pdev_archdata(&pa->pdev);
}
return pa ? &pa->pdev : NULL;
}
可以看到有个device_initialize,这里面对pdev.dev做一些列的初始化,其中有一个函数就是device_pm_init,这个函数就是我们一直关心的device相关的pm函数,具体实现如下:
[html] view plain
void device_pm_init(struct device *dev)
{
dev->power.is_prepared = false;
dev->power.is_suspended = false;
init_completion(&dev->power.completion);
complete_all(&dev->power.completion);
dev->power.wakeup = NULL;
spin_lock_init(&dev->power.lock);
pm_runtime_init(dev);
INIT_LIST_HEAD(&dev->power.entry);
dev->power.power_state = PMSG_INVALID;
}
可以看见它对device和功耗相关的数据做了一些初始化,我们这里先重点关注下dev->power.entry,初始化一个链表头,所以他/它很有可能会在后面加到某个链表里面去,而那个链表应该是用来保存所有的device用的。系统中所有的platform_device都是通过这种方式注册到系统中的,那么应该所有的platform_device都会初始化一个dev->power.entry,如果到时候把所有的dev->power.entry都添加到某个链表上去,那么系统到时候查询的时候只要找到这个list head就可以找到所有的platform_device了。嗯,不过这是我们的猜测。我们接下去分析来验证下。
platform_device通过alloc之后已经初始化好了,那么接下去就可以添加到系统中了,所以我们再回头看of_platform_device_create_pdata的实现。
函数在of_device_alloc之后把dev->dev.bus赋值给了platform_bus_type,接着就调用了of_device_add函数,在of_device_add函数中最后通过device_add添加到了bus上,但是device_add中有个函数需要我们关系,就是device_pm_add(dev),实现如下:
[html] view plain
void device_pm_add(struct device *dev)
{
pr_debug("PM: Adding info for %s:%s\n",
dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
mutex_lock(&dpm_list_mtx);
if (dev->parent && dev->parent->power.is_prepared)
dev_warn(dev, "parent %s should not be sleeping\n",
dev_name(dev->parent));
list_add_tail(&dev->power.entry, &dpm_list);
dev_pm_qos_constraints_init(dev);
mutex_unlock(&dpm_list_mtx);
}
可以看到这里list_add_tail(&dev->power.entry, &dpm_list);这就验证了我们之前的猜测。所有注册到系统中的设备,最终都是会添加到dpm_list这条链表上。
那么系统在休眠的时候是如何通过dmp_list这表链表来suspend设备的呢?接下去就是我们要分析的电源管理部分内容。
系统电源部分:
电源管理相关文件在kernel/power目录下,前面已经分析到。系统中注册的设备都是会添加到dmp_list这条链表上的。那么睡眠的时候系统应该是会查找dmp_list这条链表,
然后通过这条链表依次去查到对应的driver,然后调用driver中的suspend方法。下面我们来验证。
2.在suspend会轮询bus下的driver,然后一次调用到driver->pm->suspend方法,然后进入休眠。
3.state_store->pm_suspend->enter_state->suspend_devices_and_enter->dpm_suspend_start->dpm_suspend->device_suspend->__device_suspend->pm_op->(ops->suspend)
⑷ ov5693可以用什么代替
ov5693可以用OV5640代替,根据OV5693的设置,设置了OV5640的选项。此外由于需要修余晌磨改extlinux.config中的启动dtb文件,因此根据make文件添加谨宴boot options选竖斗项。
⑸ 斐讯n1开机卡在android
GXL:BL1:9ac50e:bb16dc;FEAT:BDFC31BC:0;POC:3;RCY:0;EMMC:0;READ:0;0.0;0.0;CHK:0;
TE: 257051
BL2 Built : 11:58:42, May 27 2017.
gxl gc3c9a84 - xiaobo.gu@droid05
set vdd cpu_a to 1120 mv
set vdd cpu_b to 1050 mv
set vddee to 1000 mv
Board ID = 4
CPU clk: 1200MHz
DQS-corr enabled
DDR scramble enabled
DDR3 chl: Rank0+1 [url=home.php?mod=space&uid=162986]@[/url] 912MHz - PASS
Rank0: 1024MB(auto)-2T-13
Rank1: 1024MB(auto)-2T-13
DataBus test pass!
AddrBus test pass!
-s
Load fip header from eMMC, src: 0x0000c200, des: 0x01400000, size: 0x00004000
aml log : R2048 check pass!
New fip structure!
Load bl30 from eMMC, src: 0x00010200, des: 0x01700000, size: 0x0000d600
aml log : R2048 check pass!
Load bl31 from eMMC, src: 0x00020200, des: 0x01700000, size: 0x0002c600
aml log : R2048 check pass!
Load bl33 from eMMC, src: 0x00050200, des: 0x01700000, size: 0x00053400
aml log : R2048 check pass!
NOTICE: BL3-1: v1.0(release):a625749
NOTICE: BL3-1: Built : 11:25:15, Aug 25 2017
[BL31]: GXL CPU setup!
NOTICE: BL31: BL33 decompress pass
mpu_config_enable:ok
[Image: gxl_v1.1.3243-377db0f 2017-09-07 11:28:58 qiufang.dai@droid07]
OPS=0x04
8d 85 8 c5 d3 cb 99 9e 8c aa b0 61 [0.845055 Inits done]
secure task start!
high task start!
low task start!
ERROR: Error initializing runtime service opteed_fast
U-Boot 2015.01-00010-gfe36fb9 (Mar 02 2018 - 19:00:28)
DRAM: 2 GiB
Relocation Offset is: 76ed9000
register usb cfg[0][1] = 0000000077f5d330
[CANVAS]canvas init
vpu: error: vpu: check dts: FDT_ERR_BADMAGIC, load default parameters
vpu: clk_level = 7
vpu: set clk: 666667000Hz, readback: 666660000Hz(0x300)
vpu: vpu_clk_gate_init_off
vpp: vpp_init
MMC: aml_priv->desc_buf = 0x0000000073ed9640
aml_priv->desc_buf = 0x0000000073edb960
SDIO Port B: 0, SDIO Port C: 1
emmc/sd response timeout, cmd8, status=0x1ff2800
emmc/sd response timeout, cmd55, status=0x1ff2800
init_part() 293: PART_TYPE_AML
[mmc_init] mmc init success
dtb magic 71b104da
aml log : R2048 check pass!
Amlogic multi-dtb tool
Multi dtb detected
Multi dtb tool version: v2 .
Support 2 dtbs.
aml_dt soc: gxl platform: p230 variant: 2g
dtb 0 soc: gxl plat: p230 vari: 1g
dtb 1 soc: gxl plat: p230 vari: 2g
Find match dtb: 1
start dts,buffer=0000000073ede1b0,dt_addr=0000000073ee91b0
Amlogic multi-dtb tool
Multi dtb detected
Multi dtb tool version: v2 .
Support 2 dtbs.
aml_dt soc: gxl platform: p230 variant: 2g
dtb 0 soc: gxl plat: p230 vari: 1g
dtb 1 soc: gxl plat: p230 vari: 2g
Find match dtb: 1
parts: 10
00: logo 0000000002000000 1
01: recovery 0000000002000000 1
02: rsv 0000000000800000 1
03: tee 0000000000800000 1
04: crypt 0000000002000000 1
05: misc 0000000002000000 1
06: boot 0000000002000000 1
07: system 0000000050000000 1
08: cache 0000000020000000 2
09: data ffffffffffffffff 4
init_part() 293: PART_TYPE_AML
eMMC/TSD partition table have been checked OK!
check pattern success
mmc env offset: 0x27400000
In: serial
Out: serial
Err: serial
reboot_mode=cold_boot
hpd_state=1
[1080p60hz] is invalid for cvbs.
set hdmitx VIC = 16
config HPLL = 2970000
HPLL: 0xc000027b
config HPLL done
j = 4 vid_clk_div = 1
hdmitx: set enc for VIC: 16
HDMITX-DWC addr=0x10004006 rd_data=0x40
Error: HDMITX-DWC exp_data=0xff mask=0x9f
rx version is 2.0 div=10
hdmtix: set audio
hdmitx phy setting done
[store]To run cmd[emmc dtb_read 0x1000000 0x40000]
_verify_dtb_checksum()-917: calc 96094b61, store 96094b61
_verify_dtb_checksum()-917: calc 96094b61, store 96094b61
dtb_read()-1039: total valid 2
dtb_read()-1106: do nothing
aml log : R2048 check pass!
Amlogic multi-dtb tool
Multi dtb detected
Multi dtb tool version: v2 .
Support 2 dtbs.
aml_dt soc: gxl platform: p230 variant: 2g
dtb 0 soc: gxl plat: p230 vari: 1g
dtb 1 soc: gxl plat: p230 vari: 2g
Find match dtb: 1
vpp: vpp_pq_load pq val error !!!
Net: Phy 0 not found
dwmac.c9410000amlkey_init() enter!
[EFUSE_MSG]keynum is 4
[BL31]: tee size: 0
Start read misc partition datas!
info->attemp_times = 0
info->active_slot = 0
info->slot_info[0].bootable = 1
info->slot_info[0].online = 1
info->slot_info[1].bootable = 0
info->slot_info[1].online = 0
info->attemp_times = 0
attemp_times = 0
active slot = 0
wipe_data=successful
wipe_cache=successful
upgrade_step=2
[OSD]load fb addr from dts
[OSD]fb_addr for logo: 0x7f851000
[OSD]load fb addr from dts
[OSD]fb_addr for logo: 0x7f851000
[CANVAS]addr=0x7f851000 width=3840, height=2160
amlkey_init() enter!
amlkey_init() 71: already init!
[EFUSE_MSG]keynum is 4
[BL31]: tee size: 0
[BL31]: tee size: 0
[BL31]: tee size: 0
[BL31]: tee size: 0
[BL31]: tee size: 0
[KM]Error:f[key_manage_query_size]L507:key[deviceid] not programed yet
gpio: pin GPIOAO_2 (gpio 102) value is 1
InUsbBurn
noSof
Hit Enter or space or Ctrl+C key to stop autoboot -- : 0
[imgread]szTimeStamp[2018030720035817]
[imgread]secureKernelImgSz=0xd88800
aml log : R-2048 check pass!
aml log : R2048 check pass!
aml log : R2048 check pass!
ee_gate_off ...
mmc env offset: 0x27400000
Writing to MMC(1)... done
## Booting Android Image at 0x01080000 ...
reloc_addr =73f5e400
done
Kernel command line: buildvariant=user
load dtb from 0x1000000 ......
Amlogic multi-dtb tool
Single dtb detected
Uncompressing Kernel Image ... OK
kernel loaded at 0x01080000, end = 0x021d4598
Loading Ramdisk to 73894000, end 73ec7000 ... OK
Loading Device Tree to 000000001fff2000, end 000000001ffff6b8 ... OK
fdt_instaboot: no instaboot image
Starting kernel ...
uboot time: 3883528 us
[ 0.000000@0] Initializing cgroup subsys cpu
[ 0.000000@0] Initializing cgroup subsys cpuacct
[ 0.000000@0] Linux version 3.14.29-00007-gff93835 (jenkins@slave2) (gcc version 4.9.3 (Ubuntu/Linaro 4.9.3-13ubuntu2) ) #1 SMP PREEMPT Wed Mar 7 19:32:34 CST 2018
[ 0.000000@0] CPU: AArch64 Processor [410fd034] revision 4
[ 0.000000@0] no prop version_code
[ 0.000000@0] bootconsole [earlycon0] enabled
[ 0.000000@0] Reserved memory: incorrect alignment of CMA region
[ 0.000000@0] [amvecm] pq string error !!!
[ 0.187655@0] genirq: Setting trigger mode 8 for irq 241 failed (gic_set_type+0x0/0xbc)
[ 0.190157@0] genirq: Setting trigger mode 8 for irq 242 failed (gic_set_type+0x0/0xbc)
[ 0.198344@0] genirq: Setting trigger mode 8 for irq 241 failed (gic_set_type+0x0/0xbc)
[ 0.206249@0] genirq: Setting trigger mode 8 for irq 242 failed (gic_set_type+0x0/0xbc)
domain-0 init dvfs: 4
[ 0.228385@0] tv_vout: chrdev devno 266338304 for disp
[ 0.242559@0] 1507 node need 400ms
[ 0.927350@0] Initramfs unpacking failed: junk in compressed archive
[ 1.020166@1] mtdoops: mtd device (mtddev=name/number) must be supplied
[ 1.150815@1] amlogic-new-usb3 d0078080.usb3phy: This phy has no usb port
[ 1.157031@1] ATVR driver - init called!
[ 1.166026@0] get_storage_dev return 1
[ 1.305368@1] DI-di_probe: get flag_cma error.
[ 1.307366@1] PPMGRDRV: err: ppmgr_driver_probe called
efuse_pw_en: 0x7
WARNING! efuse bits is disabled
Enable A53 JTAG to AO
[ 1.338469@1] cectx aocec: no hdmirx reg resource
[ 1.338498@1] cectx aocec: no hhi reg resource
[ 1.557834@1] aml_snd_m8_card aml_m8_snd.47: ASoC: no source widget found for LOUTL
[ 1.559838@1] aml_snd_m8_card aml_m8_snd.47: ASoC: Failed to add route LOUTL -> direct -> Ext Spk
[ 1.568717@1] aml_snd_m8_card aml_m8_snd.47: ASoC: no source widget found for LOUTR
[ 1.576247@1] aml_snd_m8_card aml_m8_snd.47: ASoC: Failed to add route LOUTR -> direct -> Ext Spk
相关资源:adb工具+USB调试驱动.zip_usb调试驱动-其它工具类资源-CSDN文库
点击阅读全文
打开CSDN,阅读体验更佳
参与评论 请先 登录 后发表或查看评论
智能家居-斐讯N1安装篇_ITPaint的博客
2、 开启ADB调试 N1 用 HDMI 连显示器,正常开机后用鼠标点击斐讯 N1 官方固件的那个版本号 4 次,出现 【ADB调试开启】的字样即可,如下图 3、选择2,N1降级 4、输入 .\fastboot.exe reboot 重启设备 二、刷入官改 1、安装USB烧...
斐讯N1救砖指南!值得收藏_ITPaint的博客_n1救砖
一、准备工作 1、拆除底部四个螺,在胶垫下面 2、下载刷机工具USB_Burning_Tool 3、 二、刷机流程 1、打开刷机工具导入N1官改固件包,等待加载完成 2、去除 擦除flash 擦除bootloader 两个勾选。 3、连接USB双公线,短接如下图两个...
斐讯n1卡在android,斐讯N1,看本地高清电影请务必刷coreelec
斐讯N1,看本地高清电影请务必刷coreelec2019-10-11 18:38:5149点赞461收藏94评论kodi很多人都知道也在使用,但是很多朋友并不清楚coreelec下的kodi,和安卓盒子上的kodi到底有什么区别。以至于很多买了n1的朋友,觉得安卓上面的kodi也一般般。简单地说:coreelec是一个linux系统,约等于你买了一台电脑,安装了操作系统,上面只运行kodi,kod...
继续访问
斐讯N1变砖终于有救了,使用ddbr恢复官改系统救砖方法
斐讯 N1 使用 ddbr 恢复官改系统 ddbr 官改镜像下载: 链接: https://pan..com/s/1IRPeEeyrdcGyAaaMDfo5kw 提取码: c388 首先按照步骤制作一个能够从 U 盘正常启动的 armbian 系统,进入后系统后执行指令 ddbr 首先输入 b(backup),在进度条开始后即可 Ctrl+C 取消。这样可以获取到 ddbr 备份的文件的名称(不同版本的 Armbian 备份出来的包名有不同) 打开 winscp 用 sftp 加你的 ssh
继续访问
斐讯N1 – 完美刷机Armbian教程_Jeans Liu的博客
为了让斐讯N1的各个硬件可以被armbian正常调度,所以需要给斐讯N1适配一套dtb文件。 dtb文件需要随着内核编译,所以不同armbian内核版本必须使用配套的dtb文件。 目前斐讯N1的dtb文件已经被armbian收录到官方源码库里,但是使用的时候linux负载会显...
N1刷Android TV,贫民种草指北 篇二:N1盒子:不谈刷机,只谈使用!_眠子子 ...
最后,不推荐连鼠标,蓝牙鼠标成本高。有线麻烦;手机app控制,电视盒子系统听说可以下载斐讯遥控控制(未测试成功),coreelec可以通过skbu for kodi控制(实测ok,使用也还ok),手机和N1处于同一局域网,打开app自动连接。操作比较全如下图。
HP服务器放电后进不了系统,遇到奇怪的问题,armbian系统 reboot之后 卡在开机界面 进不去系统 断电重启正常...
GXL:BL1:9ac50e:bb16dc;FEAT:BDFC31BC:0;POC:3;RCY:0;EMMC:0;READ:0;0.0;0.0;CHK:0;TE: 483967BL2 Built : 11:58:42, May 27 2017.gxl gc3c9a84 - xiaobo.gu@droid05set vdd cpu_a to 1120 mvset vdd cpu_b to 1050 ...
继续访问
arm linux开机第一屏,小白求助大神T1刷机提示成功,但开机卡在斐讯白屏界面。...
本帖最后由 taczgk 于 2020-5-28 10:42 编辑请大神帮帮忙,我的斐讯T1盒子原来用的YYF系统,刷了W大3.0和3.5系统都是开机卡在斐讯界面,刷YYF系统就卡在安卓机器人界面,打勾救砖模式都提示错误:[0x00101004]擦除bootloader/USB限流/设备识别/命令结果返回错误,不打勾的话,刷机提示刷机成功,电脑也可以识别,刷完就卡在开机界面,无法联网无法ADB,求...
继续访问
斐讯 N1 降级、刷机及 Armbian 安装 [2019.7.23]
最前 最近捡垃圾不断,之前购买了斐讯遗产 K2P(真香,最近刷了 OpenWrt)、T1(刷了电视盒子)和蜗牛星际(刷了黑群晖),最近又捡了台斐讯 N1,主要用于做一些简单的爬虫和 Adguard Home 服务。其实原先有过一台树莓派 3B,但是 emmmm 吃灰了一年,然后二手卖了。虽然近期树莓派 4 发布了,性能有较大提升,但由于价格的原因,还是 N1 香。刷机过程由于已有的几篇文章有些内容...
继续访问
手机开机卡在android画面,手机一直停在开机画面怎么解决【图文】
手机我相信人们不会不知道,这几年手机的发展速度非常地快,不知道大家平时使用手机的过程之中出现一些故障没有,相信大多数的用户是碰到过的,但是我相信大多数的手机用户是不会解决碰到的故障的。大家平时遇到最对的故障是什么呢?手机开机后一直停在开机界面这种情况相信大家都经历过吧!今天小编就教教大家如何解决这种故障。手机开机后一直停在开机界面怎么办top1:长按电源键12S左右重启手机手机在执行系统升级,刷机...
继续访问
最新发布 PHICOMM(斐讯)N1盒子 - recovery模式救砖卡登录页LOGO卡1%卡4%卡26%
PHICOMM(斐讯)N1盒子recovery模式救砖卡登录页LOGO卡1%卡4%卡26% 卡1%:需要先刷入T1_1.3T47_mod_by_webpad_v3_20180419_2.img救砖包,再重新刷 卡4%:USB供电不足。使用台式机或USB加5V(如带供电的USB分线器) 卡26%:换不卡的包,如RUSH的包...
继续访问
Initramfs unpacking failed:junk in compressed archive
使用kvm创建自定义镜像后重装云主机启动报错如下: 解决办法: 重做镜像,内存原来的2047MB改成了1024MB,其实也不知道对不对,反正做了好几遍最后一次好了。
继续访问
机顶盒ttl无法输入_请教大神,机顶盒接TTL进不了uboot模式
本帖最后由 cgl4134 于 2019-12-24 00:13 编辑更新一下... 自己刚开始折腾机顶盒,好多地方都搞不太懂.. 正在学习中..这个uboot 跟刷机包有关系,换了个潜龙的线刷包,就可以进uboot了,,不过现在uboot好像让我搞坏了, uboot模式下, usb_update system 会失败..欢迎其他小白交流学习----------------------------...
继续访问
关于解决 inittramfs unpacking failed:Decoding failed 报错
解决办法 vi /etc/initramfs-tools/initramfs.conf 更改COMPRESS=lz4以COMPRESS=gzip 保存更改 sudo update-initramfs -u
继续访问
armbian 斐讯n1_记录一下斐讯N1盒子刷Armbian的各种坑
最近搞了一个斐讯N1盒子,准备拿来刷Armbian,也就是linux。armbian使用了AArch64架构,也就是说,是armv8,安装nodejs时注意下载armv8的版本。斐讯N1盒子自带的系统是安卓系统,版本是V2.2,刷机主要参考的教程在这里:https://www.uselys.com/archives/85.html第一步,需要将盒子的系统版本降级到V2.19,方便后面刷入系统。首先...
继续访问
HDMI相关
HDMI相关基础4.4 与 9.0 差异AVMUTE 的使用hdcp异常检查 HDCP 交互:检查 ksv(视频加密密钥):HDCP 的内部检测:显示模式分析查看是否已连接电视机查看当前显示模式更改当前显示分辨率查看 EDID 信息查看显示设备的 EDID 信息查看电视机支持的最佳分辨率Android 系统对 HDMI 输出制式的设置1. 查看当前输出制式的节点命令:2. 输出制式在 Framework 层的代码位置:主要接口说明最优分辨率、颜色空间、色深的配置使用 HDMI Bist 模式验证 HDMI
继续访问
斐讯n1刷鸿蒙系统,【总结】在N1上面成功刷入armbian并启动的步骤
本帖最后由 ruojiner 于 2018-6-25 00:08 编辑用的是Armbian_5.44_S9xxx_Debian_stretch_3.14.29_server_20180601.img.xz这个镜像。TIM图片20180624230645.png (48.41 KB, 下载次数: 398)2018-6-24 23:22 上传TIM图片20180624230657.png (18.02...
继续访问
Linux学习笔记—驱动篇(一)
注:以下驱动只是均以GEC6818开发板为例进行撰写 要想写驱动我们得先了解什么是u-boot 一、什么是u-boot ? Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。U-Boot从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是...
继续访问
linux initramfs启动原理
当linux选择支持initramfs方式启动,并且在initramfs source file中选择了要打包的rootfs路径以后,则会尝试以initramfs方式启动。initramfs方式会对rootfs进行压缩,和linux kernel打包在同一个镜像文件中。然后系统加载的时候uboot会把整个镜像文件都加载到内存中。以该种方式加载的rootfs,是没办法修改flash中rootfs的数...
继续访问
n1盒子救砖_斐讯N1盒子刷机救砖教程
https://codess.cc/archives/108.html自从斐讯0元购的车翻了之后,咸鱼上的斐讯产品也非常多,从路由器到空气净化器再到矿机。前几天我在撕逼鱼收了两个斐讯N1盒子,这东西原来是挖矿的,矿场坍塌倒闭之后,矿老板们大量甩卖矿机,有的甚至是全新未拆...大概70块左右包邮的价格,配置一点也不低,比市面上绝大多数的电视盒子的配置都高。最重要的是,它能解码4K! 解码真4K! 单...
继续访问
Kernel启动时间优化
1、问题描述 Linux的内核用的是3.14版本。UI层跑的是类似Qt的系统。目前Kernel从启动到init进程大概需要3.5秒时间,另外到加载U盘需要7.5秒左右时间。 由于Bootloader执行过程很快,所以不是本次需要优化的目标。 系统原始的Kernel启动部分Log如下: 15:29:01.552: [ 0.000000]Linux version 3.14.19 (g
继续访问
热门推荐 N1救砖总结帖
一、正常降级刷固件的教程在恩山论坛蛮多的就不多赘述了 正常刷机教程-来自恩山 二、变砖原因: 1.刷错T1等非N1的固件 2.刷机过程中由于各种原因断开了USB连接线(我就是手欠用的USB-Hub连接没有固定好) 三、变砖现象 四、救砖方法 ①有用焊接使用TTL直刷的,这种成本高,要求也高,还麻烦,暂不考虑,有兴趣去恩山看下帖子就好 ②我抄作业学到的: 需要的软件:USB_Burning_To...
继续访问
斐讯n1开机卡在android
斐讯n1卡在android
⑹ iMX6ull SD卡系统和Nandflash系统
系统源码和编译方法,[参见连接] ( https://community.nxp.com/docs/DOC-334274 )其中dtb文件针对LCD或HDMI修改的内容对iSpeaker无影响,不用去修改。我们会使用另外的dtb文件。
烧写SD方式也不采用这个文档中的方法,直接在linux命令行下如下操作:
Nandflash使用zImage,dtb文件和SD卡中使用的完全一致。Uboot文件SD中使用的不能用于Nandflash,源码另见。
烧写Nandflash需要用SD卡系统盘启动,SD卡系统中需要宽芹已安装mtd-utils工具。系统启动后能咐桥正慎简毕常看到mtd0~mtd4分区。按照下面步骤操作:
$ flash_erase /dev/mtd0 0 0
$ flash_erase /dev/mtd1 0 0
$ flash_erase /dev/mtd2 0 0
$ kobs-ng init -x u-boot.imx --search_exponent=1 -v
$ flash_erase /dev/mtd3 0 0
$ nandwrite -p /dev/mtd3 zImage
$ nandwrite -p /dev/mtd3 -s 0x7e0000 imx.dtb
$ ubiformat /dev/mtd4 -f ubi.img
其中使用ubi.img文件,在linux主机下制作方法如下:
使用的根文件系统和SD卡中的根文件系统一样,假设SD卡已插入linux主机usb接口,并将第二个分区挂载与/mnt下,首先在linux主机工作目录下建立文本文件ubifs.cfg,内容如下:
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
然后执行如下命令:
$ mkfs.ubifs -x zlib -m 2048 -e 124KiB -c 3965 -r /mnt ubifs.img
$ ubinize -o ubi.img -m 2048 -p 128KiB -s 2048 -O 2048 ubifs.cfg
⑺ dtb是什么文件怎么打开
dtb是可以减少linux内大樱核版本的数量的文件。同一份linux 内核代码可以在多个板卡上运行,每个板卡可以使用自己的dtb文件。
打开方法:
1、点击打开网页浏览器,输入网络网址打开网络首页,然后再搜索窗口输入UltraEdit,然后点击网络一下。
网络-ultraedit
⑻ dtb是什么文件怎么打开
dtb是可以减少linux内核版本的数量的文件。同一份linux 内核代码可以在多个板卡上运行,每个板卡可以使用自己的dtb文件。
1,在linux内核启动过程中会解析dtb文件,根据dtb文件中设备列表进行加注各个外设的驱动模块。
2,PC机在启动时会自动扫描外设,而在嵌入式中,linux内核启动过程中只是解析dtb文件,从而加载对应的模块。
3,编译linux内核时必须选择某外设模块,并且dtb中包括该外橡郑设塌毕的信息。在linux内核启动团如芹过程中才能自动加载该模块。