Dts 里gpio的那些事儿

目录

项目背景

Gpio Debug

Selinux权限问题 标志性log 格式:


项目背景

   最近调试一个项目,在gpio,dts上闷逼了一把。搞了很多问题。

1. 添加Dts文件里GPIO,同时去掉相同的GPIO配置项,注意去掉要干净,否则会导致死机

         pio: pinctrl@1000b000 {
        compatible = "mediatek,pinctrl";
        reg = <0 0x1000b000 0 0x1000>;
        mediatek,pctl-regmap = <&syscfg_pctl_a>,
                       <&syscfg_pctl_lt>,
                       <&syscfg_pctl_lm>,
                       <&syscfg_pctl_lb>,
                       <&syscfg_pctl_bl>,
                       <&syscfg_pctl_bm>,
                       <&syscfg_pctl_rb>,
                       <&syscfg_pctl_rt>;

      sec_nfc_pin: sec-nfc {
        compatible = "sum,sec_nfc_pin";
    };

  &节点名字, &表示的意思是,取“引用字符对应的节点”

      &sec_nfc_pin {
    pinctrl-names = "default", "sec_pd_high", "sec_pd_low", "sec_wake_high", "sec_wake_low", "sec_irq_inpull";
    pinctrl-0 = <&sec_nfc_default>;
    pinctrl-1 = <&sec_nfc_pd_high>;
    pinctrl-2 = <&sec_nfc_pd_low>;
    pinctrl-3 = <&sec_nfc_wake_high>;
    pinctrl-4 = <&sec_nfc_wake_low>;
    pinctrl-5 = <&sec_nfc_irq_inpull>;
    status = "okay";
};

    中断Gpio方式

        #address-cells = <1>;
        #size-cells = <0>;
        status = "okay";

        sec-nfc@27 {
                compatible = "sec-nfc";
                reg = <0x27>;
                sec-nfc,ven-gpio = <&pio 10 0>;/*pw rst gpio_10*/
                sec-nfc,firm-gpio = <&pio 27 0>;/*wake gpio_12*/
                sec-nfc,irq-gpio = <&pio 12 0>;/*irq gpio_27*/
                sec-nfc,clk_req-gpio = <&pio 136 0>;/*gpio_136*/
        };

          sec_nfc_irq_inpull: state_sec_irq_inpull {

               pins_cmd_dat {

                  pins = <PINMUX_GPIO12__FUNC_GPIO12>;

                   input-enable;
                };

2, 使用GPIO函数

       共用设备Dts节点

              of_get_named_gpio(spi->dev.of_node,"nfc,irq-gpio", 0);

       独立gpio节点方式:

        node = of_find_compatible_node(NULL, NULL, "vendor,sec_nfc_pin");
        pdev = of_find_device_by_node(node);
        pinctrl_gpios = devm_pinctrl_get(&pdev->dev);

        pinctrl_lookup_state(pinctrl_gpios, "sec_power_high");

        pinctrl_select_state(pinctrl_gpios, pins_pd_high); // 输出高低电平,需要预先在dts里定义好

       irq_num = of_get_named_gpio_flags(np, "nfc,irq-gpio", 0, NULL);

       gpio_get_value(irq_num);     // 标准Linux系统调用函数,注意参数gpio的获取

       gpio_set_value()

      

GPIO函数另外一种使用组合

      gpio_request(pdata->ven, "nfc_wake");
      gpio_direction_output(pdata->ven,  NFC_PW_OFF);
      gpio_direction_input()

3、中断号获取和设置

        node = of_find_compatible_node(NULL, NULL, "mediatek,irq_nfc-eint"); // 通过DWS工具生成关联节点

        irq = irq_of_parse_and_map(node, 0);

        request_threaded_irq(client->irq, NULL, sec_nfc_irq_thread_fn,

Gpio Debug

  • 使用 mount -t debugfs debugfs /tmp 把debugfs挂接到/tmp下,再重新进入/tmp后就能看到一个名为gpio的文件
  • cat /tmp/gpio即可得到gpio的所有信息,使用完后umount /tmp卸载掉debugfs

of_get_named_gpio_flags 函数返回值: gpio组数 * gpio寄存器 size + 偏移

  例子:gpio3—A4   3 * 32 + 4 = 100

GPIOs 0-31, platform/pinctrl, gpio0:
 gpio-1   (                    |bt_default_reset    ) out lo    
 gpio-2   (                    |reset               ) out hi    
 gpio-5   (                    |GTP_INT_IRQ         ) in  lo    
 gpio-11  (                    |bt_default_wake_host) in  lo    
 gpio-12  (                    |GTP_RST_PORT        ) out hi    

GPIOs 32-63, platform/pinctrl, gpio1:
 gpio-51  (                    |bt_default_rts      ) in  hi    

GPIOs 64-95, platform/pinctrl, gpio2:
 gpio-72  (                    |bt_default_wake     ) in  hi    
 gpio-77  (                    |mdio-reset          ) out hi    

GPIOs 96-127, platform/pinctrl, gpio3:

查看 gpio 的状态
cat /sys/kernel/debug/gpio, 通过这个命令可以知道当前一些 GPIO 的状态, 确认和屏相关的 GPIO
是否有被正常设置。

Selinux权限问题 标志性log 格式:

avc: denied  { 操作权限 }  for pid=7201 comm=“进程名”  scontext=u:r:源类型:s0  tcontext=u:r:目标类型:s0  tclass=访问类别  permissive=0

   allow   scontext    tcontext tclass 

Kenel log:

avc: denied { execheap } for pid=7201 comm="com.baidu.input" scontext=u:r:untrusted_app:s0tcontext=u:r:untrusted_app:s0tclass=processpermissive=0

Logcat log:

com.baidu.input: type=1400audit(0.0:29): avc: denied { execheap } for scontext=u:r:untrusted_app:s0tcontext=u:r:untrusted_app:s0tclass=processpermissive=0

2. 在sepolicy中添加相应权限

2.1 修改依据:

log 信息:

avc: denied  { 操作权限  }  for pid=7201  comm=“进程名”  scontext=u:r:源类型:s0  tcontext=u:r:目标类型:s0  tclass=访问类别  permissive=0

2.2 修改步骤:

找相应的“源类型.te ”文件

有两个位置可能存在相应的te文件:

位置一:LINUX/android/external/sepolicy
位置二:LINUX/android/device/qcom/sepolicy/common 
 

2.3 按如下格式在该文件中添加: 

allow  源类型 目标类型:访问类别 {权限};

3. 添加权限后的neverallowed冲突

3.1 编译报错:

libsepol.check_assertion_helper: neverallow on line xxx ofexternal/sepolicy/domain.te ……

3.2 原因:

新添加的sepolicy项目违反了domain.te 中规定的的总策略原则。所以该条权限策略不能添加,如果强行添加的话有CTS测试失败的风险。

3.3 解决方法:

1.从运行log中找到要访问的目标名称,一般是name字段后的名称

avc: denied { read write } for pid=303 comm="mediaserver" name="tfa9890"dev="tmpfs" ino=3880 scontext=u:r:mediaserver:s0tcontext=u:object_r:device:s0tclass=chr_file permissive=0

2.找到相应的*_contexts文件。

  一般有file_contexts, genfs_contexts,  property_contexts,  service_contexts 等文件

3.在contexts文件中指定要访问的目标为一个“源类型 ”有权限访问的“目标类型”

  如:在file_contexts中添加: /dev/tfa9890     u:object_r:audio_device:s0


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值