OrangePi Zero 3学习笔记(Android篇)10 - SPI和从设备
目录
1. 配置内核
2. 修改设备数
3. 修改权限
4. 验证
Zero 3的板子有2个SPI Master接口,其中SPI0接的是板载16MB大小的SPI Nor Flash,SPI1则是导出到26pin的接口上。
spi和i2c有点不同,spi是直接生成spi虚拟设备,所以在dev里面会直接出现类似spidev0.0这样的设备。Linux是通过MTD操作nor flash。可以在dev里面查看spidev设备,可以看到spidev0.0和spidev1.1两个spi设备。
1. 配置内核
执行命令:./longan/build.sh menuconfig
- 进入
勾选
- 进入
勾选
- 进入
勾选
2. 修改设备数
修改文件/longan/device/config/chips/h618/configs/p2/linux-5.4/board.dts,找到spi1,在里面添加nor flash,注意去掉spi_board1,否则会提示spi1有冲突
/*spi_board1@1 {device_type = "spi_board1";compatible = "rohm,dh2228fv";spi-max-frequency = <10000000>;reg = <0x1>;#spi-rx-bus-width = <0x1>;#spi-tx-bus-width = <0x1>;status = "okay";};*/spi1_flash1: w25c32@1 {compatible = "jedec,spi-nor";spi-max-frequency = <10000000>;reg = <1>;#address-cells = <1>;#size-cells = <1>;partition@spi-test0{label = "test0";reg = <0x0 0x400000>; /* 4MB */};};
3. 修改权限
在device/softwinner/apollo/common/system/ueventd.sun50iw9p1.rc中添加
/dev/mtd* 0777 system system
这种方式无效。
在/device/softwinner/apollo/common/system/init.sun50iw9p1.rc里面on fs里面添加
mkdir -p /mnt/norflashmount -t jffs2 /dev/mtd0 /mnt/norflash
这里mkdir会无法正常执行,通过dmesg | grep mount查看
[ 5.120919] [ T190] type=1400 audit(10.276:4): avc: denied { mounton } for comm="init" path="/dev/mtd0" dev="tmpfs" ino=150 scontext=u:r:init:s0 tcontext=u:object_r:device:s0 tclass=chr_file permissive=1
分析这条权限提示:
a. 缺什么权限: denied { mounton },即缺mounton权限
b. 谁缺权限:scontext=u:r:init:s0,即init缺权限
c. 对什么缺少权限:tcontext=u:object_r:device:s0 ,即对device缺权限
d. 什么类型的文件:tclass=chr_file,即chr_file类型
找到/system/sepolicy/private/init.te,添加
allow init device:chr_file {getattrreadwriteioctl
};
编译提示错误
neverallow check failed at out/soong/.intermediates/system/sepolicy/userdebug_pl
at_sepolicy.cil/android_common/userdebug_plat_sepolicy.cil:7771 from system/sepo
licy/public/domain.te:465(neverallow domain device (chr_file (read write open)))
没法mount
4. 验证
shell中输入cat /proc/mtd
console:/ $ cat /proc/mtd
dev: size erasesize name
mtd0: 00400000 00001000 "test0"
输入cat /proc/partitions,可以看到唯一的mtd分区
31 0 4096 mtdblock0