精华内容
下载资源
问答
  • Android 上层应用读写设备节点

    千次阅读 2018-08-28 19:01:54
    Android 上层应用读写设备节点 1. Android 设备节点 2. framework中读取节点的例子 3. 应用层读写节点 读取设备节点设备节点 定时读取设备节点 Android 上层应用读写设备节点 Android L 1. ...

    https://www.cnblogs.com/rustfisher/p/5107531.html

    目录

    Android 上层应用读写设备节点

    Android L

    1. Android 设备节点

    Android基于Linux内核。设备节点文件是设备驱动的逻辑文件,可以通过设备节点来访问设备驱动。
    很多设备信息都可存储在节点中。apk可以访问节点,获取设备信息或状态。

    2. framework中读取节点的例子

    Android Settings 应用中给出了很多的设备信息,可以以此为入口;进一步可以找到 Build.java
    例如获取设备的版本号,应用中直接可以调用 Build.DISPLAY 获得字符串

    源码 Build.java (frameworks\base\core\java\android\os)

        public static final String PRODUCT = getString("ro.product.name");
        ......
        private static String getString(String property) {
            return SystemProperties.get(property, UNKNOWN);
        }

    跳转到 SystemProperties.java (frameworks\base\core\java\android\os) 这个类不开放

        // 调用 native_get ,获取节点;可以设定默认值
        public static String get(String key, String def) {
            if (key.length() > PROP_NAME_MAX) {
                throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
            }
            return native_get(key, def);
        }

    3. 应用层读写节点

    应用层中,一般都能够读取设备节点。对于写节点这个操作,需要更高的root权限。

    读取设备节点

    例如给设备新添加了节点,路径是 /sys/class/demo/version
    可以adb shell进入机器,然后 cat /sys/class/demo/version;即可获得信息

    也可以写成一个方法,如下:

        /**
         * 获取节点
         */
        private static String getString(String path) {
            String prop = "waiting";// 默认值
            try {
                BufferedReader reader = new BufferedReader(new FileReader(path));
                prop = reader.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return prop;
        }

    调用方法就是:

        getString("/sys/class/demo/version")

    写设备节点

    这里写节点的方法需要更高的权限,apk要放到源码中进行编译;
    源码中编译apk的方法如同添加第三方apk的方法
    AndroidManifest中添加:

            android:sharedUserId="android.uid.system"

    写节点的代码

        private static final String WAKE_PATH = "/sys/class/demo/wake";
        ......
            try {
                BufferedWriter bufWriter = null;
                bufWriter = new BufferedWriter(new FileWriter(WAKE_PATH));
                bufWriter.write("1");  // 写操作
                bufWriter.close();
                Toast.makeText(getApplicationContext(),
                        "功能已激活",Toast.LENGTH_SHORT).show();
                Log.d(TAG,"功能已激活 angle " + getString(ANGLE_PATH));
            } catch (IOException e) {
                e.printStackTrace();
                Log.e(TAG,"can't write the " + WAKE_PATH);
            }

    经过源码mm编译后,push到设备中可以查看效果

    定时读取设备节点

    需要被更新的View记得调用invalidate()方法

    使用定时器与Handler来定时读取节点,并更新UI

    重启定时器和取消定时器都封装成方法,便于调用

        Timer mTimer;
        TimerTask mTimerTask;
        SensorHandler mHandler = new SensorHandler(this);
    
        /**
         * Handler : update value
         */
        static class SensorHandler extends Handler {
            MainActivity mainActivity;
    
            SensorHandler(MainActivity activity) {
                mainActivity = activity;
            }
    
            @Override
            public void handleMessage(Message msg) {
                mainActivity.ultrasoundValue.setText(getString(ULTRASOUND_VALUE_PATH));
            }
        }
    
        ......
    
        /**
         * cancel timer and timer task
         */
        private void cancelUltrasoundTimer(){
            if (mTimer != null) {
                mTimer.cancel();
                mTimer = null;
            }
            if (mTimerTask != null){
                mTimerTask.cancel();
                mTimerTask = null;
            }
        }
    
        /**
         * restart timer to update UI
         */
        private void restartUltrasoundTimer(String timer){
            cancelUltrasoundTimer();
            mTimer = new Timer(timer);
            mTimerTask = new TimerTask() {
                @Override
                public void run() {
                    mHandler.sendEmptyMessageAtTime(1300, 50);
                }
            };
            mTimer.schedule(mTimerTask, 50, 50);
        }

    使用 Runnable 和 Handler 来定时更新UI

    Handler 部分不变,在开启的子线程中向Handler发送消息
    onCreate 方法中启动子线程

            Thread t = new Thread(new UpdateUIThread());
            t.start();
        class UpdateUIThread implements Runnable {
    
            @Override
            public void run() {
                while (true) {
                    while (ultraStatus) {
                        Message message = new Message();
                        message.what = UPDATE_ULTRA_VALUE;// int
    
                        mHandler.sendMessage(message);
                        try {
                            Thread.sleep(100); // 暂停100ms,起到定时的效果
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                    }
                }
            }
        }
    展开全文
  • 创建设备节点/sys/class/drm/card0-DSI-1/disp_param static ssize_t disp_param_store(struct device *device, struct device_attribute *attr, const char *buf, size_t count) { struct drm_...
    创建设备节点/sys/class/drm/card0-DSI-1/disp_param
    
      static ssize_t disp_param_store(struct device *device,
      			   struct device_attribute *attr,
      			   const char *buf, size_t count)
      {
      	struct drm_connector *connector = to_drm_connector(device);
      	struct sde_connector *c_conn;
      	struct dsi_display *display;
      	uint32_t param;
      
      
      	c_conn = container_of(connector,struct sde_connector,base);
      	if(!c_conn || !c_conn->display){
      		DRM_ERROR("NULL pionter");
      		return 0;
      	}
      
      	display = (struct dsi_display *) c_conn->display;
      
      	sscanf(buf, "0x%x", &param);
      	DRM_INFO("%s: buf = %s, param = 0x%x\n", __func__, buf, param);
      
      	dsi_display_param_store(display, param);
      
      	return count;
      }
    
    static DEVICE_ATTR_RW(disp_param); //disp_param -->disp_param_store
    
     #define __ATTR_RW(_name) __ATTR(_name, (S_IWUSR | S_IRUGO),		\
      			 _name##_show, _name##_store)
    
      #define __ATTR(_name, _mode, _show, _store) {				\
      	.attr = {.name = __stringify(_name),				\
      		 .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },		\
      	.show	= _show,						\
      	.store	= _store,						\
      }
    
     #define DEVICE_ATTR_RW(_name) \
      	struct device_attribute dev_attr_##_name = __ATTR_RW(_name)
    
    
    static struct attribute *connector_dev_attrs[] = {
        &dev_attr_disp_param.attr,
        NULL
    };
    
     static const struct attribute_group connector_dev_group = {
         .attrs = connector_dev_attrs,
         .bin_attrs = connector_bin_attrs,
     };
    
     static const struct attribute_group *connector_dev_groups[] = {
      	&connector_dev_group,
      	NULL
     };
    
      int drm_sysfs_connector_add(struct drm_connector *connector)
      {
      	struct drm_device *dev = connector->dev;
      
      	if (connector->kdev)
      		return 0;
      
      	connector->kdev =
      		device_create_with_groups(drm_class, dev->primary->kdev, 0,
      					  connector, connector_dev_groups,
      					  "card%d-%s", dev->primary->index,
      					  connector->name);
      	DRM_DEBUG("adding \"%s\" to sysfs\n",
      		  connector->name);
      
      	if (IS_ERR(connector->kdev)) {
      		DRM_ERROR("failed to register connector device: %ld\n", PTR_ERR(connector->kdev));
      		return PTR_ERR(connector->kdev);
      	}
      
      	/* Let userspace know we have a new connector */
      	drm_sysfs_hotplug_event(dev);
      
      	return 0;
      }

     

    展开全文
  • Linux驱动学习,手动创建设备节点并访问

    模块代码chr_test.c

    /**
     * To test the chr_dev for AP operation
     * by wozon
     *
     * */
    
    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/init.h>
    #include <linux/cdev.h>
    #include <linux/fs.h>
    
    
    MODULE_LICENSE ("GPL");
    
    
    dev_t dev;
    
    struct cdev cdev;
    
    
    int chr_open(struct inode *i, struct file *f)
    {
        printk("AP opened!\n");
        return 0;
    }
    
    int chr_close(struct inode *i, struct file *filp)
    {
        printk("AP closed!\n");
        return 0;
    }
    
    struct file_operations chr_fops={
        .owner = THIS_MODULE,
        .open = chr_open,
        .release = chr_close,
    };
    
    
    //模块加载函数
    int __init init_module (void)
    {
        int rst = 0;
        dev = MKDEV(249,1);   //创建设备节点
        rst = register_chrdev_region(dev,1,"shuibian");  //向内核注册设备号
        if(rst != 0)
        {
            rst = -1;
            goto exit0;
        }
    
        cdev_init(&cdev,&chr_fops);//字符设备驱动控制块初始化
        rst = cdev_add(&cdev,dev,1);//向内核添加字符设备驱动控制块
        if(rst != 0)
        {
            rst = -2;
            goto exit1;
        }
        printk("Chr,This module was added by the kernel!\n");
    
        goto exit0;
    
    exit1:
        unregister_chrdev_region(dev,1);//注销设备号
    
    exit0:
        return rst;
    }
    
    
    //模块卸载函数
    void __exit cleanup_module (void)
    {
        cdev_del(&cdev);//从内核中删除字符设备控制块。
        unregister_chrdev_region(dev,1);
        printk("This module was removed by the kernel!\n");
    }
    

    应用程序代码test.c

    /*
     * test.c
     */
    
    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/ioctl.h>
    
    int main (void) 
    {
        int fd;
        fd = open ("/dev/sb13",O_RDWR);
        if (fd < 0) {
          perror("open");
          exit(0);
        }
        printf ("/dev/chrdev opened, fd=%d\n",fd);
    
        close (fd);
        printf ("/dev/chrdev closed!\n");
        return 0;
    }

    Makefile

    #To display info during Ccompiling
    $(warning KERNELRELEASE=$(KERNELRELEASE))
    
    #To check the KERNELRELEASE enviroment value
    ifeq ($(KERNELRELEASE),)
    #It's NULL, so to set the enviroment value
    
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    
    PWD :=$(shell pwd)
    
    modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
    
    modules_install:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
    
    clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*
    
    
    
    .PHONY: modules modules_install clean
    #To create obj file
    else
            obj-m := chr_test.o
    endif
    

    先编译模块文件,在终端里面输入make,按下回车
    这里写图片描述
    生成chr_test.ko文件。
    进入root用户,手动创建设备节点:mknod /dev/ c 249 1
    这里写图片描述
    可以看出在/dev/目录下面生成了sb13设备
    将chr_test.ko文件加载进内核里面 insmod chr_test.ko
    编译test.c文件,生成应用程序
    这里写图片描述
    执行应用程序 sudo ./a.out
    这里写图片描述
    可以看出,正常访问到了我们刚刚创建的设备节点。

    ps:我们这样通过手动方式创建设备节点,然后编辑模块代码,用应用程序来访问,很复杂,尤其是作为别人项目一部分时,就更加不便维护,下一节我们将讲解自动创建设备节点的方法。

    展开全文
  • 怎么查看DTS设备树的节点

    千次阅读 2019-10-29 10:35:04
    查看DTS设备树的节点 插上串口线,板子上电稳定运行以后,进入proc目录。在proc里面记录着系统信息 当前进程、当前设备树注册,文件系统,内存大小,CPU信息等) [root@rk3288:/]# cd proc [root@rk3288:/proc]# ls ...

    查看DTS设备树的节点
    插上串口线,板子上电稳定运行以后,进入proc目录。在proc里面记录着系统信息
    当前进程、当前设备树注册,文件系统,内存大小,CPU信息等)

    [root@rk3288:/]# cd proc
    [root@rk3288:/proc]# ls
    1                  176                5                  driver
    10                 18                 511                execdomains
    11                 183                512                fb
    12                 19                 522                filesystems
    124                2                  557                fs
    125                20                 558                interrupts
    126                205                559                iomem
    127                21                 560                ioports
    128                218                584                irq
    129                22                 590                kallsyms
    13                 23                 593                key-users
    130                24                 595                keys
    131                25                 596                kmsg
    132                26                 598                kpagecount
    133                27                 6                  kpageflags
    134                28                 7                  loadavg
    135                29                 74                 locks
    136                3                  75                 meminfo
    137                30                 76                 misc
    138                31                 77                 modules
    14                 32                 78                 mounts
    140                328                8                  net
    141                33                 81                 pagetypeinfo
    142                330                82                 partitions
    143                337                83                 sched_debug
    144                34                 84                 schedstat
    145                35                 85                 scsi
    146                36                 86                 self
    147                361                87                 slabinfo
    148                363                88                 softirqs
    149                365                89                 stat
    15                 366                9                  swaps
    150                37                 90                 sys
    151                370                91                 sysrq-trigger
    152                378                asound             sysvipc
    153                38                 bluetooth          thread-self
    154                387                buddyinfo          timer_list
    155                388                bus                timer_stats
    156                389                cgroups            tty
    157                39                 cmdline            uid
    158                393                config.gz          uid_time_in_state
    159                4                  consoles           uptime
    16                 40                 cpu                version
    160                41                 cpuinfo            vmallocinfo
    161                42                 crypto             vmstat
    162                43                 device-tree        zoneinfo
    17                 44                 devices
    173                499                diskstats`
    

    在proc下,进入device-tree目录(cd device-tree)可以查看到系统的节点

    [root@rk3288:/proc]# cd device-tree
    [root@rk3288:/sys/firmware/devicetree/base]# ls
    #address-cells                 oscillator
    #size-cells                    pinctrl
    __symbols__                    power-management@ff730000
    adc-keys                       psci
    aliases                        pwm@ff680000
    amba                           pwm@ff680010
    arm-pmu                        pwm@ff680020
    backlight                      pwm@ff680030
    bus_intmem@ff700000            qos@ffaa0000
    chosen                         qos@ffaa0080
    cif@ff950000                   qos@ffad0000
    cif_isp@ff910000               qos@ffad0100
    clock-controller@ff760000      qos@ffad0180
    compatible                     qos@ffad0400
    cpus                           qos@ffad0480
    cypto-controller@ff8a0000      qos@ffad0500
    ddr_timing                     qos@ffad0800
    dfi                            qos@ffad0880
    display-subsystem              qos@ffad0900
    dmc                            qos@ffae0000
    dp@ff970000                    qos@ffaf0000
    dsi@ff960000                   qos@ffaf0080
    dsi@ff964000                   reserved-memory
    dwmmc@ff0c0000                 rga@ff920000
    dwmmc@ff0d0000                 rockchip-suspend
    dwmmc@ff0e0000                 saradc@ff100000
    dwmmc@ff0f0000                 sdio-pwrseq
    edp-panel                      sdmmc-regulator
    efuse@ffb40000                 serial-number
    ethernet@ff290000              serial@ff180000
    external-gmac-clock            serial@ff190000
    fiq-debugger                   serial@ff1b0000
    gpio-keys                      serial@ff1c0000
    gpu@ffa30000                   serial@ff690000
    hdmi@ff980000                  sound
    hevc-service@ff9c0000          sound@ff8b0000
    i2c@ff140000                   spi@ff110000
    i2c@ff150000                   spi@ff120000
    i2c@ff160000                   spi@ff130000
    i2c@ff170000                   sram@ff720000
    i2c@ff650000                   syscon@ff740000
    i2c@ff660000                   syscon@ff770000
    i2s@ff890000                   syscon@ffac0000
    iep@ff90000                    thermal-zones
    interrupt-controller@ffc01000  timer
    interrupt-parent               timer@ff6b0000
    iommu@ff900800                 tsadc@ff280000
    iommu@ff914000                 usb@ff500000
    iommu@ff930300                 usb@ff520000
    iommu@ff940300                 usb@ff540000
    iommu@ff9a0800                 usb@ff580000
    iommu@ff9c0440                 usb@ff5c0000
    isp@ff910000                   vcc-3g-regulator
    lvds-panel                     vcc-host-regulator
    lvds@ff96c000                  vcc-lcd
    memory                         vcc-phy-regulator
    mipi-phy-tx1rx1@ff968000       vcc-wl
    myleds                         vcc_5v-regulator
    name                           vcc_host-regulator
    nocp-core@ffac0400             vccadc-ref
    nocp-gpu@ffac0800              video-codec@ff9a0000
    nocp-peri@ffac0c00             vop@ff930000
    nocp-vio0@ffac1400             vop@ff940000
    nocp-vio1@ffac1800             vpu-service@ff9a0000
    nocp-vio2@ffac1c00             vsys-regulator
    nocp-vpu@ffac1000              watchdog@ff800000
    opp-table1                     wireless-bluetooth
    opp_table0                     wireless-wlan
    

    上面的节点中,60行的myleds这个节点就是自己命名定义的节点。

    展开全文
  • 可能没有按照安卓标准的方式去调用,但是这种方式也可以,这是中途遇到的问题,记录一下是怎么解决的 源码目录下,搜索,find -name init.rc root@ubuntu:/g3399/g3399-v7-1-2-20180529# find -name init.rc ...
  • 我眼中的Linux设备树(二 节点)

    千次阅读 2016-05-19 14:19:58
    节点(node)的表示首先说节点的表示方法,除了根节点只用一个斜杠“/”表示外,其他节点的表示形式如“node-name@unit-address”。@前边是节点名字,后边是节点地址。节点名字的长度范围是1到31,可以使用的字符在...
  • 首先说节点的表示方法,除了根节点只用一个斜杠“/”表示外,其他节点的表示形式如“node-name@unit-address”。 @前边是节点名字,后边是节点地址。 节点名字的长度范围是1到31,可以使用的字符在ePAPR规范中...
  • //获取设备树的display-timings节点 /* get clock from devicetree */ clk_pix = devm_clk_get(pdev->dev, "pix"); //获取pix的结构体 clk_axi = devm_clk_get(pdev->dev, "...
  • 问题:U盘接入,系统可以识别,但在/dev目录下只有sda(或其他),却无设备节点sda1(或其他)? 解决: (1)查看U盘是否分区 #fdisk /dev/sda /*进入fdisk命令操作空间*/ #Command (m for help): m /*命令...
  • 巧用DISPLAY_AWR函数与dba_hist_sqlstat结合查询SQL语句在指定节点指定时间范围内的历史执行计划 (查询SQL语句在指定节点指定时间段的执行计划)
  • UE4使用nDisplay渲染到多个显示设备(一) 文档链接 交互式内容不局限于显示在一个屏幕上,甚至不局限于一个像VR头盔一样的双屏幕设备。越来越多的可视化系统旨在通过多个同时显示的实时内容来更有效地让观众沉浸在...
  • 此节点并不真正代表设备节点,而是一些虚拟的由bootloader传递给内核的一些参数,包括bootargs(cmdline)和initrd等。一般由bootloader在启动内核时添加此节点。 2.3 cpus Node cpus节点是root节点的子节点,对于...
  • **document节点是文档的根节点,其它节点都是它的子节点**。只要浏览器开始载入HTML文档,这个节点对象就存在了,可以直接调用。 document节点: - 子节点: 对于HTML文档来说,document对象一般有两个子节点。 1)...
  • Display--基本概念

    千次阅读 2020-05-11 17:33:03
    文章目录Display中的DRM模块介绍DRM概述: Display中的DRM模块介绍 DRM概述: DRM全称 Direct Rendering Manager(直接渲染管理器),进行显示输出管理、 buffer 分配、 帧缓冲, 是...DRM的设备节点为 "/dev/dri/cardX
  • 节点红色贡献舒适盒 node-red-contrib-comfortbox是一个软件包,其中包含用于配置和使用ComfortBox API服务... display text -在ComfortBox设备display text的节点。 query data -查询ComfortBox设备数据的节点。 r
  • 文章目录前言ROS系列文章ROS的通信机制节点(Node)节点管理器(Master)简单运行引用说明参考 前言 我要给大家来介绍一下ROS当中一些核心的概念,帮助大家去在后面的ROS学习当中更快地吸收这些概念。 ROS系列文章 ...
  • Xsens ROS 节点 时间戳以及话题

    千次阅读 2020-07-08 23:01:43
    Xsens ROS 节点 代码分析概述目录结构时间戳的处理 概述 阅读Xsens在ROS下MTi系列节点源代码,将有用的部分总结...│ ├── display.launch │ └── xsens_mti_node.launch ├── lib │ └── xspublic │ ├─
  • 手动部署 OpenStack Rocky 双节点

    千次阅读 热门讨论 2019-03-29 19:46:06
    L2/L3 交换机、路由器),是一种比较简单的网络模型,物理网络设备的加入也使得网络具有更高的性能。但由于 Neutron 无需启用 L3 Router 服务,所以也就不能支持 LBaaS、FWaaS 等高级功能。 Networking Option 2:...
  • 当前可作为Nuke节点使用。 一旦设计处于试验阶段,就计划解决DCTL。 ALPHA软件-警告该软件是高度实验性的,正在积极测试和开发中。 强烈建议您不要在创建图像时将其用于生产。 设计目标 简单-设计简单 坚固耐用-...
  • CSS display 属性详解

    2017-12-06 10:58:46
    display的所有属性 {/* CSS 1 */ display: none; display: inline; display: block; display: list-item; /* CSS 2.1 */ display: inline-block; display: table; display: inline-table; display: table-cell; ...
  • MIPI Display Panel

    千次阅读 2016-04-13 21:55:22
    硬件篇 架构 最近研究MIPI DSI Panel Linux Driver架构,于是一边啃spec性质的官方文档,一边从dri-devel,omap-linux等邮件列表里,搜索所有的跟panel driver相关的讨论,尽力在短时间内把整个...和Display
  • Oracle RAC 10g添加节点

    2012-08-21 13:49:34
    4.配置节点3数据库环境(oracle用户及组、系统内核信息、oracle用户限制、软件存放目录、裸设备的配置(跟节点1、节点2相同的配置)) 二.RAC环境信息   三.具体步骤 1.时间同步 定时任务,每半个小时与节点1...
  • 使用时的问题 交换机版本太老时有些OID不支持,我遇到的就有华为交换机systemname节点名称不支持,需要重新更新交换机版本,在判断问题的时候需要查看display logbuffer。开始查看以为时community不支持。后来查看...
  • Dual display on msm8937

    千次阅读 2018-06-29 15:05:16
    在 HAL 层,程序会通过 sysfs 去文件节点“sys/devices/virtual/graphics/fb1/res_info” 读取该数据,并通过该数据,来设置 MSM8937 输出的分辨率。需要关注的两个函数是: DisplayError HWHDMI::...
  • MIPI DIsplay Panel And Linux Driver Model

    万次阅读 热门讨论 2013-11-03 16:17:52
    简单介绍了MIPI Display硬件架构和在高通msm7627a上的驱动模型
  • 删除节点实验操作总结   目 录   RAC物理结构... 3 一.  DBCA删除dbi节点的Database实例... 4 1.1、  检查删除dbi节点的wxxrdb3实例前的crs_stat -t -v 状态... 4 1.2、  先停掉RAC 上的dbi...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,348
精华内容 8,139
关键字:

display的设备节点