# NXP
平台:iMX-8M-Mini-EVK
## 目標一: 先使用現成的image啟動系統
## 目標二: 自行編譯系統
```bash=
DISTRO=fsl-imx-xwayland MACHINE=imx8mmevk source fsl-setup-release.sh -b build-xwayland
#bitbake imx-image-full
bitbake fsl-image-validation-imx
# fsl-image-qt5-validation-imx
bitbake meta-toolchain-qt5
sudo dd if=fsl-image-validation-imx-imx8mmevk.sdcard of=/dev/sdc bs=1M conv=fsync
```
[4.4.2](https://www.nxp.com/docs/en/user-guide/IMX_LINUX_USERS_GUIDE.pdf)
需要研究chap 8去了解的東西
1. QT->
1-1. 8.2 G2D-imx-samples
1-2. [ i.MX Graphics User’s Guide](https://www.nxp.com/docs/en/user-guide/IMX_GRAPHICS_USERS_GUIDE.pdf)
1-3 使用 **bitbake imx-image-full**產生的yocto linux image包含Qt5。
2. ethernet
3. wifi
4. hdmi graphic output
要開機需要四個元件:
• Linux OS kernel image (zImage/Image)
• Device tree file (*.dtb)
• Bootloader image
• Root file system (i.e., EXT4)
---
[i.MX Linux® Release Notes](https://www.nxp.com/docs/en/release-note/IMX_LINUX_RELEASE_NOTES.pdf)
[i.MX Porting Guide](https://www.nxp.com/docs/en/user-guide/IMX_PORTING_GUIDE.pdf)
[i.MX Linux Reference Manual](https://www.nxp.com/docs/en/reference-manual/IMX_REFERENCE_MANUAL.pdf)
---
[Evaluation Kit for the i.MX 8M Mini Applications Processor](https://www.nxp.com/design/development-boards/i-mx-evaluation-and-development-boards/evaluation-kit-for-the-i-mx-8m-mini-applications-processor:8MMINILPD4-EVK#t768)
[Get Started with the i.MX 8M Mini EVK](https://www.nxp.com/document/guide/get-started-with-the-i-mx-8m-mini-evk:GS-iMX-8M-Mini-EVK)
[【ATU Book-i.MX8系列】 NXP i.MX8M Mini 環境建置
](https://www.wpgdadatong.com/tw/blog/detail?BID=B1134)
## 設定wifi
設定ESSID和密碼
```bash=
wpa_passphrase ESSID password >> /etc/wpa_supplicant.conf
```
若要在開機的時候啟動網路需在 **/etc/init.d** 裡面加入腳本**wifi**
```bash= wifi
## 可將以下兩行寫入根目錄底下的profile裡面讓他在每次開機打開終端的時候執行
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf -D nl80211
udhcpc -i wlan0
```
之後在用指令chmod調整執行權限
```bash=
chmod 755 /etc/init.d/wifi
```
最後在修改/etc/rc.local讓腳本可以在開機時候可以執行
```bash=
#在exit之前加入下面內容
/etc/init.d/wifi
```
## 藍芽
http://variwiki.com/index.php?title=IMX_Bluetooth_Obex
## toolchain
使用的是armv8 64bits的toolchain
https://www.linaro.org/downloads/
## gpio
[[gpio]Linux GPIO简单使用方式1-sysfs](https://www.cnblogs.com/aaronLinux/p/6684260.html)
## i2c
https://b8807053.pixnet.net/blog/post/347698301-linux-tool---%3A--i2c-tools-%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%EF%BC%8C-i2cdetect-%E3%80%81-i
https://www.kernel.org/doc/Documentation/i2c/dev-interface
遇到問題:Chip address out of range (0x03-0x77)!
選裝置時要注意要在範圍之內
## toolchain
[Build and install the QT5 toolchain](http://variwiki.com/images/archive/8/8d/20161228090959%21YoctoQtCreator.pdf)
[Yocto tips (16): Yocto 制作SDK分发Toolchain 脱离Yocto环境开发](https://blog.csdn.net/sy373466062/article/details/50387199)
自行編譯的toolchain會放在**build-xwayland-imx8mmevk/tmp/deploy/sdk/**裡面(編譯過程會由於缺乏一些標準函式庫而編譯失敗;linaro提供的順利編譯。)
安裝toolchain:
```bash=
source fsl-imx-xwayland-glibc-x86_64-meta-toolchain-qt5-aarch64-toolchain-4.14-sumo.sh
```
到安裝的路徑下指令設置相關環境變數
```bash=
source environment-setup-aarch64-poky-linux
```
之後gcc要用$CC替代
## Qt工具選項設定
[Setting up Qt Creator to build for i.MX6](/opt/fsl-imx-xwayland/4.14-sumo/sysroots/x86_64-pokysdk-linux/usr/bin/qt5/)
## GPIO I2C SPI操作
GPIO:
(gpio-1)*32+10
/sys/kernel/debug
soc datasheet
---
I2C:
**I2Cdetect 掃描到的是7bit的address**
[i2ctransfer(8)](https://manpages.debian.org/unstable/i2c-tools/i2ctransfer.8.en.html)
[linux I2C 裝置驅動學習筆記](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/420608/)
[Linux系统下i2c工具 i2c-tool 的使用](https://www.cnblogs.com/raina/p/12068485.html)
[讓你的 Raspberry Pi 透過 I²C 讀取 eeprom](https://coldnew.github.io/f0528f55/)
---
SPI:
[linux spi子系統驅動開發筆記之例項(2)](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/420629/)
[如果SPI正在如何检查?吗?](https://www.asapsell.com/community/thread/461426)
驅動開發:
[Linux 字元裝置驅動結構(一)—— cdev 結構體、裝置號相關知識解析](https://www.itread01.com/p/1372699.html)
[spidev介绍](https://blog.csdn.net/chinazhangzhong123/article/details/54707387)
[kernel menuconfig](https://community.nxp.com/thread/447031)
[Using SPI with Linux](https://armbedded.taskit.de/node/318)
[[5.add new spi driver]如何新增一個spi裝置的driver到imx 8m mini evk上](https://cuteparrot.pixnet.net/blog/post/228761321-%5B5.add-new-spi-driver%5D%E5%A6%82%E4%BD%95%E6%96%B0%E5%A2%9E%E4%B8%80%E5%80%8Bspi%E8%A3%9D%E7%BD%AE%E7%9A%84driver)
## uart
[UART和RS232/RS485的關係是什麼?](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/586303/)
https://www.emcraft.com/som/imx-8m/using-imx-8m-uart-ports-in-linux
[Using a UART serial port from a linux shell](https://www.technexion.com/support/knowledgebase/using-a-serial-port-from-a-linux-shell/)
[How to open, read, and write from serial port in C?](https://stackoverflow.com/questions/6947413/how-to-open-read-and-write-from-serial-port-in-c)
[Linux Ubuntu stty 使用](https://www.itread01.com/content/1546281308.html)
[RS232 UART 的差別-最原始的通訊介面原來長這樣](https://www.strongpilab.com/rs232-uart-difference/)
[UART中的硬體流控RTS與CTS](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/609463/)
[工程师详解串口:RS-232、RS-422、RS-485之间的区别](http://murata.eetrend.com/article/2018-08/1001944.html)
[ADM2582](https://www.analog.com/media/en/technical-documentation/data-sheets/adm2582e_2587e.pdf)
https://blog.csdn.net/cmoooo/article/details/18228305
https://stackoverflow.com/questions/22511225/sending-hex-bytes-to-serial-in-bash
[linux 串口uart的使用詳解](https://www.twblogs.net/a/5b8382042b71776c51e36146)
## device tree
[什麼是Device Tree?](http://blog.ittraining.com.tw/2016/12/device-tree.html)
[Device Tree Fundamental](http://devicetreememo.blogspot.com/2017/01/device-tree-fundamental.html)
## PID
https://scitechvista.nat.gov.tw/c/sTCB.htm
http://ca.gwinstek.com/index.php?view=custom1&d=5
https://zh.wikipedia.org/wiki/PID%E6%8E%A7%E5%88%B6%E5%99%A8
https://www.ni.com/zh-tw/innovations/white-papers/06/pid-theory-explained.html
https://tw.azbil.com/%e8%a7%a3%e6%b1%ba%e6%96%b9%e6%a1%88/%e6%98%93%e8%a7%a3pid%e6%8e%a7%e5%88%b6%e7%9a%84%e6%95%85%e4%ba%8b1%e4%bd%95%e8%ac%82%e6%ba%ab%e5%ba%a6%e6%8e%a7%e5%88%b6/
## modbus
http://www.kce.2u.com.tw/download/MODBUS%20CRC16.pdf
https://cht.nahua.com.tw/index.php?url=https://cht.nahua.com.tw/software/crc16/&key=Modbus,%20RTU,%20CRC16&title=%E8%A8%88%E7%AE%97%20Modbus%20RTU%20CRC16
## 溫度IC
[LM75x Digital Temperature Sensor and Thermal Watchdog With Two-Wire Interface](https://www.ti.com/lit/ds/symlink/lm75b.pdf?ts=1600761853503&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FLM75B%253FCMP%253Dconv-poasamples)
https://cooling-tower.com.tw/solution-tw/skill-knowledre-tw/cooling-tower-knowledge-tw/what-is-the-wet-bulb-tw
```bash=
set xlabel 'timestamp'
set ylabel 'temerature'
set datafile separator","
plot "tmp_record.csv" using 2 title "data1" with linespoints linewidth 1
plot -persist 'record.csv' using 1:2 with lines
```
```bash=
#!/usr/bin/gnuplot -persist
set datafile separator ","
set output 'runtime.png'
set term png enhanced font 'Verdana,10'
plot 'record.csv' using 1:2 with lines title "record"
set output 'runtime2.png'
plot 'record2.csv' using 1:2 with lines title "record2"
```
linux c pipe programming
pipe,dup,popen
remote gdb
```bash= gcc -lpthread
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
// 子執行緒函數
void* child(void* data) {
char *str = (char*) data; // 取得輸入資料
while(1){
if(*((int*)data)){
printf("pressed\n");
}
else{
printf("unpressed\n");
}
sleep(1);
}
pthread_exit(NULL); // 離開子執行緒
}
// 主程式
int main() {
pthread_t t; // 宣告 pthread 變數
int flag=0;
pthread_create(&t, NULL, child, (void*)&flag); // 建立子執行緒
// 主執行緒工作
while(1) {
scanf("%d",&flag);
}
pthread_join(t, NULL); // 等待子執行緒執行完成
return 0;
}
```
使用xargs將參數列切成多數小段。
[C 語言 pthread 多執行緒平行化程式設計入門教學與範例](https://blog.gtwang.org/programming/pthread-multithreading-programming-in-c-tutorial/)
[OS - Ch4 多執行緒 Multithread Programming](https://mropengate.blogspot.com/2015/01/operating-system-ch4-multithread.html)
[How to Pass Command Line Arguments to Bash Script
](https://www.baeldung.com/linux/pass-command-line-arguments-bash-script)
https://hackmd.io/@sysprog/c-trick?type=view
http://puremonkey2010.blogspot.com/2012/08/linux-linuxps-statrsdtzx.html
https://man7.org/linux/man-pages/man2/pipe.2.html
https://man7.org/linux/man-pages/man3/mkfifo.3.html
https://man7.org/linux/man-pages/man7/fifo.7.html?fbclid=IwAR2arUyVucL3bKeyDZUL6OjKPPjJ-KipKYEAFsh0Zu7oqtfiR2s0N8B4fss#:~:text=A%20FIFO%20special%20file%20
https://b8807053.pixnet.net/blog/post/327113148-linux-%E4%BF%A1%E8%99%9Fsignal%E8%99%95%E7%90%86%E6%A9%9F%E5%88%B6
模糊控制(fuzzy controller)
http://www.mstarlabs.com/control/znrule.html
https://github.com/br3ttb/Arduino-PID-AutoTune-Library/blob/master/PID_AutoTune_v0/PID_AutoTune_v0.cpp
https://zh.wikipedia.org/wiki/PID%E6%8E%A7%E5%88%B6%E5%99%A8
https://zh.wikipedia.org/wiki/%E6%8B%89%E6%99%AE%E6%8B%89%E6%96%AF%E7%AE%97%E5%AD%90
[Linux下fork函數及pthread函數的總結](https://www.cntofu.com/book/46/linux_system/linuxxia_fork_han_shu_ji_pthread_han_shu_de_zong_j.md)
http://nano-chicken.blogspot.com/2014/07/linuxttyptypts.html
http://www.tcvs.tc.edu.tw/ftp/20130918111735.pdf
---
https://github.com/br3ttb?tab=repositories->auto tune and pid controller compute
https://github.com/br3ttb/Arduino-PID-AutoTune-Library/blob/master/PID_AutoTune_v0/PID_AutoTune_v0.cpp
https://en.wikipedia.org/wiki/Ziegler%E2%80%93Nichols_method
https://fenix.tecnico.ulisboa.pt/downloadFile/395139427476/Resumo%20Alargado%20-%20Auto-tuning%20de%20Controladores%20PID%20pelo%20m%C3%A9todo%20Relay.pdf
https://d1.amobbs.com/bbs_upload782111/files_36/ourdev_614499E39LAH.pdf
---
https://github.com/jackw01/arduino-pid-autotuner/blob/master/pidautotuner.cpp
https://github.com/jackw01/arduino-pid-control
https://github.com/cvra/pid
http://www.processcontrolstuff.net/wp-content/uploads/2015/02/relay_autot-2.pdf
file:///home/wonder-system/Downloads/QIR_ratna.pdf
https://www.scitepress.org/Papers/2014/50639/50639.pdf
https://warwick.ac.uk/fac/cross_fac/iatl/reinvention/archive/volume5issue2/hornsey
[Linux GPIO简单使用方式1-sysfs](https://www.cnblogs.com/aaronLinux/p/6684260.html)
```bash=max6678
#!/bin/bash
cs=/sys/class/gpio/gpio507/value
clk=/sys/class/gpio/gpio508/value
miso="cat /sys/class/gpio/gpio509/value"
function spiread(){
t=0
for i in {7..0}
do
echo 0 > $clk
usleep 10
if [ $($miso) -eq 1 ]
then
t=$(($t|(1<<$i)))
fi
echo 1 > $clk
usleep 10
done
echo $t
}
function readCelsius(){
echo 0 > $cs
usleep 10
v1=$(spiread)
printf "v1:0x%x\n" $v1
v2=$(spiread)
printf "v2:0x%x\n" $v2
echo 1 > $cs
v_final=$((($v1<<8)|$v2))
printf "v_final:0x%x\n" $v_final
if [ $(($v_final & 0x04)) -eq 4 ]
then
echo error
exit 5
fi
v_final=$(($v_final>>3))
echo $v_final*0.25 | bc
}
readCelsius
```
http://www.yjfloat.com.tw/en/omron/pdf/O/%E6%BA%AB%E5%BA%A6%E6%8E%A7%E5%88%B6%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%A6%82.pdf
## 濕度測量方法
使用兩個相同規格的溫度測量計,一隻包裹沾濕的物件,一隻則直接量測,藉由兩個再升溫中的誤差可推斷出空間中的濕度為何。
[參考資料](http://www.cf-photo.com.tw/eyc-tech/admin/upload/%E6%BA%AB%E6%BF%95%E5%BA%A6%E4%BB%8B%E7%B4%B9.pdf)
###### tags: `nxp` `linux` `yocto` `工作`