精华内容
下载资源
问答
  • linux setprop
    2021-08-21 11:24:40

    https://blog.csdn.net/heqiangflytosky/article/details/69432749

    Android  getprop 和  setprop 可以对系统属性进行读取和设置。

    通过串口执行以下 getprop    打印出来的属性让你一目了然

    属性出来了,但是在哪里设置的呢,这里有两个地方:一个是配置文件读取的,一个是系统动态获取的。

    更多相关内容
  • Linux setup命令 Linux setup命令设置公用程序,是一个启动图形设置系统的命令。 setup 命令:用来配置X,打印设置,时区设置,系统服务,网络配置,配置,防火墙配置,验证配置,鼠标配置。 语法setup setup是一个...
  • 关键词:android linux getprop setprop wathcprop  系统:android2.3 android4.0 一、 配置文件 在android系统中,有一些初始化的配置文件,例如: /init.rc /default.prop /system/build.prop 文件...

    关键词:android  linux  getprop  setprop  wathcprop 

    系统:android2.3 android4.0

    一、 配置文件

    在android系统中,有一些初始化的配置文件,例如:

    /init.rc
    /default.prop
    /system/build.prop

    文件里面里面配置了开机设置的系统属性值,这些属性值,可以通过getprop获取,setprop设置,如下图:


    二、getprop stopprop watchprop 使用和它的格式

    1、getprop[key]

    获取指定key的配置值,如果不带参数,只是getprop则是显示系统所有的配置值,输入命令,如下图:

    #getprop


    2、setprop[key] [value] 设置指定key的属性值

    如:setprop

    3、getprop setprop 使用实例

    root@android:/ # getpropdhcp.wlan0.leasetime   //得到的值为3600
    3600
    root@android:/ # setprop dhcp.wlan0.leasetime3000  //设定值为3000
    root@android:/ # getprop
    [dhcp.wlan0.ipaddress]: [192.168.1.113]
    [dhcp.wlan0.leasetime]:[3000]                    //再用getporp查看设定的值
    [dhcp.wlan0.mask]: [255.255.255.0]


    4、watchprops

    监听系统属性的变化,如果期间系统的属性发生变化则把变化的值显示出来

    /system # watchprops
    1307501833 sys.settings_system_version = '37'
    1307501836 sys.settings_system_version ='38'
    1307501862 persist.sys.timezone ='Asia/Hong_Kong'

    三、toolbox子命令

    1、命令实现代码位置

    其实这三个命令都是toolbox的子命令,如果有兴趣的可以看在android源码中看到其对应的源码:

    system/core/toolbox/

    一般而言,我们在串口中输入getprop指令,会出现很多类似键值对的系统变量值,如下图:


    2、java中调用linux的指令

    (1)、在java中如何调用linux的指令,主要通过如下代码实现:

      Process process =Runtime.getRuntime().exec(com);
      InputStreamReader ir = newInputStreamReader(process.getInputStream());
      BufferedReader input = newBufferedReader(ir);
    (2)、getprop和setprop既然都是命令,也用上面的方面尝试得到值

      getprop 用法:getprop [key]

      setprop用法:setprop [key] [value]

      注:实际中是没有中括号的。

    所以用法同上:

      Process process =Runtime.getRuntime().exec("getprop ro.runtime.firstboot");
      InputStreamReader ir = newInputStreamReader(process.getInputStream());
      BufferedReader input = newBufferedReader(ir);
     



    展开全文
  • linux系统之驱动与FDT

    2020-10-29 08:50:27
    随着linux 内核版本的逐渐提升,在3.10.* 版本之后,linux系统arm架构中对驱动实现方式做了较大调整,驱动中广泛采用FDT的实现方式。因此对于linux系统上的驱动开发来说,了解FDT尤为重要。 FDT对系统软件开发工作...

    转自:https://blog.csdn.net/eleven_xiy/article/details/72835181

    【摘要】

    【分析一】FDT与TAG

    【分析二】boot中对FDT的支持

    【分析三】Uboot下调试FDT

    【分析四】kernel中对FDT的支持

    【分析五】FDT兼容TAG

    【总结】

    【附录】


    【摘要】

    为何要写此文?

    随着linux 内核版本的逐渐提升,在3.10.* 版本之后,linux系统arm架构中对驱动实现方式做了较大调整,驱动中广泛采用FDT的实现方式。因此对于linux系统上的驱动开发来说,了解FDT尤为重要。



    FDT对系统软件开发工作的实际影响?

    1) FDT取代了tag.这一点涉及bootloader和kernel的变动。

    例如:经常用到的uboot里面bootargs、环境变量等相关实现要有所改动。

    2) 驱动中板级信息的获取方式变动。这一点涉及到具体驱动实现,无论flash、usb还是音视频等驱动的实现都要涉及FDT,如果不了解,驱动就无法实现。

    例如:我们要获取一个驱动的中断号或者控制器相关基地址等信息,都要通过FDT。


    什么是FDT?

    FDT:Flattened Device Tree即扁平设备树。linux系统最早引入是在linux2.6*版本的powerpc架构中。早前曾做过powerpc架构的开发,不过当时系统已经对FDT做了很好的支持,驱动开发只是简单的配置了dts文件。当时想写一篇介绍FDT的文章,但一直未能如愿。

    直到arm架构也引入了FDT,写一篇这样的文档显得很有必要,一方面希望记录工作。另一方面也希望为涉及FDT开发的同仁提供一点参考。


    linux为何要引入FDT?

    引入FDT目的很明确–降低代码冗余。

    过去的linux源码,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多代码都是描述板级信息,对于内核来将,都是垃圾。随着arm的不断普及,垃圾代码越来越多,已经到了kernel无法容忍的地步,因此在3.10*之后,linux系统采用了FDT的实现方式,裁剪掉这部分代码冗余。


    【分析一】FDT与TAG

    本节将介绍两种FDT实现方案:FDT取代TAG 和FDT兼容TAG。不过在介绍之前,我们先明确下FDT到底是什么?我们需要做哪些工作?

    1 .首先要实现FDT功能,必须有一个*.dtb文件的输出。

    dtb文件是通过dtc工具生成,dtc(device tree complier)是开源工具,可以理解为dts文件的编译器。一般uboot和kernel代码中都有集成,直接拿来用即可。为了生成dtb ,需要修改makefile (一般可以修改uboot的顶级Makefile或者linux中arch/arm/boot/Makefile)如下:

    $(DTB_OBJS):FORCE
    $(obj)/dts/dtc -I dts -O dtb -i $(obj)/dts -p 1024 -o $(DTB_OBJS) $(obj)/dts/example_plat_version.dts

    观察上述命令:
    1) 首先输出 dtb文件,如DTB_OBJS=example_plat_version.dts.dtb
    dtb文件如何使用?这个文件可以烧录到flash上的任何位置。
    Ps:要想使用fdt兼容tag,则必须把dtb放到uImage后面,这是因为kernel在启动阶段有限制。如果用FDT替代tag则可放到任何位置。
    2) dtc是开源工具,主要功能是解析dts文件,并把解析的结果保存到dtb文件中。
    什么是dts文件? dts文件是设备树的源码。
    举例:example_plat_version.dts
    /include/ "example-plat.dtsi" 
    /{
      mode = "example plat evm Board";
      compatible = "example,**";
      chosen{
        bootargs = "console=ttyS0,115200 mem=100M root=/dev/mtdblock0 init=/linuxrc"; 
      };
      apb@80000000{
        i2c0:i2c@e80030000{
          status= "ok";
          ak4293: codec@12{
            compatible = "example,ak4293";
        reg = <0x12>;
          };
          it66121@4c{
               compatible = "example,it66121";
        reg = <0x44>;
          };
        };
      };
     };
    

    如上是dts文件的片段,这个文件是需要我们正确配置的。
    1) 其中 chosen和apb@80000000可以被称为一个节点--node,而i2c0可以被称为一个子节点—subnode,”/”是唯一的根节点。
    2) 不难发现,chosen中保存的bootargs就是我们uboot下使用的bootargs,以前它被保存在tag中,如今放到了dts文件里。
    3) apb@80030000中保存的是i2c驱动的信息。以前的系统中,这一部分是被定义在arch/arm/plat-xxx和arch/arm/mach-xxx 代码中,如今放到dts文件中。
    至此kernel代码得到精简。
    Ps:dtc是如何解析dts文件的不必详查,如感兴趣可以参考dtc源码。

    【分析二】boot中对FDT的支持

    如果要使用tag,需boot和kernel同时支持,那么用FDT取代TAG也同样如此.

    uboot中对FDT的支持:

    1) uboot代码中已经对fdt有支持,可以通过开启CONFIG_OF_LIBFDT配置,实现FDT支持,如此会省掉一部分工作。例如:fdt调试命令可以直接使用。

    2) 如前所述dtb文件被烧录到flash上。在Uboot引导内核启动之前会将dtb拷贝到内存上,并对dtb的内容进行修改,这一步是为了支持对环境变量的动态修改。

    以下介绍u-boot中如何修改dts文件中定义的内容:重点观察example_plat_version.dts文件里chosen节点中bootargs参数的修改,关键函数fdt_chosen:

    int fdt_chosen(void *fdt, int force)
    {
      int nodeoffset;
      char *str;
      const char *path;
      nodeoffset= fdt_path_offset(fdt, "/chosen");
      if(nodeoffset<0)
      {
        nodeoffset=fdt_add_subnode(fdt,0,"chosen");
        if(nodeoffset<0)
        {
          return nodeoffset;
        }
      }
      str = getenv("bootargs");
      path = fdt_set_prop(fdt,nodeoffset,"bootargs",str,strlen(str)+1);
      return 0;
    }
    上述函数的fdt_path_offset(fdt,”chosen”)获取的是dts文件中的:
      chosen{
        bootargs = "console=ttyS0,115200 mem=100M root=/dev/mtdblock0 init=/linuxrc"; 
      };
    要想修改bootargs则调用fdt_setprop_string;
    Ps:其中fdt_setprop_string等接口是FDT提供的标准接口,boot和kernel源码中都可调用。
    3)将dtb从flash拷贝到dram上。假设拷贝到dram=0x200100的地址,则uboot跳转到kernel时再通过cpu的通用寄存器r2告知系统这个地址,这一点与tag没有分别。至此完成boot下对fdt的支持。

    【分析三】Uboot下调试FDT

    Uboot支持标准的fdt命令修改dtb的内容。

    1 举例:常用调试命令

    1>fdt list :列出系统中所有节点。即上面dts文件中的节点。
    #fdt list
    /{
      #address-cells = <0x1000000>;
      #size-cells = <0x1000000>;
      compatible = "example,**";
      model = "example plat evm Board";
      chosen{
      };
      aliases{
      };
      memory{
      };
      cpus{
      };
      apb@80000000{
      };
    };
    2>列出aliases节点:
    #fdt list /aliases
    aliases{
      serial0 = "/apb@80000000/uart@8005000";
      nand = "/apb@90000000/nand@9001000";
      i2c0 = "/ahb@70000000/i2c@7001000";
    };
    
    3>查看boot分区信息:
    #fdt list nand
    nand@9001000{
      compatible = "example,nand";
      #address-cells = <0x1000000>;
      #size-cells = <0x1000000>;
      partition@0{
      };
      partition@1{
      };
    }; 
    #fdt list nand/partition@0
    partition@0{
      reg = <0x0 0x40000>;
      label = "uboot";
    };
    2 修改dtb举例:
    #fdt list /memory
    memory{
      device_type = "memory";
      reg = <0x2000,0xe007>;
    };
    #fdt set /memory reg <0x200000 0x6e00000>
    #
    #fdt list /memory
    memory{
      device_type = "memory";
      reg = <0x2000,0xe006>;
    };
    1>修改前 reg= <0x2000 0xe007>(字节序反了):实际表示linux 系统内存从0x200000开始大小为0x7e00000
    2>修改后 reg=<0x2000 0xe006>:实际表示linux 系统内存从0x200000开始大小为0x6e00000
    3>以上介绍了boot下显示和修改dtb的命令,其他命令可实际摸索一下,不逐一举例。

    【分析四】kernel中对FDT的支持

    1、 设备树初始化及解析

    分析Linux内核的源码,可以看到其对扁平设备树的解析流程如下:

    (1)首先在内核入口处将从u-boot传递过来的镜像基地址。这一步系统已经有实现好,不需要再开发。

    (2)通过调用early_init_dt_scan()函数来获取内核前期初始化所需的bootargs,cmd_line等系统引导参数。这一步需要二次开发,可以在系统搭建的框架中,加入项目特有的初始参数。

    (3)根据bootargs,cmd_line等系统引导参数进入start_kernel()函数,进行内核的第二阶段初始化。

    (4)调用unflatten_device_tree()函数来解析dtb文件,构建一个由device_node结构连接而成的单项链表,并使用全局变量of_allnodes指针来保存这个链表的头指针。这一步不需要二次开发

    (5)内核调用OF提供的API函数获取of_allnodes链表信息来初始化内核其他子系统、设备等。这一步可能会二次开发。

    如上:步骤1-4主要通过如下函数实现:

    
    void __init setup_arch(char **cmdline_p)
    {   /*实现步骤1-3*/
     mdesc = setup_machine_fdt(__atags_pointer);
     /* 实现步骤4 */
     unflatten_device_tree();
    }
    如上:步骤5主要通过如下函数实现:
    
    int of_platform_populate(struct device_node *root,
       const struct of_device_id *matches,
       const struct of_dev_auxdata *lookup,
       struct device *parent)
    {
     root = root ? of_node_get(root) : of_find_node_by_path("/");
    /* 
    为每个node创建dev.  实现步骤5
    struct platform_device也是在此时创建的 
    */
     for_each_child_of_node(root, child) {
      rc = of_platform_bus_create(child, matches, lookup, parent, true);
      if (rc)
       break;
     }
    }
    在此不对代码进行逐行分析,只对重点函数的功能予以说明,并且对可能需要二次开发的地方重点举例说明。实际工作中,主要集中在第(2)、(5)步。

    2 、重点函数分析.

    1)setup_machine_fdt()

    该函数主要解析设备树中和系统初始启动有关的参数,比如bootargs、Linux使用的物理内存等。实际项目中新添加的uboot参数,也可以在此解析。如下:

    举例:如何通过FDT将uboot参数example_para传入kernel:

    第一步:将example_para作为一个子节点,加入dts的根节点中。 如下example_plat_version.dts文件:
    
    /include/ "example-plat.dtsi" 
    /{
      mode = "example plat evm Board";
      compatible = "example,**";
      chosen{
        bootargs = "console=ttyS0,115200 mem=100M root=/dev/mtdblock0 init=/linuxrc"; 
      };
      apb@80000000{
      };
      /* 新添加的节点*/
      example_para{
        test = <1>;
        ethaddr = "0x00";
      };
     };
    第二步kernel中解析example_para。如下early_init_dt_scan_example_para需要我们自己来实现。
    
    struct machine_desc *__init setup_machine_fdt(unsigned int dt_phys)
    {
      of_scan_fdt_dt(early_init_dt_scan_chosen,boot_command_line);
      of_scan_fdt_dt(early_init_dt_scan_memory,NULL);
      of_scan_fdt_dt(early_init_dt_scan_example_para,NULL);
    }
    第三步解析dtb文件 查找到example_para
    
    int __init early_init_dt_scan_example_para(unsigned node,char *uname,int depth,void *data)
    {
      char *pchar;
      unsigned int leng;
      unsigned int *pvar;
      if(strcmp(uname,"example_para")==0)
      {
        pvar=of_get_flat_dt_prop(node,"ethaddr",&leng);
        pchar=of_get_flat_dt_prop(node,"ethaddr",&leng);
      }
    }
    至此,完成example_para节点添加,大部分初始参数都可以如此实现.以下简单分析一下上述实现过程.
    2) of_scan_flat_dt()实现功能:
    dtc工具在解析dts时,会生成一个描述dts的结构,并放在dtb的头部。
    dtc工具在解析dts时,example_para被保存到dtb的结构块中,因此从结构块的起始偏移地址开始遍历,能够在dtb中找到name为example_para的节点。
    Ps:注意此时dtb被拷贝到了DRAM.
    DTB的头结构如下:
     struct boot_param_header {
        __be32 magic;                //设备树魔数,固定为0xd00dfeed
        __be32 totalsize;            //整个设备树的大小
        __be32 off_dt_struct;        //保存结构块在整个设备树中的偏移
        __be32 off_dt_strings;        //保存的字符串块在设备树中的偏移
        __be32 off_mem_rsvmap;        //保留内存区,该区保留了不能被内核动态分配的内存空间
        __be32 version;            //设备树版本
        __be32 last_comp_version;    //向下兼容版本号
        __be32 boot_cpuid_phys;    //为在多核处理器中用于启动的主cpu的物理id
        __be32 dt_strings_size;    //字符串块大小
        __be32 dt_struct_size;     //结构块大小
    };
    3) early_init_dt_scan_example_para()->of_get_flat_dt_prop()实现功能。
    找到example_para节点后,继续查找property,例如test对应一个属性名为test的属性结构体即struct property。
    struct property {
        char *name;        //属性名
        int length;        //属性值长度
        void *value;        //属性值
        struct property *next; //指向下一个属性
        unsigned long _flags; //标志
        unsigned int unique_id;
    };
    到此,linux系统可以解析出example_para的值。
    如下函数中实现example_para解析:
    Ps: 注意查找方式遵循dtb的生成方式,即dtc对dts的解析规则。
    4)unflatten_device_tree()实现功能。
    实际上 如前所述,系统启动初期已经解析了dtb,不过只是查找少部分启动所需的初始化参数,如chosen(example_para)。系统真正完成对整个dtb文件解析是在该函数中实现。只要合理配置dts文件,该函数就能自动解析出对应node,不需要我么再次开发。unflatten_device_tree()函数解析dtb文件,构建一个由device_node结构连接而成的单项链表,并使用全局变量of_allnodes指针来保存这个链表的头指针。内核调用OF提供的API函数获取of_allnodes链表信息来初始化内核其他子系统、设备。
    设备节点结构体:
    struct device_node {
        const char *name;    //设备name
        const char *type; //设备类型
        phandle phandle;
        const char *full_name; //设备全称,包括父设备名
        struct property *properties; //设备属性链表
        struct property *deadprops; //removed properties
        struct device_node *parent; //指向父节点
        struct device_node *child; //指向子节点
        struct device_node *sibling; //指向兄弟节点
        struct device_node *next; //相同设备类型的下一个节点
        struct device_node *allnext; //next in list of all nodes
        struct proc_dir_entry *pde; //该节点对应的proc
        struct kref kref;
        unsigned long _flags;
        void *data;
    };
    其中,dts文件中每个{ }内的内容对应一个device_node,即上述结构体。 5)of_platform_populate() 该函数能完成驱动设备初始化,其实在此并未实现真正意义上的硬件初始化,只是把驱动所需资源 关联到了platform设备。
    实现过程如下:
    (1) 找到根节点。从of_allnodes开始遍历,找到 name为 “/” 的节点。
    (2) 为根节点的每个子节点创建 struct platform_device *dev;并把子节点对应的device_node结构关联到platform_dev,如下实现:
    of_device_alloc()中 dev->dev.of_node = of_node_get(np); (3) 注册驱动 driver_register()时,通过platform_device找到device_node,从而找到dts中配置的驱动资源。




    【分析五】FDT兼容TAG

    Linux系统在实现 FDT时,除了考虑直接用FDT替代tag外,还考虑的兼容tag的做法。

    考虑FDT兼容tag的情况,不需要对uboot进行修改。即前面所述的分析二和分析三都可以不用实现,不过内核中要做好兼容措施。下面介绍一下实现步骤:

    第一步:打开内核对FDT兼容TAG的配置,make menuconfig如下:

    在这里插入图片描述
    在这里插入图片描述

    第二步 分析内核启动第一阶段,将tag转换成FDT。 分析下面的小段代码arch/arm/boot/compressed/head.s:

    1) 至此 r6中保存的是dtb在dram上的起始地址,r8中保存atag在dram上地址。把dtb 头部的magic信息保存到r1,并校验是否为0xd00dfeed,这一步实际是检查是否有dtb文件。

    2) 只考虑存在dtb的情况,此时会跳转到atag_to_fdt()中去把tag信息转换为fdt信息。

      ldr lr, [r6, #0]
    #ifndef __ARMEB__
      ldr r1, =0xedfe0dd0  @ sig is 0xd00dfeed big endian
    #else
      ldr r1, =0xd00dfeed
    #endif
      cmp lr, r1
      bne dtb_check_done  @ not found
    #ifdef CONFIG_ARM_ATAG_DTB_COMPAT
      /*
       * OK... Let's do some funky business here.
       * If we do have a DTB appended to zImage, and we do have
       * an ATAG list around, we want the later to be translated
       * and folded into the former here.  To be on the safe side,
       * let's temporarily move  the stack away into the malloc
       * area.  No GOT fixup has occurred yet, but none of the
       * code we're about to call uses any global variable.
      */
      add sp, sp, #0x10000
      stmfd sp!, {r0-r3, ip, lr}
      mov r0, r8
      mov r1, r6
      sub r2, sp, r6
      bl atags_to_fdt
      /*
       * If returned value is 1, there is no ATAG at the location
       * pointed by r8.  Try the typical 0x100 offset from start
       * of RAM and hope for the best.
       */
      cmp r0, #1
      sub r0, r4, #TEXT_OFFSET
      bic r0, r0, #1
      add r0, r0, #0x100
      mov r1, r6
      sub r2, sp, r6
      bleq atags_to_fdt
      ldmfd sp!, {r0-r3, ip, lr}
      sub sp, sp, #0x10000
    #endif
      mov r8, r6   @ use the appended device tree
    第三步 观察atags_to_fdt()内核接口,该函数已经实现了将ATAG_CMDLINE转换为FDT的过程,若要实现其他转换,可参照实现:
    /*
     * Convert and fold provided ATAGs into the provided FDT.
     *
     * REturn values:
     *    = 0 -> pretend success
     *    = 1 -> bad ATAG (may retry with another possible ATAG pointer)
     *    < 0 -> error from libfdt
     */
    int atags_to_fdt(void *atag_list, void *fdt, int total_space)
    {
     for_each_tag(atag, atag_list) 
     {
       if (atag->hdr.tag == ATAG_CMDLINE) 
       {
         if (do_extend_cmdline)
            merge_fdt_bootargs(fdt,
             atag->u.cmdline.cmdline);
         else
           setprop_string(fdt, "/chosen", "bootargs",
                atag->u.cmdline.cmdline);
        } 
     }
    }



    【总结】

    系统切换到linux3.10之后,驱动中获取资源的方式、启动中获取初始信息的方式都有所改变,在系统移植或者驱动编写过程要尤为注意。
    也许你会发现,没有配置dts文件,驱动也能正常运行,那很可能是dts中的默认配置已经满足了驱动的要求,而不是不需要配置dts。






    【附录】
    网上找到一些OF提供的常用API函数,驱动开发中可能会用到,一并奉上:
    OF提供的函数主要集中在drivers/of/目录下,有address.c,base.c,device.c,fdt.c,irq.c,platform.c等等

    1. 用来查找在dtb中的根节点
      unsigned long __init of_get_flat_dt_root(void)
    2. 根据deice_node结构的full_name参数,在全局链表of_allnodes中,查找合适的device_node
      struct device_node *of_find_node_by_path(const char *path)
      例如:
      struct device_node *cpus;
      cpus=of_find_node_by_path("/cpus");
    3. 若from=NULL,则在全局链表of_allnodes中根据name查找合适的device_node
      struct device_node *of_find_node_by_name(struct device_node *from,const char *name)
      例如:
      struct device_node *np;
      np = of_find_node_by_name(NULL,“firewire”);
    4. 根据设备类型查找相应的device_node
      struct device_node *of_find_node_by_type(struct device_node *from,const char *type)
      例如:
      struct device_node *tsi_pci;
      tsi_pci= of_find_node_by_type(NULL,“pci”);
    5. 根据compatible字符串查找device_node
      struct device_node *of_find_compatible_node(struct device_node *from,const char *type, const char *compatible)
    6. 根据节点属性的name查找device_node
      struct device_node *of_find_node_with_property(struct device_node *from,const char *prop_name)
    7. 根据phandle查找device_node
      struct device_node *of_find_node_by_phandle(phandle handle)
    8. 根据alias的name获得设备id号
      int of_alias_get_id(struct device_node *np, const char *stem)
    9. device node计数增加/减少
      struct device_node *of_node_get(struct device_node *node)
      void of_node_put(struct device_node *node)
    10. 根据property结构的name参数,在指定的device node中查找合适的property
      struct property *of_find_property(const struct device_node *np,const char *name,int *lenp)
    11. 根据property结构的name参数,返回该属性的属性值
      const void *of_get_property(const struct device_node *np, const char *name,int *lenp)
    12. 根据compat参数与device node的compatible匹配,返回匹配度
      int of_device_is_compatible(const struct device_node *device,const char *compat)
    13. 获得父节点的device node
      struct device_node *of_get_parent(const struct device_node *node)
    14. 将matches数组中of_device_id结构的name和type与device node的compatible和type匹配,返回匹配度最高的of_device_id结构
      const struct of_device_id *of_match_node(const struct of_device_id *matches,const struct device_node *node)
    15. 根据属性名propname,读出属性值中的第index个u32数值给out_value
      int of_property_read_u32_index(const struct device_node *np,const char *propname,u32 index, u32 *out_value)
    16. 根据属性名propname,读出该属性的数组中sz个属性值给out_values
      int of_property_read_u8_array(const struct device_node *np,const char *propname, u8 *out_values, size_t sz)
      int of_property_read_u16_array(const struct device_node *np,const char *propname, u16 *out_values, size_t sz)
      int of_property_read_u32_array(const struct device_node *np,const char *propname, u32 *out_values,size_t sz)
    17. 根据属性名propname,读出该属性的u64属性值
      int of_property_read_u64(const struct device_node *np, const char *propname,u64 *out_value)
    18. 根据属性名propname,读出该属性的字符串属性值
      int of_property_read_string(struct device_node *np, const char *propname,const char **out_string)
    19. 根据属性名propname,读出该字符串属性值数组中的第index个字符串
      int of_property_read_string_index(struct device_node *np, const char *propname,int index, const char **output)
    20. 读取属性名propname中,字符串属性值的个数
      int of_property_count_strings(struct device_node *np, const char *propname)
    21. 读取该设备的第index个irq号
      unsigned int irq_of_parse_and_map(struct device_node *dev, int index)
    22. 读取该设备的第index个irq号,并填充一个irq资源结构体
      int of_irq_to_resource(struct device_node *dev, int index, struct resource *r)
    23. 获取该设备的irq个数
      int of_irq_count(struct device_node *dev)
    24. 获取设备寄存器地址,并填充寄存器资源结构体
      int of_address_to_resource(struct device_node *dev, int index,struct resource *r)
      const __be32 *of_get_address(struct device_node *dev, int index, u64 *size,unsigned int *flags)
    25. 获取经过映射的寄存器虚拟地址
      void __iomem *of_iomap(struct device_node *np, int index)
    26. 根据device_node查找返回该设备对应的platform_device结构
      struct platform_device *of_find_device_by_node(struct device_node *np)
    27. 根据device node,bus id以及父节点创建该设备的platform_device结构
      struct platform_device *of_device_alloc(struct device_node *np,const char *bus_id,struct device *parent)
      static struct platform_device *of_platform_device_create_pdata(struct device_node *np,const char *bus_id,
      void *platform_data,struct device *parent)
    28. 遍历of_allnodes中的节点挂接到of_platform_bus_type总线上,由于此时of_platform_bus_type总线上还没有驱动,所以此时不进行匹配
      int of_platform_bus_probe(struct device_node *root,const struct of_device_id *matches,struct device *parent)
    29. 遍历of_allnodes中的所有节点,生成并初始化platform_device结构
      int of_platform_populate(struct device_node *root,const struct of_device_id *matches,
      const struct of_dev_auxdata *lookup,struct device *parent)
    展开全文
  • 新增自定义配置项:adb shell setprop [key] [value] 如:新增子序列号:adb shell setprop “ro.sub_serialno” “123456” 二、在App中通过Build获取 1.获取通用配置项信息: 设备SN Build.SERIAL 生产商名称 Build...

    在Android开发中,有时需要获取设备信息,如:系统版本、固件版本、设备型号等,这些信息存在于Android系统配置文件:default.prop、/system/build.prop中。

    可通过adb命令和Build两种方式获取、查看。

    一、通过adb命令查看、设置

    1.查看所有配置信息:
    adb shell getprop

    2.查看指定配置信息:
    adb shell getprop [key]
    如:查看设备型号:adb shell getprop “ro.product.model”

    3.新增自定义配置项:adb shell setprop [key] [value]
    如:新增子序列号:adb shell setprop “ro.sub_serialno” “123456”

    二、在App中通过Build获取

    1.获取通用配置项信息:

    设备SNBuild.SERIAL
    生产商名称Build.MANUFACTURER
    设备型号Build.MODEL
    系统固件版本Build.DISPLAY
    品牌Build.BRAND

    更多配置项,可查看Build.java源码。

    2.获取自定义配置项信息:
    可通过反射机制获取,代码如下:

    /**
    * param:key为自定义属性,如:"ro.sub_serialno"
    */
    private String getCustomProp(String key) {
        String strValue = null;
        try {
          Class<?> c = Class.forName("android.os.SystemProperties");
          Method get = c.getMethod("get", String.class);
          strValue = (String) get.invoke(c, key);
        } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
          e.printStackTrace();
        }
    
        return strValue;
      }
    
    展开全文
  • 【嵌入式开发教程2】手把手教你做平板电脑-Linux 引导过程
  • 1、前言 (1)设备树dts文件格式讲解参考博客:《linux设备树dts文件详解》; (2)本文对设备树的讲解是基于hi3516dv300芯片的uboot和kernel源码进行详解,uboot版本是2016.11,内核版本是4.9.37; (3)在dv300芯片用的...
  • 开发者仍可以通过启用开发者设置,然后使用 adb 设置“adb shell setprop security.perf_harden 0”属性来访问 Perf。 用于阻止访问 Perf 的补丁集可分解为内核和用户空间两部分。内核补丁由 Ben Hutchings 实现,...
  • linux,adb,monkey命令

    2021-05-09 08:09:54
    linux命令查看ip命令 ifconfig结束当前命令 ctrl + c清屏 ctrl + l列表 ll lscd 进入某个目录 cd ../ 返回上级目录pwd 显示当前所在目录mkdir 创建一个文件夹touch 创建一个文件cat 查看cat a.txt | grep abc 查看...
  • persist.internet.adb.enable=0 setprop service.adb.tcp.port 0 restart adbd # for telephony function on property:ro.boot.noril=true setprop ro.radio.noril true stop ril-daemon 这一章先大概说下代码,只有...
  • Linux设备树 掌握设备树是 Linux 驱动开发人员必备的技能!因为在新版本的 Linux 中,ARM 相关的驱动全部采用了设备树,最新出的 CPU 其驱动开发也基本都是基于设备树的 1. 设备树简介 设备树(Device Tree),将这个...
  •  BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu")  BASH_VERSION='2.05b.0(1)-release'  COLORS=/etc/DIR_COLORS.xterm  COLUMNS=80  DIRSTACK=()  ...
  • 1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子...
  • Linux内核启动流程(待完善)

    千次阅读 2021-07-02 14:44:10
    本文以Linux3.14版本源码为例分析其启动流程。各版本启动代码略有不同,但核心流程与思想万变不离其宗。 内核映像被加载到内存并获得控制权之后,内核启动流程开始。通常,内核映像以压缩形式存储,并不是一个可以...
  • adb命令和linux命令

    2021-06-03 13:28:25
    Adb命令:adb root 获取 root 权限。adb sideloadadb shell ps...adb shell getprop 获取 Android 系统服务属性adb shell setprop 设置服务属性。adb shell dumpsys 获取系统数据。adb logcat 打印日志文件adb shell...
  • linux系统移植-s5pv210

    2020-07-21 21:45:19
    if (str) { /* 如果获取到了就修改内核设备树里面的bootargs */ err = fdt_setprop(fdt, nodeoffset, "bootargs", str, strlen(str) + 1); if (err ) { printf("WARNING: could not set bootargs %s.\n", fdt_...
  • http://www.limodev.cn/blog作者联系方式:李先静 设置手机端的IP和路由:配置usbnet ifconfig usb0 1.1.1.2配置网关(需要busybox): route add default gw 1.1.1.1设置手机端的DNS:1.普通Linux手机:把PC上的/etc/...
  • Linux 内核启动的时候会解析设备树中各个节点的信息,并且在根文件系统的/proc/device-tree 目录下根据节点名字创建不同文件夹,如图所示:根节点“/”的属性以及子节点上图就是目录/proc/device-tree 目录下的内容...
  • 3.3.2.1 连接一 # 先使用USB连接 adb shell # 进入安卓手机操作 setprop service.adb.tcp.port 5555 # 设置adbd绑定监听的端口号 stop adb start adb # stop adb 和 start adb 相当于重启adbd exit # 退出安卓手机 ...
  • Android/Linux系统性能分析及工具

    千次阅读 2021-12-29 16:31:42
    设置系统属性: adb shell setprop persist.traced.enable 1 运行python进行测试trace: window/Linux环境: python3 record_android_trace -o trace_file.perfetto-trace -t 10s -b 32mb sched freq idle am wm ...
  • 后来同事分析和试了一把,改动/vendor/sec/smdk6410/init.smdk6410.rc中的 setprop ro.radio.noril yes改成setprop ro.radio.noril no。虽然我们做的是MID产品,没有RIL电话功能硬件,但还是要将这部分服务加载...
  • title: Perfetto for linux-使用 Perfetto 分析调度问题 date: 2020-11-21 22:40 author: gatieme tags: - scheduler - linux - debug categories: - scheduler thumbnail: blogexcerpt: Perfetto 工具是 Android 下...
  • 获取设备参数信息adb shell setprop <key> <value> 设置设备参数信息 例子1:>C:\Users\Administrator>adb shell getprop ro.build.version.sdk>19 强制去除linux seC:\Users\Ad...
  • 虽然现在 Google 也在 AOSP 中支持了 strace,但 jtrace 仍然有其独特的优点: 支持系统属性的访问监控 (setprop/getprop) 支持输入事件的监控 (InputReader) 支持 Binder 信息的解析 支持 AIDL 的解析 …… 虽然 ...
  • Jenkins正在显示启动chromedriver的消息,但未触发chromedriver并且测试用例...我认为问题出在chromedriverselenium代码:public class cmddd {@Testpublic void f() throws InterruptedException {System.setProp...
  • Always start adbd on userdebug and eng builds on property:ro.debuggable=1 write /sys/class/android_usb/android0/enable 1 start adbd setprop service.adb.root 1 # Restart adbd so it can run as root on ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,551
精华内容 1,420
关键字:

linux setprop