OrangePi KunPengPro
| 開發板開箱測評之學習與使用
時間:2024年5月23日20:51:12
文章目錄
- `OrangePi KunPengPro` | 開發板開箱測評之學習與使用
- 概述
- 1.參考
- 2.資料、工具
- 3.使用
- 3-1.通過串口登錄系統
- 3-2.通過SSH登錄系統
- 3-3.安裝交叉編譯工具鏈
- 3-4.復制文件到設備
- 3-5.第一個程序`hello`
- 代碼
- makefile
- 編譯
- 運行
- 3-6.`I2C`的測試和使用
- 資料
- 演示
- 3-7.**i2c**點亮`OLED`屏實驗
- 硬件連線示意圖
- 檢測`i2c`從設備
- 數據手冊
- Demo實例代碼
- 用戶態讀寫`IIC`
- Makefil文件
- 演示(點亮效果)
- 后記

概述
非常榮幸有機會參加
CSDN
的這次舉辦的OrangePi Kunpeng Pro
開發板的開箱測評/使用機會。因為之前很少玩過類似的板子,感覺這個板子挺精致的。開箱,有一個主板(配置是8GB內存,還有一個32GB的內存卡(已經裝好了系統),同時板子還裝好了散熱風扇,,然后還有一個電源),沒遇到太有難度的,基本連上電源,真的是開箱即用。
豐富接口,易于擴展
匯聚了MIPI DSI、MIPI CSI、USB3.0、Type-C3.0、HDMI2.0、千兆以太網、支持SATA/NVMe SSD 2280的M.2插槽等各類流行的接口,可應用于外部設備控制和擴展。
支持SATA/NVMe SSD 2280硬盤,擴展海量容量
板載M.2接口,支持接入SATA/NVMe SSD 2280硬盤,增加海量數據存儲空間,滿足快速讀寫和大容量存儲的需求。
多通道輸出,支持多屏異顯
支持雙HDMI視頻輸出,支持雙4K高清輸出,支持一個MIPI DSI視頻輸出,支持兩個MIPI接口攝像頭輸入。
提供類PC桌面環境,簡化上手難度
支持圖形化桌面(gnome),支持瀏覽器(firefox),支持文本編輯(gedit),支持中文輸入法,支持shell終端。
預安裝openEuler、openGauss、DevKit
高效、穩定、安全,支持多種硬件架構和虛擬化技術,可廣泛應用于企業級邊緣計算場景等。
OrangePi Kunpeng Pro
采用4核64位處理器+AI
處理器,集成圖形處理器,支持8TOPS AI
算力,擁有8GB/16GB
LPDDR4X
,可以外接32GB
/64GB
/128GB
/256GB
eMMC
模塊,支持雙4K
高清輸出。
OrangePi Kunpeng Pro
引用了相當豐富的接口,包括兩個HDMI
輸出、GPIO
接口、Type-C
電源接口、支持SATA/NVMe SSD 2280
的M.2
插槽、TF
插槽、千兆網口、兩個USB3.0
、一個USB Type-C 3.0
、一個Micro USB
(串口打印調試功能)、兩個MIPI
攝像頭、一個MIPI
屏等,預留電池接口等。
OrangePi Kunpeng Pro
支持openEuler
操作系統,滿足大多數AI
算法原型驗證、推理應用開發的需求,同時可以為各種應用場景提供更高效的算力,如云計算、大數據、分布式存儲、高性能計算等。因為是新的板子,所以先搜集了下相關的資料,進行閱讀。板子連上電源,然后通過
MicroUSB
連接電腦,即可通過串口進入系統終端,進行調試和交互。這一點,也非常合理,僅需要安裝下驅動,也不需要額外的USB
轉串口工具。網絡連接和無線連接也是完善和豐富的。這邊主要先實踐了下串口和網絡登錄系統終端,學會通過已有的硬件,進入系統。然后學習傳文件到系統,方便將自己的工具和軟件傳到板子上。
然后安裝了交叉編譯工具鏈,運行了自己的第一個程序
hello
,邁出了開發的第一步。最后,使用板子的
IIC
接口點亮了一個IIC OLED
屏幕。詳細演示了如何在linux
平臺下如何進行IIC
的調試和開發。使用過程中,也遇到了一些問題:
1.比如按照文檔,使用
256GB
的SD
卡燒錄了系統,啟動過程中卡住了,目前沒有深入探究,后續有時間再看看是啥問題;2.
MicroUSB
調試串口能夠連上電腦,但是不能出調試信息,目前沒有想這個問題,就是通過網絡進入終端調試,暫時繞開了調試串口不出信息的問題;
1.參考
1.OrangePi Kunpeng Pro Orange Pi官網-香橙派(Orange Pi)開發板,開源硬件,開源軟件,開源芯片,電腦鍵盤
2.Orange Pi - Orange Pi 論壇
3.鯤鵬社區-官網丨凝心聚力 共創行業新價值 (hikunpeng.com)
4.OrangePiKunPengPro | 開發板學習與使用-CSDN博客
2.資料、工具
1.官方資料和工具:
root@ThinkPad-FLY:/mnt/d/Download/OrangePiKunpengPro# tree . ├── 外殼及散熱器安裝資料 │ ├── OPi Kunpeng pro外殼裝配說明.mp4 │ ├── OPi kunpeng Pro開發板+散熱器組件裝配說明-20240429.pptx │ └── Opi Kunpeng pro開發板+散熱器.mp4 ├── 官方工具 │ ├── FileZilla-SFTP軟件 │ │ └── FileZilla_3.62.2_win64_sponsored2-setup.exe │ ├── Linux鏡像燒錄工具-balenEther │ │ ├── Linux_X64版本 │ │ │ ├── balena-etcher_1.18.8_amd64.deb │ │ │ └── balenaEtcher-1.18.4-x64.AppImage │ │ ├── MACOS_X64版本 │ │ │ └── balenaEtcher-1.18.4.dmg │ │ ├── Windows_X64版本 │ │ │ ├── balenaEtcher-Portable-1.18.4.exe │ │ │ └── balenaEtcher-Setup-1.18.4.exe │ │ └── 開發板安裝的arm64版本 │ │ ├── balena-etcher-electron_1.7.9+5945ab1f_arm64.deb │ │ └── balenaEtcher-1.7.9+5945ab1f-arm64.AppImage │ ├── MobaXterm │ │ └── MobaXterm_Portable_v22.2.zip │ ├── Windows-格式化軟件-SDCardFormatter │ │ └── SDCardFormatterv5_WinEN.zip │ ├── 交叉編譯工具鏈 │ │ └── toolchain.tar.gz │ └── 查看YUV圖片的軟件 │ └── SuperImage.rar └── 用戶手冊 └── OrangePi_KunPeng_Pro_用戶手冊_v0.1.pdf
2.CH343SER.EXE - 驅動下載
3.WinSCP :: Official Site :: Download
4.Wi-Fi+藍牙模組:歐智通 6221BUUC_datasheet
3.使用
3-1.通過串口登錄系統
首先需要下載驅動(驅動下載主頁見上面的連接),然后安裝驅動;
通過
Micro USB
連接電腦和開發板,查看com
口,然后通過串口工具登錄系統;為什么一開始選擇串口登錄?因為通過串口調試是最簡單的方式。雖然有網口,但一開始也不知道
ip
,也沒法登錄。手邊有顯示器,可以通過
HDMI
連接,但是沒有USB
鍵盤,因此也沒法好好交互。所以先通過串口登錄系統交互。
3-2.通過SSH登錄系統
上面通過串口進入系統后,通過連接網線(同一網絡下),查看設備
IP
,即可通過SSH
登錄系統;也可以參考文檔:OrangePi_KunPeng_Pro_用戶手冊_v0.1.pdf,使用
WIFI
連接網絡,就可以減少網線或者串口線的連接來登錄終端;
3-3.安裝交叉編譯工具鏈
# 新建目錄
sudo mkdir /opt/OrangePiKunpengPro
# 解壓文件
sudo tar -zxvf toolchain.tar.gz -C /opt/OrangePiKunpengPro/
# 設置環境變量
sudo vim /etc/profile
# 使環境變量生效
source /etc/profile
# 查看編譯器版本
aarch64-target-linux-gnu-gcc --version
# 寫源碼
vim hello.c
# 編譯源碼
aarch64-target-linux-gnu-gcc hello.c -o hello
3-4.復制文件到設備
首先電腦上需要安裝
WinSCP
軟件。WinSCP :: Official Site :: Free SFTP and FTP client for Windows將編譯的之前交叉編譯的
hello
可執行程序復制到設備上,修改可執行權限,就可以在設備上執行自己編譯的程序。
3-5.第一個程序hello
代碼
/******************************************************************** > File Name: hello.c* > Author: fly* > Mail: * > Create Time: Fri 17 May 2024 02:14:11 PM CST******************************************************************/#include <stdio.h>int main(int argc, char* argv[])
{printf("hello\n\n");printf("__FILE__: %s\n", __FILE__);printf("__FUNC__: %s\n", __func__);printf("__LINE__: %d\n", __LINE__);return 0;
}
makefile
.PHONY:allSRC=hello.c
BIN=hello
#CC=gcc
CC=aarch64-target-linux-gnu-gccall:@echo "預處理"$(CC) -E hello.c -o hello.i@echo "編譯"$(CC) -S hello.i -o hello.s@echo "匯編"$(CC) -c hello.s -o hello.o@echo "鏈接"$(CC) hello.o -o helloclean:$(RM) *.i *.s *.o hello
編譯
編譯是在一個
Ubuntu docker
中進行的,需要提前安裝、配置好交叉編譯工具鏈(命令行操作如下);
[fly@752fac4b02e9 02-hello]$ ls
hello.c Makefile
[fly@752fac4b02e9 02-hello]$ make
預處理
aarch64-target-linux-gnu-gcc -E hello.c -o hello.i
編譯
aarch64-target-linux-gnu-gcc -S hello.i -o hello.s
匯編
aarch64-target-linux-gnu-gcc -c hello.s -o hello.o
鏈接
aarch64-target-linux-gnu-gcc hello.o -o hello
[fly@752fac4b02e9 02-hello]$ ls
hello hello.c hello.i hello.o hello.s Makefile
[fly@752fac4b02e9 02-hello]$ file hello
hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, not stripped
運行
通過
WinSCP
將編譯后的程序上傳到板子上,檢測板子上程序的可執行權限,然后運行(如下命令行操作)。
[root@openEuler ~]# ls -l
總用量 24
drwxr-x--- 2 root root 4096 1月 1 1970 hdc_ppc
-rw------- 1 root root 12728 5月 26 01:15 hello
drwxr-xr-x 2 root root 4096 5月 6 04:34 tmp
[root@openEuler ~]# chmod +x hello
[root@openEuler ~]# ./hello
hello__FILE__: hello.c
__FUNC__: main
__LINE__: 16
3-6.I2C
的測試和使用
資料
1.linux下i2c調試神器i2c-tools安裝及使用_i2c調試助手-CSDN博客
2.0.91inch IIC OLED Module SSD1306 SKU:MC091GX - LCD wiki
3.Linux應用開發【第十二章】I2C編程應用開發 - 知乎 (zhihu.com)
4.【五一創作】Linux—I2C應用編程_linux i2c應用程序-CSDN博客
在嵌入式開發中,有時候需要確認硬件是否正常連接,設備是否正常工作,設備的地址是多少等等,這里我們就需要使用一個用于測試
I2C
總線的工具——i2c-tools
。
i2c-tools
工具是一個專門調試i2c
的,開源,可獲取掛載的設備及設備地址,還可以讀寫I2C
設備寄存器。命令介紹:i2cdetect:檢測i2c芯片i2cdump:查看寄存器值i2cget:獲取單個寄存器值(8位寄存器)i2cset:設置單個寄存器值(8位寄存器) 參數介紹:-y:禁用交互模式。-f:強制訪問設備。-r:寫入后立即讀回該值。
演示
3-7.i2c點亮OLED
屏實驗
0.91inch_IIC_OLED_Module_MC091GX_User_Manual_CN.pdf
硬件連線示意圖
檢測i2c
從設備
通過輸入如下命令,可知從設備地址為0x3C;
# 未連接I2C從設備前檢測
[root@openEuler /]# i2cdetect -y -r 70 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
# 連接I2C從設備后檢測
[root@openEuler /]# i2cdetect -y -r 70 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
# 查看i2c設備所有寄存器的值
[root@openEuler /]# i2cdump -y -f 7 0x3c
No size specified (using byte-data access)0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
10: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
20: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
30: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
40: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
50: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
60: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
70: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
80: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
90: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
a0: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
b0: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
c0: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
d0: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
e0: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
f0: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 CCCCCCCCCCCCCCCC
數據手冊
0.91寸屏驅動i2c數據手冊:
SSD1306-Revision 1.5.pdf
8.1.5 MCU I2C接口
I2C
通信接口包括從機地址位SA0
、I2C
總線數據信號SDA
(輸出為SDAOUT/D2
,輸入為SDAIN/D1
)和I2C
總線時鐘信號SCL
(D0
)。數據信號和時鐘信號都必須連接到上拉電阻。RES#
用于設備的初始化。a) 從機地址位(
SA0
)SSD1306在通過I2C總線發送或接收任何信息之前,必須先識別從機地址。設備將響應由從機地址位(“SA0”位)和讀寫選擇位(“R/W#”位)跟隨的從機地址,其字節格式如下:
b7 b6 b5 b4 b3 b2 b1 b0
0 1 1 1 1 0 SA0 R/W#“SA0”位為從機地址提供擴展位。可以選擇“0111100”或“0111101”作為SSD1306的從機地址。D/C#引腳作為SA0用于從機地址選擇。
“R/W#”位用于確定I2C總線接口的操作模式。R/W#=1,處于讀取模式;R/W#=0,處于寫入模式。
b) I2C總線數據信號(
SDA
)
SDA
作為發射器和接收器之間的通信通道。數據和確認都是通過SDA
發送的。應該注意的是,“
SDA
”引腳上的ITO
軌道電阻和上拉電阻形成了一個電壓分壓器。因此,確認信號在“SDA
”上可能無法達到有效的邏輯0電平。“
SDAIN
”和“SDAOUT
”連接在一起作為SDA
使用。“SDAIN
”引腳必須連接以作為SDA
使用。“SDAOUT
”引腳可以斷開。當“SDAOUT
”引腳斷開時,I2C
總線中的確認信號將被忽略。c) I2C總線時鐘信號(
SCL
)
I2C
總線中的信息傳輸遵循時鐘信號SCL
。每個數據位的傳輸都在SCL
的一個時鐘周期內發生。8.1.5.1
I2C
總線寫數據
I2C
總線接口允許向設備寫入數據和命令。請參考圖8-7,了解I2C
總線寫模式按照時間順序的流程。
8.1.5.2
I2C
總線寫數據的流程
主設備通過起始條件啟動數據通信。起始條件的定義如圖8-8所示(詳見數據手冊)。起始條件是通過在SCL保持高電平時,將
SDA
從高電平拉至低電平來建立的。緊隨起始條件之后的是從設備地址,用于識別。對于SSD1306,通過將SA0設置為低電平或高電平(D/C引腳作為SA0使用),從設備地址是“
b0111100
”或“b0111101
”。通過將R/W#位設置為邏輯“0”來建立寫模式。
在接收到一個字節的數據(包括從設備地址和
R/W#
位)后,將生成一個應答信號。請參考圖8-9了解應答信號的圖形表示。應答位定義為在應答相關時鐘脈沖的高電平期間,SDA
線被拉低。在發送從設備地址后,可以通過
SDA
發送控制字節或數據字節。控制字節主要由Co
和D/C#
位組成,后面跟著六個“0”。
a. 如果Co
位設置為邏輯“0”,則后續傳輸的信息將僅包含數據字節。
b.D/C#
位確定下一個數據字節是作為命令還是數據。如果D/C#
位設置為邏輯“0”,則定義下一個數據字節為命令。如果D/C#
位設置為邏輯“1”,則定義下一個數據字節為要存儲在GDDRAM
中的數據。在每次數據寫入后,GDDRAM
列地址指針將自動增加1。在接收到每個控制字節或數據字節后,將生成應答位。
當應用停止條件時,寫模式將結束。停止條件也在([圖8-8中定義(詳見數據手冊)SSD1306-Revision 1.5.pdf ](http://www.lcdwiki.com/res/MC091GX/SSD1306-Revision 1.5.pdf))。停止條件是通過在
SCL
保持高電平時,將“SDA輸入
”從低電平拉至高電平來建立的。請注意,數據位的傳輸有一些限制。
- 在每個
SCL
脈沖期間傳輸的數據位必須在時鐘脈沖的“HIGH
”周期內保持穩定狀態。請參考圖8-10以獲得圖形表示。除了在開始或停止條件下,數據線只能在SCL
為LOW
時切換。- 數據線(SDA)和時鐘線(SCL)都應該通過外部電阻上拉。
8.2. 命令解碼器
此模塊確定輸入數據是被解釋為數據還是命令。數據的解釋基于
D/C#
引腳的輸入。如果
D/C#
引腳為高電平,D[7:0]
將被解釋為寫入圖形顯示數據RAM(GDDRAM)
的顯示數據。如果
D/C#
引腳為低電平,D[7:0]
的輸入將被解釋為命令。然后,數據輸入將被解碼并寫入相應的命令寄存器。
Demo實例代碼
1.kernel.org/doc/Documentation/i2c/dev-interface
2.樹莓派學習筆記——wiringPi I2C設備使用詳解_wiringpii2c-CSDN博客
3.linux i2c應用程序模塊-CSDN博客
4.OranggePi KunPengPro點亮IIC OLED DEMO
[fly@752fac4b02e9 i2c_oled]$ tree
.
├── demo_iic_oled.c
├── inc
│ ├── bmp.h
│ ├── delay.h
│ ├── gui.h
│ ├── iic.h
│ ├── oledfont.h
│ ├── oled.h
│ ├── test.h
│ └── type.h
├── lib
├── Makefile
└── src├── delay.c├── gui.c├── iic.c├── oled.c└── test.c3 directories, 15 files
用戶態讀寫IIC
//
static int iic_open(int adapter_nr)
{int fd;char filename[20];snprintf(filename, 19, "/dev/i2c-%d", adapter_nr);fd = open(filename, O_RDWR);if(fd < 0){perror("I2C Device open");return -1;}return fd;
}static int i2c_write(int fd, unsigned int slave_addr, unsigned char reg_addr, unsigned char value)
{unsigned char outbuf[2];struct i2c_rdwr_ioctl_data packets;struct i2c_msg messages[1];messages[0].addr = slave_addr;messages[0].flags = 0;messages[0].len = sizeof(outbuf);messages[0].buf = outbuf;/* The first byte indicates which register we‘ll write */outbuf[0] = reg_addr;/** The second byte indicates the value to write. Note that for many* devices, we can write multiple, sequential registers at once by* simply making outbuf bigger.*/outbuf[1] = value;/* Transfer the i2c packets to the kernel and verify it worked */packets.msgs = messages;packets.nmsgs = 1;if(ioctl(fd, I2C_RDWR, &packets) < 0){perror("Unable to send data");return 1;}return 0;
}static int i2c_read(int fd, unsigned char slave_addr, unsigned char reg_addr, unsigned char *value)
{unsigned char inbuf, outbuf;struct i2c_rdwr_ioctl_data packets;struct i2c_msg messages[2];/** In order to read a register, we first do a "dummy write" by writing* 0 bytes to the register we want to read from. This is similar to* the packet in set_i2c_register, except it‘s 1 byte rather than 2.*/outbuf = reg_addr;messages[0].addr = slave_addr;messages[0].flags = 0;messages[0].len = sizeof(outbuf);messages[0].buf = &outbuf;/* The data will get returned in this structure */messages[1].addr = slave_addr;messages[1].flags = I2C_M_RD/* | I2C_M_NOSTART*/;messages[1].len = sizeof(inbuf);messages[1].buf = &inbuf;/* Send the request to the kernel and get the result back */packets.msgs = messages;packets.nmsgs = 2;if(ioctl(fd, I2C_RDWR, &packets) < 0){perror("Unable to send data");return 1;}*value = inbuf;return 0;
}//uint32_t iic_fd;uint32_t IIC_init(void)
{uint32_t fd;fd = iic_open(IIC_ADAPTER_NR);return fd;
}/****************************************************************************** @name :void IIC_WriteCmd(uint8_t I2C_Command)* @date :2018-09-14 * @function :write a byte of command with iic bus* @parameters :I2C_Command:command to be writen* @retvalue :None
******************************************************************************/
void IIC_WriteCmd(uint8_t I2C_Command)
{i2c_write(iic_fd, IIC_SLAVE_ADDR, IIC_COMMAND, I2C_Command);
}/****************************************************************************** @name :void IIC_WriteDat(uint8_t I2C_Data)* @date :2018-09-14 * @function :write a byte of data with iic bus* @parameters :I2C_Data:data to be writen* @retvalue :None
******************************************************************************/
void IIC_WriteDat(uint8_t I2C_Data)
{i2c_write(iic_fd, IIC_SLAVE_ADDR, IIC_DATA, I2C_Data);
}
Makefil文件
#CC = gcc
CC=aarch64-target-linux-gnu-gcc
CFLAGS = -g -Wall -O0
OBJS = demo_iic_oled
INCDIRS :=INCDIRS = -I./incSRC = \demo_iic_oled.cSRC += \src/iic.c \src/oled.c \src/gui.c \src/delay.c \src/test.c$(OBJS) : $(SRC)$(CC) $(CFLAGS) -o $@ $^ $(INCDIRS)clean:$(RM) $(OBJS) .*.sw?
演示(點亮效果)
香橙派Kunpeng Pro測評試用 | 通過IIC點亮OLED屏幕
香橙派Kunpeng Pro試用 | 通過IIC點亮OLED
后記
后續可能,還會繼續探究各硬件模塊和接口的功能和能力。再繼續深入了解的情況,深入軟件功能的探究,賦予這個豐富/強大的硬件,更靈活的軟件使用。
同時,也希望和各位試用者多多交流,實現更有創意的想法。