文档更新说明
免责声明
本文档虽力求准确,但可能存在错误或遗漏,用户需谨慎评估适用性;我们保留随时修订的权利,且不保证旧版本内容的有效性,为了得到最新版本的产品信息,请定时访问立创开发板官网进行资料的更新下载。本文档版权及最终解释权归深圳嘉立创科技集团股份有限公司所有。请务必注意以上声明,自行评估风险并决策,我们对使用本文档产生的任何问题概不负责。感谢您的包容与支持。
准备工作
开始前你需要做一些准备工作,以确保后续内容的顺利进行,我把它们罗列如下:
- 需要一台win10电脑,其他系统理论上也可以但是我没测试,这里以我电脑为例,后续所有的环境以及开发编译如果不做特殊说明默认都是基于此配置电脑进行
- 电脑需安装ADB、串口调试工具
- 泰山派需烧录对应的Android系统固件
- 逻辑分析仪,万用表(非必须,IO部分用到)
注意事项
- 使用符合开发板要求的正确电源适配器,确保电压和电流规格匹配。例如:使用电脑的USB驱动供电时,电流有限,如果连接了屏幕等设备,可能会导致电流不足无法开机问题。
- 在插拔连接器时,请先断开电源,避免带电操作。
- 当手拿泰山派或任何没有外壳的电路板时,尽量抓住板边,以降低静电损坏器件的风险。养成良好的习惯很重要。
- 在插入或拔出连接器时要小心,确保正确对准插口,并轻柔地插入或拔出,以避免损坏连接器或开发板接口。特别是GH1.25座子带锁的插口需要按下卡扣才能拔出,不要用拉线的暴力拔插方式。
- MicroHDMI口与配送的转接板都是非常脆弱的,千万不要暴力以免焊盘连根拔起。
- 在高负载情况下,rk3566芯片会产生明显的温度升高,请确保通风良好,避免过热。如有必要,可以使用散热器或风扇来降低温度。
- 泰山派的包装盒是铁盒,虽然里面有一层海绵,但仍存在导电的可能性,因此千万不要将电路板放在盒子中上电。
- 祝您在开发工作中取得成功!如有其他问题,请随时咨询。
ADB调试工具
《立创泰山派开发板资料\第03章.【立创·泰山派】文档手册\【工具】ADB安装与使用.md》
终端工具
《立创泰山派开发板资料\第03章.【立创·泰山派】文档手册\【工具】调试工具使用.md》
系统测试
镜像烧录
烧入buildroot系统镜像,镜像位于:
烧入方法请参考:镜像烧录教程
上电测试
供电方式
泰山派有两种供电方式分别是通过typec供电与外接电源座供电,注意:虽然我们有保护电路,如果使用typec接电脑的情况下不建议再接外接电源座共同供电,避免意外造成电脑损伤,后果需自行承担。
typec口供电
- 电源适配器:泰山派通常通过typec接口进行供电。推荐供电要求为5V、2.5A的电源保证设备正常运行。
- 电脑供电:泰山派的typec同时具备供电与usb接口功能,例如我们下载代码,adb调试等都是通过此usb进行的,但电脑usb口普遍驱动能力就500mA左右,开发板资源打开多了很容易造成供电不足,如果出现一直自动无法进入系统情况,可以使用电源适配器供电试试。注意如果是需要驱动EDP屏幕则需通过需通过GH1.25电源座+电源小板供电。
外接电源供电
- 外接供电我们通过GH1.25 2P座子与2.54排针引出,连接时需要注意GH1.25或2.54焊盘硬件正负极切勿接反
- 适配器要求:电压:12V ,电流:2A
- 注意:我们的EDP屏幕背光电源是直接来源于GH1.25座,我们提供的edp屏幕背光电压支持范围是7V~21V,同时我们泰山派外接电源转5V的电路是支持5V~18V输入的,所以综合上考虑我们选择了12V进行供电,如果大家使用自己采购的EDP屏幕需按照厂商供电要求就行调整,确保范围在5V~18V与EDP电压范围之内即可。
进入系统
如果硬件正常,给开发板供电上边电源指示灯会亮起,接着USB旁边工作指示灯也会颜色交替闪烁
屏幕会显示立创开发板logo接着开发板正常进入系统
调试连接
我们常用的调试方式有两种方式分别是串口调试与ADB调试,当然adb中我们还可以通过网络进行调试,我们这里只介绍usb这种方式。如果还没安装串口调试终端与ADB请参考下面两篇文章进行安装。
串口终端
- 串口调试前你需要准备一个USB TO TTL工具,比如CH340等。
- rk3566的调试端口UART2_RX_M0与UART2_TX_M0通过GH1.25 4PIN座子与2.54焊盘引出,接线是只需接TX,RX,GND三根线即可,需注意泰山派TX对工具RX,泰山派RX对工具TX。
- 泰山派的调试串口波特率为1500000,8位数据位,1位停止位,无校验位。
- 链接成功狂敲回车,当然你也可以在里面运行linux相关命令。
ADB调试
我们在ADB章节有讲过,虽然adb是为android开发的但我们在buildroot中也可以使用操作步骤如下:
- Typec插入电脑并确保泰山派正常进入系统
- 确保设备管理中能识别到了ADB设备
- 在打开windows运行cmd命令,输入adb shell就可以开始你的调试操作了。
DDR查看
root@RK356X:/# free -m #以MB为单位
total used free shared buff/cache available
Mem: 1972 124 1728 33 119 1789
Swap: 0 0 0
2
3
4
当然也可以使用下面命令看更详细信息
root@RK356X:/# cat /proc/meminfo
MemTotal: 2019808 kB
MemFree: 1770200 kB
MemAvailable: 1833168 kB
Buffers: 4772 kB
Cached: 92788 kB
SwapCached: 0 kB
Active: 56656 kB
Inactive: 61372 kB
Active(anon): 45396 kB
Inactive(anon): 9860 kB
Active(file): 11260 kB
Inactive(file): 51512 kB
Unevictable: 24332 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 8 kB
Writeback: 0 kB
AnonPages: 44844 kB
Mapped: 76664 kB
Shmem: 34780 kB
KReclaimable: 25288 kB
Slab: 47024 kB
SReclaimable: 25288 kB
SUnreclaim: 21736 kB
KernelStack: 2400 kB
PageTables: 1028 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1009904 kB
Committed_AS: 214660 kB
VmallocTotal: 263061440 kB
VmallocUsed: 5500 kB
VmallocChunk: 0 kB
Percpu: 512 kB
CmaTotal: 16384 kB
CmaAllocated: 2112 kB
CmaReleased: 14272 kB
CmaFree: 0 kB
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
- 还有下面命令就非常详细了,这个命令一般是用来排查内存问题的
root@RK356X:/# dumpsys meminfo
- 查看ddr节点
root@RK356X:/# ls /sys/class/devfreq/dmc/
available_frequencies governor polling_interval trans_stat
available_governors load power uevent
cur_freq max_freq subsystem upthreshold
device min_freq system_status userspace
downdifferential name target_freq
2
3
4
5
6
- 查看ddr支持的频率点
root@RK356X:/# cat /sys/class/devfreq/dmc/available_frequencies
324000000 528000000 780000000 1056000000
2
- 查看ddr调度策略
root@RK356X:/# cat /sys/class/devfreq/dmc/available_governors
dmc_ondemand userspace powersave performance simple_ondemand
#策略说明
dmc_ondemand:根据设备的负载情况动态调整频率。
userspace:允许用户手动设置设备频率,用户可以通过修改/sys/class/devfreq/dmc/set_freq文件中的值来调整频率。
powersave:最大限度地降低设备的功耗,减少频率以节省电量。
performance:提供最大的性能,设备会以最高频率运行,以实现最佳的性能表现。
simple_ondemand:是dmc_ondemand策略的简化版本,它根据设备的负载情况自动调整频率,但调整速度较慢。
2
3
4
5
6
7
8
9
10
11
12
13
- 查看ddr当前频率
root@RK356X:/# cat /sys/class/devfreq/dmc/cur_freq
528000000
2
DDR定频
- 把策略改为userspace模式
root@RK356X:/# echo userspace > /sys/class/devfreq/dmc/governor
- 输入你想要调节的频率,但频率只能是available_frequencies中的
root@RK356X:/# echo 1056000000 > /sys/class/devfreq/dmc/userspace/set_freq
- 查看是否生效
root@RK356X:/# cat /sys/class/devfreq/dmc/cur_freq
1056000000
root@RK356X:/# cat /sys/class/devfreq/dmc/load
220@1056000000Hz
2
3
4
5
CPU查看
- 查看cpu节点
root@RK356X:/# ls /sys/devices/system/cpu/cpufreq/policy0/
affected_cpus related_cpus scaling_governor
cpuinfo_cur_freq scaling_available_frequencies scaling_max_freq
cpuinfo_max_freq scaling_available_governors scaling_min_freq
cpuinfo_min_freq scaling_cur_freq scaling_setspeed
cpuinfo_transition_latency scaling_drive
- 查看CPU支持的频点
root@RK356X:/# cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies
408000 600000 816000 1104000 1416000 1608000 1800000
2
3
4
5
6
7
8
9
- 查看cpu运行策略
root@RK356X:/# cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors
conservative ondemand userspace powersave interactive performance
#策略说明
conservative:该策略会根据 CPU 负载情况动态调整频率,但调整速度较慢,以平衡性能和功耗。
ondemand:该策略会根据 CPU 负载情况动态调整频率。在需求高时提高频率以获得更好的性能,在需求低时降低频率以节省功耗。
userspace:该策略允许用户手动设置 CPU 频率,可以通过修改/sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed文件中的值来调整频率。
powersave:该策略旨在最大限度地降低 CPU 功耗,将频率降至最低以节省电量。
interactive:该策略会根据 CPU 负载情况动态调整频率,但调整速度较快,以迅速响应需求并提供平滑的用户体验。
performance:该策略旨在提供最大的性能,将频率提升至最高以实现最佳的计算性能。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 设置cpu定频为定频模式userspace
root@RK356X:/# echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
- 设置cpu频率,这里的值一定是在scaling_available_frequencies中
root@RK356X:/# echo 1800000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed
- 查看cpu频率
root@RK356X:/# cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq
1800000 #和我上面设置的一样表面设置成功
1800000
1800000
1800000
2
3
4
5
- 查看CPU温度 先找到cpu温度对应节点,然后在cat它
root@RK356X:/ # cat /sys/class/thermal/thermal_zone0/type
soc-thermal #对应cpu温度
root@RK356X:/ # cat /sys/class/thermal/thermal_zone1/type
gpu-thermal #对应gpu温度
root@RK356X:/ # cat /sys/class/thermal/thermal_zone2/type
test_battery #对应电池温度
2
3
4
5
6
查看cpu温度,这里的值单位是毫摄氏度,如果需要转成摄氏度需要除以1000即41.875摄氏度
root@RK356X:/ # cat /sys/class/thermal/thermal_zone0/temp
41875
2
GPU查看
- 查看GPU节点
root@RK356X:/# ls /sys/class/devfreq/fde60000.gpu
available_frequencies device max_freq polling_interval target_freq
available_governors governor min_freq power trans_stat
cur_freq load name subsystem uevent
2
3
4
- 查看gpu支持的频点
root@RK356X:/# cat /sys/class/devfreq/fde60000.gpu/available_frequencies
800000000 700000000 600000000 400000000 300000000 200000000
2
- 查看gpu运行策略
root@RK356X:/# cat /sys/class/devfreq/fde60000.gpu/available_governors
dmc_ondemand userspace powersave performance simple_ondemand
#策略说明
dmc_ondemand:该策略会根据 GPU 设备的负载情况动态调整频率。它会在需求高时提高频率,在需求低时降低频率,以平衡性能和功耗。
userspace:该策略允许用户手动设置 GPU 设备的频率。用户可以通过修改/sys/class/devfreq/fde60000.gpu/set_freq文件中的值来调整频率。
powersave:该策略旨在尽量降低 GPU 设备的功耗,将频率降至最低以节省电量。
performance:该策略旨在提供最大的性能,将频率提升至最高以实现最佳的计算性能。
simple_ondemand:该策略类似于 dmc_ondemand 策略,但更加简化,仅提供简单的负载调节,以适应 GPU 设备的性能需求。
2
3
4
5
6
7
8
9
10
11
12
13
- 设置gpu定频为定频模式userspace
root@RK356X:/# echo userspace > /sys/class/devfreq/fde60000.gpu/governor
#查看是否成功
root@RK356X:/# cat /sys/class/devfreq/fde60000.gpu/governor
userspace
2
3
4
- 设置gpu频率,这里的值一定是在available_frequencies中
root@RK356X:/# echo 800000000 > /sys/class/devfreq/fde60000.gpu/userspace/set_freq
- 查看gpu频率
root@RK356X:/# cat /sys/class/devfreq/fde60000.gpu/cur_freq
800000000
2
- 查看gpu的负载情况
root@RK356X:/# cat /sys/class/devfreq/fde60000.gpu/load
0@800000000Hz
2
- 查看gpu温度 先找到gpu温度对应节点,然后在cat它
root@RK356X:/ # cat /sys/class/thermal/thermal_zone0/type
soc-thermal #对应cpu温度
root@RK356X:/ # cat /sys/class/thermal/thermal_zone1/type
gpu-thermal #对应gpu温度
root@RK356X:/ # cat /sys/class/thermal/thermal_zone2/type
test_battery #对应电池温度
2
3
4
5
6
查看cpu温度,这里的值单位是毫摄氏度,如果需要转成摄氏度需要除以1000即41.875摄氏度
root@RK356X:/ # cat /sys/class/thermal/thermal_zone1/temp
41875
2
NPU查看
- 查看GPU节点
root@RK356X:/# ls /sys/class/devfreq/s /sys/class/devfreq/fde40000.npu
available_frequencies governor name target_freq
available_governors load polling_interval trans_stat
cur_freq max_freq power uevent
device min_freq subsystem userspace
2
3
4
5
- 查看gpu支持的频点
root@RK356X:/# cat /sys/class/devfreq/fde40000.npu/available_frequencies
200000000 297000000 400000000 600000000 700000000 800000000 900000000
2
- 查看gpu运行策略
root@RK356X:/# cat /sys/class/devfreq/fde40000.npu/available_governors
dmc_ondemand userspace powersave performance simple_ondemand
#策略说明
dmc_ondemand:该策略会根据 NPU 设备的负载情况动态调整频率。它会在需求高时提高频率,在需求低时降低频率,以平衡性能和功耗。
userspace:该策略允许用户手动设置 NPU 设备的频率。用户可以通过修改/sys/class/devfreq/fde60000.gpu/set_freq文件中的值来调整频率。
powersave:该策略旨在尽量降低 NPU 设备的功耗,将频率降至最低以节省电量。
performance:该策略旨在提供最大的性能,将频率提升至最高以实现最佳的计算性能。
simple_ondemand:该策略类似于 dmc_ondemand 策略,但更加简化,仅提供简单的负载调节,以适应 NPU 设备的性能需求。
2
3
4
5
6
7
8
9
10
11
12
13
- 设置gpu定频为定频模式userspace
root@RK356X:/# echo userspace > /sys/class/devfreq/fde40000.npu/governor
#查看是否成功
root@RK356X:/# cat /sys/class/devfreq/fde60000.gpu/governor
userspace
2
3
4
- 设置gpu频率,这里的值一定是在available_frequencies中
root@RK356X:/# echo 900000000 > /sys/class/devfreq/fde40000.npu/userspace/set_freq
- 查看gpu频率
root@RK356X:/# cat /sys/class/devfreq/fde40000.npu/cur_freq
900000000
2
- 查看gpu的负载情况
root@RK356X:/# cat /sys/class/devfreq/fde40000.npu/load
100@900000000Hz
2
EMMC查看
查看存储空间
root@RK356X:/# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 5.9G 219M 5.4G 4% /
devtmpfs 977M 0 977M 0% /dev
tmpfs 986M 0 986M 0% /dev/shm
tmpfs 986M 860K 985M 1% /tmp
tmpfs 986M 300K 985M 1% /run
/dev/mmcblk0p7 123M 13M 104M 11% /oem
/dev/mmcblk0p8 991M 25K 991M 1% /userdata
2
3
4
5
6
7
8
9
点灯
- 泰山派开发板上有一颗RGB三色灯,在板载右下方,开发板上电一会后开始闪烁,表示系统已经正常运行。
- 原理图中引脚连接,详细可以跳转到我们硬件开源工程,原理图与PCB都已开源
- 通过adb执行命令来控制这三颗灯,先看一下三个灯的节点其中rgb-led-b对应蓝灯,rgb-led-g对应绿灯,rgb-led-r对应红灯
root@RK356X:/# ls /sys/class/leds/
mmc0:: rgb-led-b rgb-led-g rgb-led-r
2
- 进入rgb-led-x可查看相关属性,这里以rgb-led-b为例其他相同
root@RK356X:/# ls /sys/class/leds/rgb-led-b
brightness delay_on max_brightness subsystem uevent
delay_off device power trigger
2
3
brightness
: 这个属性用于控制 LED 的亮度。可以通过读写该文件来设置 LED 的亮度水平。device
: 这个属性表示与 LED 相关的设备路径。invert
: 这个属性表示 LED 的极性翻转。当该值为 0 时,LED 的行为符合正常的预期。当该值为 1 时,LED 的行为与预期相反。max_brightness
: 这个属性表示 LED 可接受的最大亮度值。亮度值在 0 到 max_brightness 之间。power
: 这个属性表示 LED 的电源状态。它可以是 “on” 表示开启,或者 “off” 表示关闭。subsystem
: 这个属性表示该 LED 设备所属的子系统。trigger
: 这个属性表示 LED 的触发器。它定义了 LED 的行为模式,如闪烁、呼吸灯等。你可以通过写入不同的触发器名称来改变 LED 的行为。我这里列出一些常用触发方式:none
: 禁用触发器,LED 保持灭。default-on
: 默认开启触发器,LED 在开机时保持常亮。heartbeat
: 心跳触发器,LED 呼吸灯效果,类似于心跳的闪烁。timer
: 计时器触发器,LED 在特定时间间隔内闪烁。
uevent
: 这个属性包含有关 LED 设备的事件信息。当然你也可以通过cat trigger来查看他支持哪些模式
root@RK356X:/# cat /sys/class/leds/rgb-led-b/trigger
none rfkill-any rfkill-none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altloc
k kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock mmc2 mmc0 [timer] rfkill0 mmc1 rfkill1 rfkill2
2
3
none
: 禁用触发器,LED 保持灭。rfkill-any
: 在任何 RFKill 状态变化时触发,例如 Wi-Fi 或蓝牙开关状态改变。rfkill-none
: 在 RFKill 禁用状态下触发。test_ac-online
: 在电源适配器插入时触发。test_battery-charging-or-full
: 在电池充电或达到充满状态时触发。test_battery-charging
: 在电池充电时触发。test_battery-full
: 在电池达到充满状态时触发。test_battery-charging-blink-full-solid
: 在电池充电时闪烁直到充满,然后保持常亮。test_usb-online
: 在 USB 设备插入时触发。mmc0
,mmc1
,mmc2
: 在对应的 MMC 设备操作时触发。timer
: 根据设定的时间间隔触发。[heartbeat]
: 心跳触发器,LED 呼吸灯效果。backlight
: 背光触发器,通常用于控制显示屏的背光 LED。default-on
: 默认开启触发器,在开机时保持常亮。rfkill0
,rfkill1
,rfkill2
: 在对应的 RFKill 设备状态变化时触发。关闭所有灯
#关闭蓝灯
rk3566_tspi:/ # echo "none" > /sys/class/leds/rgb-led-b/trigger
#关闭绿灯
rk3566_tspi:/ # echo "none" > /sys/class/leds/rgb-led-g/trigger
#关闭红灯
rk3566_tspi:/ # echo "none" > /sys/class/leds/rgb-led-r/trigger
2
3
4
5
6
- 所有灯常亮
#常亮蓝灯
rk3566_tspi:/ # echo "default-on" > /sys/class/leds/rgb-led-b/trigger
#常亮绿灯
rk3566_tspi:/ # echo "default-on" > /sys/class/leds/rgb-led-g/trigger
#常亮红灯
rk3566_tspi:/ # echo "default-on" > /sys/class/leds/rgb-led-r/trigger
2
3
4
5
6
- 心跳
#心跳蓝灯
rk3566_tspi:/ # echo "heartbeat" > /sys/class/leds/rgb-led-b/trigger
#心跳绿灯
rk3566_tspi:/ # echo "heartbeat" > /sys/class/leds/rgb-led-g/trigger
#心跳红灯
rk3566_tspi:/ # echo "heartbeat" > /sys/class/leds/rgb-led-r/trigger
2
3
4
5
6
- 定时闪烁
#定时闪烁蓝灯
rk3566_tspi:/ # echo "timer" > /sys/class/leds/rgb-led-b/trigger
#定时闪烁绿灯
rk3566_tspi:/ # echo "timer" > /sys/class/leds/rgb-led-g/trigger
#定时闪烁红灯
rk3566_tspi:/ # echo "timer" > /sys/class/leds/rgb-led-r/trigger
2
3
4
5
6
感兴趣的自己可以动手试试,比如rfkill-an会在你关闭蓝牙时候被点亮等等。
按键
- 开发板上提供了三个按键,关于这三个按键原理图引脚连接,可跳转到我们硬件开源工程查看。
- PWR为电源按键,全称 TODO
- RST为复位按键全称RESET,按下后系统通过硬件复位,重启开发板,如果按住REC不松口,然后按下复位就能进入到Loader烧写模式。
- REC为升级按键全称RECOVER,RECOVER接入到SARADC_VIN0检测口,支持10位分辨率,可以通过RECOVER 按键,进入Loader 烧写模式
USB HOST
- 泰山派开发板上带有一个USB2.0 HOST接口,可以用于接入,usbhub、鼠标、键盘、U盘等usb从设备。
- 原理图引脚连接,详细可跳转到我们硬件开源工程查看。
- USBHOST接入鼠标测试
系统检测到了一个新的USB鼠标设备,并分配了对应的事件输入设备。 设备的详细信息如下:
- 厂商标识(idVendor):093a
- 产品标识(idProduct):2510
- 产品名称(Product):USB Optical Mouse
- 制造商(Manufacturer):PixArt 鼠标设备已经被正确识别并配置为输入设备,同时可以通过事件输入设备文件进行操作。设备文件路径为
/dev/input/event2
。这会根据系统配置和硬件不同而有所变化,我们可以通过命令ls /dev/input/
来看是否生成了新节点,然后通过命令cat /dev/input/event2
来查看输入设备的事件数据,并监视鼠标的移动和按钮点击等操作
插入前和插入后的节点,可以发现多了一个节点event2
root@RK356X:/# ls /dev/input/
by-path event0 event1 event3
root@RK356X:/# ls /dev/input/
by-id by-path event0 event1 event2 event3
2
3
4
查看是否有数据上报,因为数据不可读所以是乱码
root@RK356X:/# cat /dev/input/event2
y�Y� ����
y�Y@
y�Y@
y�Y@����
y�Y@-
y�Y�p����
y�Y��
y�Y
2
3
4
5
6
7
8
9
WIFI&蓝牙
- 泰山派开发板板载了WIFI+蓝牙二合一模块,这里默认贴的是AP6212
- AP6212模块简介:
- 链接与数据手册:https://item.szlcsc.com/2941698.html
- 802.11b/g/n 单频段无线电
- 集成了 Bluetooth V4.1 的类 1.5 功放和低功耗 (BLE) 支持
- 支持同时运行 Bluetooth 和 WLAN
- 单天线支持同时接收 BT/WLAN 信号
- WLAN 主机接口选项:SDIO v2.0—可达到 50 MHz 的时钟频率
- BT 主机数字接口:UART (最高支持 4 Mbps)
- 内置 IEEE 协同技术
- ECI —增强的协同支持,能够协调 BT SCO 传输以避免与 WLAN 接收冲突
- 开发板硬件原理图,详情查看开源工程,具体分析在后续驱动教程中展开。
- SDMMC1接口对应到模块WIFI功能
- UART1接口对应到模块功能蓝牙
- I2S2接口对应到蓝牙的语言功能,比如连接蓝牙耳机播放音乐
WIFI启动
使用wifi之前需要把天线装上,否则搜索不到任何wifi,装天线先对其然后在按下,温柔一点,别把天线座给扣坏了。
- 通过ifconfig看一下是否有wifi节点,这里对应的是wlan0,如果没有需要确定驱动是否正常
root@RK356X:/# ifconfig
eth0 Link encap:Ethernet HWaddr 26:72:9E:FE:24:65
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:37
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:1072 errors:0 dropped:0 overruns:0 frame:0
TX packets:1072 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:64768 (63.2 KiB) TX bytes:64768 (63.2 KiB)
wlan0 Link encap:Ethernet HWaddr 70:F7:54:CB:3E:31
inet addr:169.254.248.50 Bcast:169.254.255.255 Mask:255.255.0.0
inet6 addr: fe80::299e:7ced:b6d0:505f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:88 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:26392 (25.7 KiB)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 查看是否有wpa_supplicant进程
root@RK356X:/# ps -ef
- 没有发现,所以我需要启动他,启动之前我们需要预先配置以下我们的配置文件
root@RK356X:/# vi /data/cfg/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
update_config=1
network={
ssid="wucaicheng" # Wi-Fi名字
psk="1234567890" # Wi-Fi密码
key_mgmt=WPA-PSK # 加密配置,不加密则改为:key_mgmt=NONE
}
2
3
4
5
6
7
8
9
10
11
- 启动wpa_supplicant进程,后面wpa_cli 会和它进行通讯
root@RK356X:/# wpa_supplicant -B -i wlan0 -c /data/cfg/wpa_supplicant.conf
Successfully initialized wpa_supplicant
2
- 再次查看
root@RK356X:/# ps -ef
root 2006 1 0 13:59 ? 00:00:00 wpa_supplicant -B -i wlan0 -c /d
2
WIFI扫描
wpa_cli 指令跟wpa_supplicant进程通信,所以确保wpa_supplicant进程有运行起来。
扫描
root@RK356X:/# wpa_cli -i wlan0 -p /var/run/wpa_supplicant scan
OK
2
显示扫描结果
root@RK356X:/# wpa_cli -i wlan0 -p /var/run/wpa_supplicant scan_results
bssid / frequency / signal level / flags / ssid
94:14:57:0b:f0:9a 2437 -79 [WPA-EAP-CCMP][WPA2-EAP-CCMP][ESS] Jlc-STAFF
94:14:57:13:f0:9a 2437 -78 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] Jlc_Devices
94:14:57:03:f0:9a 2437 -77 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] jlc_office
94:14:57:23:f0:9a 2437 -80 [ESS] Jlc-Visitor
94:14:57:2b:f0:9a 2437 -76 [ESS] Jlc-Mobile device
42:bf:1d:03:71:48 2412 -45 [WPA2-PSK-CCMP][ESS] wucaicheng
root@RK356X:/#
2
3
4
5
6
7
8
9
- Bssid:无线网络的 bssid(基本服务集标识符)
- Frequency:频率(MHz)
- Signal level:信号强度(dBm)正常情况下:-20到-65;偏弱:-65到-70 差-70到-90,这时就要检查wifi是否距离过远,模组是否有接天线,模组的RF指标是否合格等
- Flags:无线网络的安全和特性标志
- SSID:无线网络的 SSID 名称
wifi连接
方法一:
- 修改配置文件
root@RK356X:/# vi /data/cfg/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
update_config=1
network={
ssid="wucaicheng" # Wi-Fi名字
psk="1234567890" # Wi-Fi密码
key_mgmt=WPA-PSK # 加密配置,不加密则改为:key_mgmt=NONE
}
2
3
4
5
6
7
8
9
10
11
- 让wpa_supplicant进程重新读取上述配置
root@RK356X:/# wpa_cli -i wlan0 -p /var/run/wpa_supplicant reconfigure
OK
2
- 发起连接
root@RK356X:/# wpa_cli -i wlan0 -p /var/run/wpa_supplicant reconnect
OK
2
- 测试
root@RK356X:/# ping lckfb.com
PING hzphdjjz7hjf3bsdzaa4uwdihfykpgam.yundunwaf4.com (47.113.24.127) 56(84) bytes of data.
64 bytes from 47.113.24.127 (47.113.24.127): icmp_seq=1 ttl=38 time=32.2 ms
64 bytes from 47.113.24.127 (47.113.24.127): icmp_seq=2 ttl=38 time=71.5 ms
64 bytes from 47.113.24.127 (47.113.24.127): icmp_seq=3 ttl=38 time=65.3 ms
64 bytes from 47.113.24.127 (47.113.24.127): icmp_seq=4 ttl=38 time=68.1 ms
64 bytes from 47.113.24.127 (47.113.24.127): icmp_seq=5 ttl=38 time=60.8 ms
^C
--- hzphdjjz7hjf3bsdzaa4uwdihfykpgam.yundunwaf4.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 32.222/59.591/71.536/14.131 ms
2
3
4
5
6
7
8
9
10
11
方法二:
最新sdk集成wifi_start.sh脚本,可以在脚本后面直接跟wifi名字和密码就能实现连接wifi
root@RK356X:/# wifi_start.sh wucaicheng 1234567890
connect to WiFi ssid: wucaicheng, Passwd: 1234567890
Successfully initialized wpa_supplicant
2
3
bt启动
root@RK356X:/# ./usr/bin/bt_pcba_test
killall: brcm_patchram_plus1: no process killed
###AMPAK FW Auto detection patch version = [v1.1 20161117]###
Can't get device info: No such device
root@RK356X:/# cp: cannot stat '/data/cfg/device_info.txt': No such file or directory
FW folder path = /system/etc/firmware
proc_resetchip id = BCM43430A1
FW path = /system/etc/firmware/BCM43430A1.hcd
send hci_download_minidriverproc_resetDone setting line discpline
2
3
4
5
6
7
8
9
可以通过-h查看常用的命令,比如up、down等
root@RK356X:/# hciconfig -h
hciconfig - HCI device configuration utility
Usage:
hciconfig
hciconfig [-a] hciX [command ...]
Commands:
up Open and initialize HCI device
down Close HCI device
reset Reset HCI device
rstat Reset statistic counters
auth Enable Authentication
noauth Disable Authentication
encrypt Enable Encryption
noencrypt Disable Encryption
piscan Enable Page and Inquiry scan
noscan Disable scan
iscan Enable Inquiry scan
pscan Enable Page scan
ptype [type] Get/Set default packet type
lm [mode] Get/Set default link mode
lp [policy] Get/Set default link policy
name [name] Get/Set local name
class [class] Get/Set class of device
voice [voice] Get/Set voice setting
iac [iac] Get/Set inquiry access code
inqtpl [level] Get/Set inquiry transmit power level
inqmode [mode] Get/Set inquiry mode
inqdata [data] Get/Set inquiry data
inqtype [type] Get/Set inquiry scan type
inqparms [win:int] Get/Set inquiry scan window and interval
pageparms [win:int] Get/Set page scan window and interval
pageto [to] Get/Set page timeout
afhmode [mode] Get/Set AFH mode
sspmode [mode] Get/Set Simple Pairing Mode
aclmtu <mtu:pkt> Set ACL MTU and number of packets
scomtu <mtu:pkt> Set SCO MTU and number of packets
delkey <bdaddr> Delete link key from the device
oobdata Get local OOB data
commands Display supported commands
features Display device features
version Display version information
revision Display revision information
block <bdaddr> Add a device to the blacklist
unblock <bdaddr> Remove a device from the blacklist
lerandaddr <bdaddr> Set LE Random Address
leadv [type] Enable LE advertising
0 - Connectable undirected advertising (default)
3 - Non connectable undirected advertising
noleadv Disable LE advertising
lestates Display the supported LE states
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
开启蓝牙设备
root@RK356X:/# hciconfig hci0 up
查看当前系统中全部的蓝牙设备信息
root@RK356X:/# hciconfig -a
正常的情况下可以看到:
扫描蓝牙
root@RK356X:/# hcitool scan
扫描结果
HDMI屏幕
- 泰山派开发板板载了Micro HDMI接口,可用于连接HDMI显示屏。
- 为了美观以及充分利用空间,泰山派使用的是Micro HDMI接口,如果你的显示屏使用的是标准HDMI线则需要用一个Micro HDMi转HDMI的座子,当然你也可以换一跟Micro HDMI的线。
- 实物连接方式参考
- 要想HDMI有视频信号输出需要下载使用HDMI输出的固件估计位置《立创泰山派开发板资料\第06章.【立创·泰山派】系统镜像\【镜像】Buildroot\hdmi_20230915_update.img》
- 固件与连接都正常等一切正常,上电以后开发板就能够通过hdmi来显示画面
- 使用adb查看HDMI状态,Connector: HDMI-A-1表示HDMI正常,如果cat没有发现HDMI说明HDMI外设接入失败,问题可能出现在驱动,屏幕连接等,烧入固件不对等。
root@RK356X:/# cat /sys/kernel/debug/dri/0/summary
Video Port0: ACTIVE
Connector: HDMI-A-1
bus_format[100a]: RGB888_1X24
overlay_mode[0] output_mode[f] color_space[0]
Display mode: 1920x1080p60
clk[148500] real_clk[148500] type[48] flag[5]
H: 1920 2008 2052 2200
V: 1080 1084 1089 1125
Smart0-win0: ACTIVE
win_id: 0
format: XR24 little-endian (0x34325258) SDR[0] color_space[0] glb_alpha[0xff]
rotate: xmirror: 0 ymirror: 0 rotate_90: 0 rotate_270: 0
csc: y2r[0] r2y[0] csc mode[0]
zpos: 0
src: pos[0, 0] rect[1920 x 1080]
dst: pos[0, 0] rect[1920 x 1080]
buf[0]: addr: 0x00000000007f1000 pitch: 7680 offset: 0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
EDP屏幕
泰山派开发板板载了EDP接口,位于板载顶部位置,通过30PIN 0.5间距下接FPC引出,可用于连接EDP显示屏。现大多数笔记本电脑都是用的这种接口。
硬件连接:
- 下列图为我们edp屏幕引脚定义(详细看开源工程),这种30PIN引脚定义在行业里算是比较通用的,也就是说你掌握泰山派开发(调屏参)以后,可以根据此引脚定义直接在淘宝或者闲鱼上买到你自己钟意的屏幕回来点亮,当然你也可以联系到我们进行调试,前期大家可以基于我们验证好的屏幕进行测试。
- 原理图中26、27、28、29为背光引脚,接入到VCC12V_DCIN中,所以想要点EDP需要外加电源。还需注意因我们的EDP屏幕背光电源是直接来源于GH1.25座,我们提供的edp屏幕背光电压支持范围是7V~21V,同时我们泰山派外加电源转5V的电路也是支持5V~18V输入的所以综合上述考虑我们选择了12V进行供电,如果大家使用自己采购的EDP屏幕需按照厂商供电要求就行调整,当心烧屏。
- 实物连接方式这里以我们提供的屏幕为例,其他屏幕自行确定线序,先翻开FPC把排线金手指面朝下因为我们FPC是下接的,接着插入明显有顶到的感觉扣下FPC盖即可,如下图所示。
11.6寸1366*768屏幕
- 屏幕测试前需要烧录11.6寸屏幕固件:
- 接入屏幕后,使用12V外接供电就能正常点亮屏幕,如下图:
- 使用adb查看edp屏幕状态
root@RK356X:/# cat /sys/kernel/debug/dri/0/summary
Video Port0: ACTIVE
Connector: eDP-1
bus_format[100a]: RGB888_1X24
overlay_mode[0] output_mode[f] color_space[0]
Display mode: 1366x768p61
clk[72300] real_clk[72300] type[48] flag[a]
H: 1366 1516 1521 1526
V: 768 771 772 781
Smart0-win0: ACTIVE
win_id: 0
format: XR24 little-endian (0x34325258) SDR[0] color_space[0] glb_alpha[0xff]
rotate: xmirror: 0 ymirror: 0 rotate_90: 0 rotate_270: 0
csc: y2r[0] r2y[0] csc mode[0]
zpos: 0
src: pos[0, 0] rect[1366 x 768]
dst: pos[0, 0] rect[1366 x 768]
buf[0]: addr: 0x0000000000811000 pitch: 5504 offset:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 使用ADB命令设置背光echo "0-255" > /sys/class/backlight/backlight/brightness
root@RK356X:/# echo "16" > /sys/class/backlight/backlight/brightness
MIPI屏幕
泰山派开发板板载了mipi dsi显示接口,位于板载背部位置,通过31PIN 0.3间距下接FPC接口引出,可用于连接MIPI显示屏。现大多数手机平板灯都是用的这种接口。
硬件连接:
- 下列图为我们mipi屏幕引脚定义(详细看开源工程),这种31PIN引脚定义在行业里算是比较通用的,也就是说你掌握泰山派开发(调屏参)以后,可以根据此引脚定义直接在淘宝或者闲鱼上买到你自己钟意的屏幕回来点亮,当然你也可以联系到我们进行调试,前期大家可以基于我们验证好的屏幕进行测试。
- 实物连接方式这里以我们提供的屏幕为例,其他屏幕自行确定线序,先翻开FPC把排线金手指面朝下因为我们FPC是下接的,接着插入明显有顶到的感觉扣下FPC盖即可,如下图所示。
10.1寸800*1280屏幕
- 使用adb查看mipi屏幕状态
root@RK356X:/# cat /sys/kernel/debug/dri/0/summary
Video Port1: ACTIVE
Connector: DSI-1
bus_format[100a]: RGB888_1X24
overlay_mode[0] output_mode[0] color_space[0]
Display mode: 800x1280p59
clk[66000] real_clk[66000] type[48] flag[a]
H: 800 818 830 848
V: 1280 1304 1308 1320
Cluster0-win0: ACTIVE
win_id: 4
format: AB24 little-endian (0x34324241)[AFBC] SDR[0] color_space[0] glb_alpha[0xff]
rotate: xmirror: 0 ymirror: 0 rotate_90: 0 rotate_270: 0
csc: y2r[0] r2y[0] csc mode[0]
zpos: 0
src: pos[0, 0] rect[800 x 1280]
dst: pos[0, 0] rect[800 x 1280]
buf[0]: addr: 0x00000000003e8000 pitch: 3200 offset: 0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 使用ADB命令设置背光echo "0-255" > /sys/class/backlight/backlight/brightness
root@RK356X:/ # echo "16" > /sys/class/backlight/backlight/brightness
音频接口
泰山派开发板通过4PIN的GH1.25座子与2. 54焊盘引出了咪头与扬声器接口。如下图:左边为正面GH1.25座,背面为2.54焊盘。
硬件连接:
- 下图为音频部分的硬件连接原理图(详情看开源工程),主要由RK809实现,RK809集成扬声器和耳机与I2S接口功能,其中扬声器高效率的立体声Class-D类型放大器,能够从5V电源为8欧姆的BTL负载输出1.3W的功率。它还集成了过流保护功能。说人话就是功率小听个响,要高质量音质的话使用扩展板在配个好的功放。
- 下图为GH1.25 4PIN座子原理图,座子1脚MIC1P接到咪头正极,2脚接到咪头GND,3脚与4脚接到喇叭
- 为了方便大家调试,我们还引出了2.54间距焊盘,原理图定义如下,对应到上图板载背面的焊盘上
音频扩展模块使用
- 调试前需注意:
- 调试前需要烧录我们提供的
buildroot
/ubuntu
/debian
系统固件。
- 调试前需要烧录我们提供的
如果在使用HDMI屏幕固件出现GH1.25外置音频接口无法使用情况请拔掉HDMI测试,因为原有系统音频输出方案是插入HDMI后音频不走外置功放,通过HDMI输出,我这里在系统中做了修改使音频同时输出到HDMI与外置功放。
如果你接上了我们的多媒体扩展板,请确保耳机接口没有插入,在系统右上角看耳机图标判断,插入耳机后音频型号不会走外置路线。
开发板与扩展板的连接方式如下图:
录音测试
#录音命令,ctrl+C停止:
root@RK356X:/# arecord -c 1 -r 44100 -f S16_LE /tmp/record.wav
Recording WAVE '/tmp/record.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
^CAborted by signal Interrupt...
#使用arecord工具进行录音,并保存为一个名为record.wav的文件。下面是对命令中每个选项的解释:
#-c 1:单声道录制。
#-r 44100:表示采样率,即音频每秒的采样点数量。这里使用 44100 表示每秒采样 44100 个点,这是 CD 质量音频的标准采样率。
#-f S16_LE:表示音频采样格式,这里使用 S16_LE 表示采样点以 16 位有符号的 little-endian 格式存储。
#/tmp/record.wav:表示录音文件的保存路径和名称
2
3
4
5
6
7
8
9
喇叭放音测试
#播放刚刚录制的音频,ctrl+c停止播放或者等待播放结束
root@RK356X:/# aplay /tmp/record.wav
2
双屏同显示
HDMI与EDP同显
HDMI与MIPI同显
EDP与MIPI同显
摄像头
泰山派开发板板载了一个MIPI CSI摄像头接口,可用于驱动同类型接口MIPI摄像头,位于开发板背面如下图:
硬件连接
- 下图为MIPI CSI部分的硬件连接原理图(详情看开源工程),相关供电电路我们已经在开发板上集成了并且我们这里的30PIN引脚是收集了大多数厂商的一个定义,你可以直接在淘宝或者其他平台直接购买线序相同的摄像头进行适配,无需绑定扩展板。
- 实物连接图
- 下面以我们测试过的摄像头进行举例,如果你想驱动其他摄像头需注意排线线序,并且适配相关驱动代码,当然也可以联系我们进行调试。
OV5695测试
注意:此摄像头型号我们也只是采购回来调通,不对此其本身进行相关售后问题。
- 基本参数:
- 型号:OV5695
- 像素:500万
- 接口:MIPI接口30P 0.5间距FPC
测试
采集视频并显示在屏幕上注意为了确保真确显示请不要使用双屏固件,使用单mipi或者单edp固件进行测试
root@RK356X:/# gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! kmssink
Setting pipeline to PAUSED ...
Using mplane plugin for capture
Pipeline is live and does not need PREROLL ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Redistribute latency...
0:01:34.3 / 99:99:99.
2
3
4
5
6
7
8
9
10
参数解析:
v4l2src
元素用于从视频设备/dev/video0
中获取视频数据。video/x-raw
指定视频数据的原始格式,这里使用NV12
格式,它是一种常见的 YUV 格式。width=1920
和height=1080
设置视频的宽度和高度为 1920x1080 像素。framerate=30/1
设置视频的帧率为 30 帧每秒。kmssink
元素用于将视频显示到 DRM 设备上。 下面就是摄像头采集并在edp屏上显示的效果:
MicroSD卡
泰山派开发板背面板载了一个MicroSD(TF)卡座,可以用于文件的存储或者系统盘制作,我们下面主要是介绍文件存储功能,因为我们系统默认是下载到EMMC中,使用TF卡引导系统请参考烧录文档。
硬件连接
下图为MicorSD部分的硬件连接原理图(详情看开源工程)
使用方法
- 将MicroSD卡的金属接口朝下(PCB的一面)插入插槽中。确保插卡时与插槽对齐。
- 轻轻按压MicroSD卡,直到卡片完全插入插槽。
- 插入卡后,卡座是带锁的,所以插入后会听到咔嚓一声表明表明将其锁定在插入状态,插入完成。
4.正确插入tf卡以后会有日志输出
5.拔出tf卡也同样会有日志输出
测试
- 当插入了tf以后,我们可以在终端中,通过以下命令查看插入的 TF 卡的设备名称:
root@RK356X:/# dmesg | grep mmc
[ 6057.688498] mmc_host mmc1: Bus speed (slot 0) = 375000Hz (slot req 400000Hz, actual 375000HZ div = 0)
[ 6057.924089] mmc_host mmc1: Bus speed (slot 0) = 50000000Hz (slot req 50000000Hz, actual 50000000HZ div = 0)
[ 6057.924289] mmc1: new high speed SDHC card at address 59b4
[ 6057.928290] mmcblk1: mmc1:59b4 SMI 948 MiB
[ 6057.931342] mmcblk1: p1
2
3
4
5
6
这表明 TF 卡被识别为 /dev/mmcblk1
- 创建一个目录,用于挂载 TF 卡
root@RK356X:/# mkdir /media/sdcard
- 使用以下命令将 TF 卡挂载到指定的目录
root@RK356X:/# mount /dev/mmcblk1p1 /media/sdcard
注意,如果您的 TF 卡有多个分区,可以使用不同的分区号(如 /dev/mmcblk1p2、/dev/mmcblk1p3 等)来进行挂载。
- 现在就可以通过 /media/sdcard 路径来访问和操作挂载的 TF 卡,如我这里创建了一个名字为www.lckfb.com的目录
root@RK356X:/media/sdcard# mkdir www.lckfb.com
root@RK356X:/media/sdcard# ls
www.lckfb.com
root@RK356X:/media/sdcard#
2
3
4
- 写入测试
root@RK356X:/media/sdcard# dd if=/dev/zero of=/media/sdcard/testtf.txt bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.481621 s, 218 MB/s
root@RK356X:/media/sdcard# ls
testtf.txt www.lckfb.com
2
3
4
5
6
- 清缓存
root@RK356X:/media/sdcard# echo 3 > /proc/sys/vm/drop_caches
- 读测试
root@RK356X:/# dd if=/media/sdcard/testtf.txt of=/dev/null bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.142593 s, 735 MB/s
2
3
4
- 卸载
root@RK356X:/# umount /media/sdcard
4G模块
- 因为大多数4G模块都是mini PCIE接口,但是连接的其实是USB,所以我们只需要使用一个mini pcie转usb的转接板,然后插入泰山派的usb口即可实现4G上网,如果大家觉得插入USB这种方式不优雅,后面扩展板中我们还会去介绍如如何使用扩展板上的4G模块实现上网功能。
- mipiPCIE购买链接:,注意:我们也是采购回来调试通过,并不负责其相应售后等任何问题。
- 下图为插入4G模块与SIM卡的样子,注意4G模块还需根据实际情况接入天线,比如有些模块带有GPS的话需要插入两根天线。而且天线也不能乱插需要与之匹配。
硬件连接
- 因为我们板载上只有一个usb口所以想接4G模块需要外加一个usb hub或者使用我们的泰山派多媒体扩展板,4G模块转接板以及鼠标灯在插入到HUB上
EC20
- 购买链接:点击跳转🚀,注意:我们也是采购回来调试通过,并不负责其相应售后等任何问题。
RTC
泰山派开发板背面通过2.54焊盘引出了RK809内部集成的RTC模块:
硬件连接
测试RTC需要一颗纽扣电池并确保纽扣电池电量充足(用万用表测电压在3V左右),泰山派布局空间不足为了美观所以我们舍弃了纽扣电池座,如果用到RTC需要通过烙铁把电池的黑线负极焊接到GND焊盘上,红线焊接到RTC焊盘上。
电池链接:https://item.szlcsc.com/5782992.html
RTC测试
buildroot系统中的时钟可以分为两种,一个是System time(buildroot系统时钟)另一个是hardware clock(硬件时钟)。
- 设置系统时钟
root@RK356X:/# date -s "2023-09-022 22:22:33"
Fri Sep 22 22:22:33 UTC 2023
2
- 查看当前buildroot系统时钟
root@RK356X:/# date
Fri Sep 22 22:23:06 UTC 2023
2
- 查看rk809 RTC的硬件时,可以发现系统时钟和硬件时钟是不同的
root@RK356X:/# hwclock -f /dev/rtc0
Fri Aug 4 12:43:03 2017 0.000000 seconds
2
- 将系统时间写入到rk809 RTC
root@RK356X:/# hwclock -f /dev/rtc0 -w
- 在查看rk809 RTC硬件时间发现已经与系统时间一样了
root@RK356X:/# hwclock -f /dev/rtc0
Fri Sep 22 22:24:51 2023 0.000000 seconds
2
40PIN排针接口
泰山派开发板板载了一个40PIN 2.54间距的贴片排针,排针的引脚定义兼容树莓派,如下图:
引脚定义
- 泰山派开发板40PIN引脚原理图 详细请查看开源硬件(点击跳转🚀)
- 泰山派开发板40PIN引脚默认功能定义图,这个定义顺序是为了兼容树莓派,默认固件中的40PINGPIO驱动也是按照这个图来进行分配的:
- 为了支持更多的一个功能,更好的满足大家的项目使用情况,除了上面说到的兼容树莓派引脚复用定义以外,泰山派开发板40PIN引脚还支持更多的一个复用功能,比如:串口、PWM、音频等。但需要自己写驱动,也可以联系我们进行适配。
默认定义接口测试
接下来就基于默认IO定义进行40PIN GPIO的功能测试,开始前你需要烧录buildroot/ubuntu/debian系统固件:
GPIO测试
泰山派开发板40PIN排针上面除12个电源引脚以外还有28个IO口引脚,这28个IO口引脚都可以作为普通GPIO进行输入输出,但是这里面有些IO已经在驱动中默认配置了复用功能,所以只剩下面标红的14个IO口能够用于GPIO输出输出测试。
硬件连接
这里以GPIO0_B7来进行举例说明其他的IO类似
- 使用逻辑分析仪或者万用表来检测GPIO口的高低电平输出 暂时无法在飞书文档外展示此内容
- 使用两个杜邦线串联一个10K电阻,一端口接到GPIO0_B7,然后通过另一端插入GND或3V3来模拟高低电平输入(注意此操作中的电阻不能省,以及不要接到5V上去了,以免烧坏GPIO口) 暂时无法在飞书文档外展示此内容
GPIO命名规则与引脚ID计算
接下来我们在adb中使用sysfs来控制GPIO0_B7进行输入输出测试,在使用sysfs前我们需要先了解k3566的gpio命名规则,因为sysfs中传参需要用到引脚ID,就以为我们现在所使用的GPIO0_B7为例,我们可以把它拆分成3个部分如下:
- 控制器(bank):rk3566有5个GPIO控制器分别是GPIO0-GPIO4,一个控制器下面包含ABCD个端口,每个端口下有包含0-7个索引序号,所以一个控制器可控制32个IO引脚。
- 端口(port):A、B、C、D。对应着数字:0-3所以A=0、B=1、C=2、D=3 - 索引序号(pin):固定为0-7共计8个数 代入 GPIO0_B7 ,该引脚的 ID 可以按照以下规则组成:
- 控制器 (bank) 为 0,表示第 0 组控制器。
- 端口(port)为 B,表示端口号为1。- 索引序号(pin)为7。 根据计算公式:32 x 0 + 1 x 8 + 7 = 15,可以得到引脚ID为15。
GPIO输出测试
#使用root权限
rk3566_tspi:/ # su
#将引脚号 15 导出为 GPIO 引脚,使其可以被访问和控制。
rk3566_tspi:/ # echo 15 > /sys/class/gpio/export
#将引脚号 15 的方向设置为输出模式,即设置为输出引脚。
rk3566_tspi:/ # echo out > /sys/class/gpio/gpio15/direction
#将引脚号 15 的值设置为 1,即将引脚设置为高电平。
rk3566_tspi:/ # echo 1 > /sys/class/gpio/gpio15/value
#将引脚号 15 的值设置为 0,即将引脚置设置为低电平。
rk3566_tspi:/ # echo 0 > /sys/class/gpio/gpio15/value
#将引脚号 15 解除导出,即取消对引脚号 15 的 GPIO 控制权。
rk3566_tspi:/ # echo 15> /sys/class/gpio/unexport
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
下面演示使用sysfs来控制GPIO0_B7输出高低电平,在逻辑分析仪中捕获到电平的变化
GPIO输入测试
#使用root权限
rk3566_tspi:/ # su
#将引脚号 15 导出为 GPIO 引脚,使其可以被访问和控制。
rk3566_tspi:/ # echo 15 > /sys/class/gpio/export
#将引脚号 15 的方向设置为输入模式,即设置为输入引脚。
rk3566_tspi:/ # echo in > /sys/class/gpio/gpio15/direction
#读引脚的值,结果为1或0,更具引脚实际电平决定。
rk3566_tspi:/ # cat /sys/class/gpio/gpio15/value
#将引脚号 15 解除导出,即取消对引脚号 15 的 GPIO 控制权。
rk3566_tspi:/ # echo 15> /sys/class/gpio/unexport
2
3
4
5
6
7
8
9
10
11
12
13
14
下面演示使用sysfs来控制GPIO0_B7进行高低电平输入检测
注意:
如果io口以及在设备驱动中被复用那么export就会失败无法发现gpiox
串口测试
用户GPIO中其实很多IO口可以复用成串口功能(可查看复用定义表),但是我们这里按照默认定义所以只对8脚、9脚进行复用测试,引脚定义入下图:
硬件连接
测试串口我们需要一个串口调试工具,我这里以最常用的CH340为例。通过上面的引脚定义中我们可以知道用户GPIO中的8、9脚对应UART3,这里我们通过杜邦线把UART3_TX_M1连接到CH340的RXD引脚,UART3_RX_M1连接到CH340的TXD引脚,并且进行共地,连接示意图如下所示:
CH340插入电脑以后设备管理器多出一个串行设备
打开串口调试工具electerm,设置端口为COM34,波特率9600,其他默认
ADB中找到串口对应节点,这里的UART3对应的就是ttyS3
rk3566_tspi:/ # ls /dev/
__properties__ fscklogs kmsg rga usb-ffs
ashmem full kmsg_debug rtc0 usb_accessory
ashmeme02e9dfb-e7c9-4b5a-93ea-453a4d62e115 fuse loop-control snd v4l-subdev0
binder gpiochip0 mali0 socket v4l-subdev1
binderfs gpiochip1 media0 spi_misc_test v4l-subdev2
blkio gpiochip2 memcg stderr vendor_storage
block gpiochip3 memory_bandwidth stdin video0
boringssl gpiochip4 mmcblk2rpmb stdout video1
bus gpiochip5 mpp_service stune video2
cgroup_info graphics net sw_sync video3
console hw_random network_latency tee0 video4
cpu_dma_latency hwbinder network_throughput teepriv0 video5
cpu_variant:arm i2c-0 null tty video6
cpu_variant:arm64 i2c-2 opteearmtz00 ttyFIQ0 video7
cpuctl i2c-3 pmsg0 ttyS1 video8
cpuset i2c-4 ppp ttyS3 vndbinder
device-mapper i2c-6 ptmx tun watchdog
dri iio:device0 pts uhid watchdog0
event-log-tags input random uinput zero
fd ion rfkill urandom
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
开始测试前需要设置ttyS3的串口参数,这里要与串口工具设置一致才能进行通讯,否则会出现乱码或者无法显示等异常情况
stty -F /dev/ttyS3 <波特率> cs<数据位> <奇偶校验> <停止位> <流控制>
<波特率>常用的有9600、115200等。
<数据位>数据位数,常见的取值为5、6、7、8,基本上默认都是8位。
<奇偶校验>为奇偶校验类型,可选值为-parity(无校验)、even(偶校验)和odd(奇校验)。
<停止位>为要设置的停止位数,常见的取值为cstopb=1、-cstopb=2,基本上默认值为cstopb。
<流控制位>crtscts:启用RTS/CTS硬件流控制。-crtscts:禁用RTS/CTS硬件流控制。
2
3
4
5
6
设置ttyS3串口参数,其他都保持默认,只要设置波特率就行
rk3566_tspi:/ # stty -F /dev/ttyS3 9600
发送数据测试,把"lckfb-tspi"发送到ttyS3
rk3566_tspi:/ # echo "lckfb-tspi" > /dev/ttyS3
终端中正常显示我们发送的内容
接收数据测试,adb中cat ttyS3等待接收数据
rk3566_tspi:/ # cat /dev/ttyS3
在串口控制台中输入任意字符,我这里输入"abcdefg1234567"然后回车发送
此时我们开发板中已经正确收到了刚刚发送的数据
演示:
红外遥控器测试
用户GPIO的32引脚可以用来做红外遥控接收如下图所示:
做此实验我们需要一个遥控器和一个红外接收头。 红外遥控器购买地址:,我们也只是采购回来测试不对其进行售后以及技术支持。
红外接收头IRM-56384购买地址:https://item.szlcsc.com/73157.html
硬件连接
用杜邦线把IRM-56384接到用户GPIO,连接示意图如下请勿接反或者接错:
测试
红外遥控器按键说明,当然这些按键值也不是绝对的后面驱动教程中我们在来掌握如何修改按键值。
在系统中进行遥控测试,注意遥控的时候遥控器需要对准红外接收头凸起面,
接着进入adb当然你也可以通过串口调试
C:\Users\jlc>adb shell
通过evtest来查看事件,我们接收头对应的是fe700030.pwm的event0,所以Select the device event number [0-6]: 0
root@RK356X:/# evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: fe700030.pwm
/dev/input/event1: rk805 pwrkey
/dev/input/event2: adc-keys
/dev/input/event3: SEM USB Keyboard
/dev/input/event4: SEM USB Keyboard Consumer Control
/dev/input/event5: SEM USB Keyboard System Control
/dev/input/event6: USB OPTICAL MOUSE
Select the device event number [0-6]: 0
2
3
4
5
6
7
8
9
10
11
选择完成后按回车中断就会打印正在测试 “fe700030.pwm” 输入设备,支持的事件并等待输入,此时我们可以通过按下遥控器按钮来出发相应事件上报,如下:我一次按下了1-9和所有按键
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x524b product 0x6 version 0x100
Input device name: "fe700030.pwm"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 2 (KEY_1)
Event code 3 (KEY_2)
Event code 4 (KEY_3)
Event code 5 (KEY_4)
Event code 6 (KEY_5)
Event code 7 (KEY_6)
Event code 8 (KEY_7)
Event code 9 (KEY_8)
Event code 10 (KEY_9)
Event code 11 (KEY_0)
Event code 28 (KEY_ENTER)
Event code 103 (KEY_UP)
Event code 105 (KEY_LEFT)
Event code 106 (KEY_RIGHT)
Event code 108 (KEY_DOWN)
Event code 139 (KEY_MENU)
Event code 143 (KEY_WAKEUP)
Event code 158 (KEY_BACK)
Properties:
Testing ... (interrupt to exit)
Event: time 1501837310.364775, type 1 (EV_KEY), code 2 (KEY_1), value 1
Event: time 1501837310.364775, -------------- SYN_REPORT ------------
Event: time 1501837310.452543, type 1 (EV_KEY), code 2 (KEY_1), value 0
Event: time 1501837310.452543, -------------- SYN_REPORT ------------
Event: time 1501837311.467120, type 1 (EV_KEY), code 3 (KEY_2), value 1
Event: time 1501837311.467120, -------------- SYN_REPORT ------------
Event: time 1501837311.555874, type 1 (EV_KEY), code 3 (KEY_2), value 0
Event: time 1501837311.555874, -------------- SYN_REPORT ------------
Event: time 1501837312.385465, type 1 (EV_KEY), code 4 (KEY_3), value 1
Event: time 1501837312.385465, -------------- SYN_REPORT ------------
Event: time 1501837312.472543, type 1 (EV_KEY), code 4 (KEY_3), value 0
Event: time 1501837312.472543, -------------- SYN_REPORT ------------
Event: time 1501837313.361106, type 1 (EV_KEY), code 5 (KEY_4), value 1
Event: time 1501837313.361106, -------------- SYN_REPORT ------------
Event: time 1501837313.449207, type 1 (EV_KEY), code 5 (KEY_4), value 0
Event: time 1501837313.449207, -------------- SYN_REPORT ------------
Event: time 1501837314.189838, type 1 (EV_KEY), code 6 (KEY_5), value 1
Event: time 1501837314.189838, -------------- SYN_REPORT ------------
Event: time 1501837314.279211, type 1 (EV_KEY), code 6 (KEY_5), value 0
Event: time 1501837314.279211, -------------- SYN_REPORT ------------
Event: time 1501837315.092537, type 1 (EV_KEY), code 7 (KEY_6), value 1
Event: time 1501837315.092537, -------------- SYN_REPORT ------------
Event: time 1501837315.179209, type 1 (EV_KEY), code 7 (KEY_6), value 0
Event: time 1501837315.179209, -------------- SYN_REPORT ------------
Event: time 1501837316.033009, type 1 (EV_KEY), code 8 (KEY_7), value 1
Event: time 1501837316.033009, -------------- SYN_REPORT ------------
Event: time 1501837316.215876, type 1 (EV_KEY), code 8 (KEY_7), value 0
Event: time 1501837316.215876, -------------- SYN_REPORT ------------
Event: time 1501837316.618831, type 1 (EV_KEY), code 9 (KEY_8), value 1
Event: time 1501837316.618831, -------------- SYN_REPORT ------------
Event: time 1501837316.705897, type 1 (EV_KEY), code 9 (KEY_8), value 0
Event: time 1501837316.705897, -------------- SYN_REPORT ------------
Event: time 1501837317.125009, type 1 (EV_KEY), code 10 (KEY_9), value 1
Event: time 1501837317.125009, -------------- SYN_REPORT ------------
Event: time 1501837317.415869, type 1 (EV_KEY), code 10 (KEY_9), value 0
Event: time 1501837317.415869, -------------- SYN_REPORT ------------
Event: time 1501837318.266577, type 1 (EV_KEY), code 158 (KEY_BACK), value 1
Event: time 1501837318.266577, -------------- SYN_REPORT ------------
Event: time 1501837318.355877, type 1 (EV_KEY), code 158 (KEY_BACK), value 0
Event: time 1501837318.355877, -------------- SYN_REPORT ------------
Event: time 1501837319.090688, type 1 (EV_KEY), code 158 (KEY_BACK), value 1
Event: time 1501837319.090688, -------------- SYN_REPORT ------------
Event: time 1501837319.179209, type 1 (EV_KEY), code 158 (KEY_BACK), value 0
Event: time 1501837319.179209, -------------- SYN_REPORT ------------
Event: time 1501837319.699848, type 1 (EV_KEY), code 11 (KEY_0), value 1
Event: time 1501837319.699848, -------------- SYN_REPORT ------------
Event: time 1501837319.789204, type 1 (EV_KEY), code 11 (KEY_0), value 0
Event: time 1501837319.789204, -------------- SYN_REPORT ------------
Event: time 1501837320.142705, type 1 (EV_KEY), code 139 (KEY_MENU), value 1
Event: time 1501837320.142705, -------------- SYN_REPORT ------------
Event: time 1501837320.229168, type 1 (EV_KEY), code 139 (KEY_MENU), value 0
Event: time 1501837320.229168, -------------- SYN_REPORT ------------
Event: time 1501837321.620284, type 1 (EV_KEY), code 105 (KEY_LEFT), value 1
Event: time 1501837321.620284, -------------- SYN_REPORT ------------
Event: time 1501837321.709208, type 1 (EV_KEY), code 105 (KEY_LEFT), value 0
Event: time 1501837321.709208, -------------- SYN_REPORT ------------
Event: time 1501837322.118815, type 1 (EV_KEY), code 103 (KEY_UP), value 1
Event: time 1501837322.118815, -------------- SYN_REPORT ------------
Event: time 1501837322.205869, type 1 (EV_KEY), code 103 (KEY_UP), value 0
Event: time 1501837322.205869, -------------- SYN_REPORT ------------
Event: time 1501837322.636656, type 1 (EV_KEY), code 106 (KEY_RIGHT), value 1
Event: time 1501837322.636656, -------------- SYN_REPORT ------------
Event: time 1501837322.819202, type 1 (EV_KEY), code 106 (KEY_RIGHT), value 0
Event: time 1501837322.819202, -------------- SYN_REPORT ------------
Event: time 1501837323.318256, type 1 (EV_KEY), code 108 (KEY_DOWN), value 1
Event: time 1501837323.318256, -------------- SYN_REPORT ------------
Event: time 1501837323.405873, type 1 (EV_KEY), code 108 (KEY_DOWN), value 0
Event: time 1501837323.405873, -------------- SYN_REPORT ------------
Event: time 1501837323.817954, type 1 (EV_KEY), code 28 (KEY_ENTER), value 1
Event: time 1501837323.817954, -------------- SYN_REPORT ------------
Event: time 1501837323.905869, type 1 (EV_KEY), code 28 (KEY_ENTER), value 0
Event: time 1501837323.905869, -------------- SYN_REPORT ------------=
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
操作演示:
IIC测试
我们的用户GPIO中引出了两组I2C分别是I2C2与I2C3
要想测试I2C是需要I2C总线上挂载设备,IO口需要接上拉电阻,编写对应的设备外设驱动才能能进行正常的测试,下面我使用暴力的手段进行测试,因为我们I2C引脚开发板上是没有接上拉电阻,所以只能对I2C2进行测试,因为I2C2端口默认是上拉状态,通过原图可以查看GPIO0_B5/6_u中的U表示UP上拉,GPIO3_B5/6_d中的d表示下拉。
硬件连接
测试
使用ADB列出I2C设备
rk3566_tspi:/ # ls /sys/class/i2c-dev/
i2c-0/ i2c-2/ i2c-3/ i2c-4/ i2c-6/
2
往I2c-2总线中写任意数据
rk3566_tspi:/ # echo -n " " > /dev/i2c-2
使用抓包工具可以看到波形输出
SPI测试
用户GPIO中引出了一组SPI接口如下图所示:
硬件连接
这里我们通过连接到逻辑分析仪进行,我们可以通过逻辑分析仪直观的观察spi的通讯数据,关于如何驱传感器我们在后续驱动中在进行分析。
测试
adb spi测试命令
#echo 类型 id 循环次数 传输长度 > /dev/spi_misc_test
echo write 0 10 255 > /dev/spi_misc_test
echo write 0 10 255 init.rc > /dev/spi_misc_test
echo read 0 10 255 > /dev/spi_misc_test
echo loop 0 10 255 > /dev/spi_misc_test
#echo setspeed id 频率(单位 Hz) > /dev/spi_misc_test
echo setspeed 0 1000000 > /dev/spi_misc_test
2
3
4
5
6
7
8
下面进行写测试,先启动逻辑分析仪采样,然后通过adb执行下面写命令
#对ID 0进行进行写入测试,循环1次,发送0-255
rk3566_tspi:/ # echo write 0 1 255 > /dev/spi_misc_test
2
停止采样下面逻辑分析仪正常捕获到我们发送的数据,SPI工作正常。
PWM测试
用户GPIO中其实很多IO口可以复用成PWM可查看复用定义表,但是我们这里按照默认定义所以只对12脚、33脚、35脚进行复用测试,引脚定义入下图:
硬件连接
我们这里通过逻辑分析仪来分别捕获3个PWM引脚的输出
PWM ADB测试方法
找到我们要测试的PWM设备
rk3566_tspi:/ # find . -name "pwm"
#pwm4: pwm@fe6e0000 edp屏幕背光
./sys/devices/platform/fe6e0000.pwm/pwm
#pwm14: pwm@fe700020
./sys/devices/platform/fe700020.pwm/pwm
#pwm9: pwm@fe6f0010
./sys/devices/platform/fe6f0010.pwm/pwm
#pwm8: pwm@fe6f0000
./sys/devices/platform/fe6f0000.pwm/pwm
2
3
4
5
6
7
8
9
这里就以pwm8进行测试:
#列出pwm8目录如下
rk3566_tspi:/ # ls /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/
device export npwm power subsystem uevent unexport
2
3
使能调试通道
#通道是从0开始的,对应原理图上的pwmx_mx中的mx,我们这里是pwm8_m0所以就是通道0
rk3566_tspi:/ # echo 0 > /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/export
#使能后会发现下面比之前多了一个pwm0目录
rk3566_tspi:/ # ls /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/
device export npwm power pwm0 subsystem uevent unexport
2
3
4
5
6
设置pwm周期、频率、极性
#单位纳秒,所以1000000000个纳秒就是一秒
rk3566_tspi:/ # echo 1000000000> /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/pwm0/period
#设置占空比为50%
rk3566_tspi:/ # echo 500000000> /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/pwm0/duty_cycle
#设置极性可以有两个选项:normal和inverted。当设置为 “normal” 时,
#高电平(高电压)表示占空比的高部分,而低电平(低电压)表示占空比的低部分。
#当设置为 “inverted” 时,这种情况相反
rk3566_tspi:/ # echo 'normal' > /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/pwm0/polarity
2
3
4
5
6
7
8
9
10
启动与停止PWM
#启动PWM
rk3566_tspi:/ # echo 1 > /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/pwm0/enable
#停止PWM
rk3566_tspi:/ # echo 0 > /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/pwm0/enable
2
3
4
失能调试通道
rk3566_tspi:/ # echo 0 > /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/unexport
测试
PWM8、PWM9、PWM10三个通道同时输出,使用逻辑分析仪器捕获波形
echo 0 > /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/export
echo 0 > /sys/devices/platform/fe6f0010.pwm/pwm/pwmchip2/export
echo 0 > /sys/devices/platform/fe700020.pwm/pwm/pwmchip3/export
echo 1000000000> /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/pwm0/period
echo 1000000000 > /sys/devices/platform/fe6f0010.pwm/pwm/pwmchip2/pwm0/period
echo 1000000000 > /sys/devices/platform/fe700020.pwm/pwm/pwmchip3/pwm0/period
echo 500000000 > /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/pwm0/duty_cycle
echo 250000000 > /sys/devices/platform/fe6f0010.pwm/pwm/pwmchip2/pwm0/duty_cycle
echo 100000000 > /sys/devices/platform/fe700020.pwm/pwm/pwmchip3/pwm0/duty_cycle
echo 'normal' > /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/pwm0/polarity
echo 'normal' > /sys/devices/platform/fe6f0010.pwm/pwm/pwmchip2/pwm0/polarity
echo 'normal' > /sys/devices/platform/fe700020.pwm/pwm/pwmchip3/pwm0/polarity
echo 1 > /sys/devices/platform/fe6f0000.pwm/pwm/pwmchip1/pwm0/enable
echo 1 > /sys/devices/platform/fe6f0010.pwm/pwm/pwmchip2/pwm0/enable
echo 1 > /sys/devices/platform/fe700020.pwm/pwm/pwmchip3/pwm0/enable
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
演示: