OrangePi Zero 3学习笔记(Android篇)10 - SPI和从设备

发布于:2025-05-16 ⋅ 阅读:(11) ⋅ 点赞:(0)

目录

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/norflash
    mount -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 {
  getattr
  read
  write
  ioctl
};

编译提示错误

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


网站公告

今日签到

点亮在社区的每一天
去签到