Android开放sys下设备节点的读写权限

Android为system_app开放sys下节点的读写权限
由于Android源码的SELinux安全访问机制,app是无法直接访问设备节点,systemAPP也不行
开放权限步骤:

节点的实际路径:/sys/devices/platform/5v_en/led

1、在\device\rockchip\common\sepolicy目录下file.te文件中添加

type sysfs_led, fs_type, sysfs_type;

sysfs_led为自定义的名称(如果是dev/下的应该写在device.te文件中,具体照着其他的写就行)

2、在file_context 文件中:

/sys/devices/platform/5v_en/led u:object_r:sysfs_led_state:s0

节点路径,u:object_r:(在file.te中定义的名称):s0

3、为systemAPP 开放权限 ,所以在 system_app.te中添加

allow system_app sysfs_led:chr_file rw_file_perms;
allow system_app sysfs_led:file { open write getattr };

其中 open write getattr 权限查看avc日志补全缺少的权限:

avc: denied { write } for name="system_app " scontext=u:r:system_app:s0:c512,c768 tcontext=u:r:sysfs_led:s0 tclass=file permissive=1

这个大概意思就是system_app缺少对sysfs_led:file的write的权限,写法:
allow system_app sysfs_led:file { write };

这样就为systemAPP开放了对led节点的读写的操作权限,
如果使用这种方法对第三方APP untrusted_app 开放权限,会编译报错。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
SPI(Serial Peripheral Interface)是一种串行通信协议,用于在微控制器和外部设备之间传输数据。在Linux系统中,我们可以通过设备的SPI节点实现。下面是一些基本的步骤: 1. 打开SPI设备节点,例如/dev/spidev0.0。 2. 配置SPI设备的工作模式、传输速率、数据位数等参数。 3. 准备要发送的数据,并将其入SPI设备的发送缓冲区。 4. 启动SPI传输,将数据从发送缓冲区发送到接收缓冲区。 5. 取接收缓冲区中的数据。 6. 关闭SPI设备节点。 下面是一个简单的示例程序,演示如何通过SPI节点实现: ``` #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/spi/spidev.h> int main() { int fd; unsigned char tx_buf[3] = {0x01, 0x02, 0x03}; unsigned char rx_buf[3] = {0}; fd = open("/dev/spidev0.0", O_RDWR); if (fd < 0) { perror("open"); exit(1); } // 配置SPI设备参数 unsigned int speed = 1000000; // 传输速率为1MHz unsigned char mode = 0; // 工作模式为0 unsigned char bits = 8; // 数据位数为8 struct spi_ioc_transfer tr = { .tx_buf = (unsigned long)tx_buf, .rx_buf = (unsigned long)rx_buf, .len = 3, .speed_hz = speed, .bits_per_word = bits, .cs_change = 1, }; ioctl(fd, SPI_IOC_WR_MODE, &mode); ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); // 启动SPI传输 int ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 0) { perror("ioctl"); exit(1); } // 取接收缓冲区中的数据 printf("Received: %02x %02x %02x\n", rx_buf[0], rx_buf[1], rx_buf[2]); close(fd); return 0; } ``` 在这个示例程序中,我们使用了spi_ioc_transfer结构体来配置SPI设备参数和进行数据传输。在ioctl函数中,我们使用了SPI_IOC_WR_MODE、SPI_IOC_WR_BITS_PER_WORD和SPI_IOC_WR_MAX_SPEED_HZ三个宏来设置工作模式、数据位数和传输速率。最后,我们使用了SPI_IOC_MESSAGE宏启动SPI传输,并取接收缓冲区中的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值