1.準備部分
1.1 虛擬機安裝
- 準備VMware軟件、ubuntu系統鏡像
- 安裝過程
- VMware安裝
破解(自己百度破解碼,多試幾個網址,會有能用的) - Ubuntu安裝
- 配置聯網
橋接
虛擬機Ubuntu系統必須能連接到外網,不然不能更新軟件安裝包
配置虛擬機網絡
第一步
1.重啟虛擬機網絡編輯器(還原配置)
第二步
2.重啟虛擬機網絡適配器(移除再添加)
第三步
3.重啟虛擬機網絡服務器
sudo service network-manager stop
sudo rm /var/lib/NetworkManager/NetworkManager.state
sudo service network-manager start
1.2 板子獲取
2.Linux基礎命令
2.1.操作方式
2.1.1界面
2.1.2命令行
- 打開終端 Ctrl+Alt+t
- 一個窗口打開第二個 Ctrl+Shift+t
- 新窗口打開第二個 Ctrl+Alt+t
- 字體放大 Ctrl+(+)
- 字體縮小 Ctrl+(-)
2.2 文件和目錄操作
ls -l -a lsusb lsmod
cd ~ …
pwd
mkdir
touch
rm
mv
cat
2.3 管理員
2.3.1 管理員權限
sudo
2.3.1 管理員用戶
創建root用戶 sudo passwd root
切換用戶 su + 用戶名
2.4 安裝應用
2.4.1 apt
- sudo apt install (package name)
- sudo apt update 使用 apt 更新包數據庫
- sudo apt upgrade 使用 apt 升級已安裝的軟件包
2.4.2 換源
2.4.2.1 界面方式
- 點Ubuntu左下角菜單,選紫色的SoftWare&Updates 軟件
- 點Download from 選擇other
- 再選擇C開頭的china,然后點mirrors.aliyun.com,最后點Choose Server
- 進行密碼驗證 最后點close
- 然后點reload
- sudo apt update
- sudo apt upgrade
2.4.2.1 命令方式
一切皆文件
2.5 文本處理
2.5.1 vim
2.5.1.1安裝方式
sudo apt install vim
2.5.1.2使用方法
2.5.1.2.1命令模式
默認,此模式下,可使用方向鍵(上、下、左、右鍵)或 k、j、h、i 移動光標的位置,還可以對文件內容進行復制、粘貼、替換、刪除等操作
2.5.1.2.2輸入模式
使 Vim 進行輸入模式的方式是在命令模式狀態下輸入 i、I、a、A、o、O 等插入命令,當編輯文件完成后按 Esc 鍵即可返回命令模式
快捷鍵
小寫i/a :在當前光標所在位置插入隨后輸入的文本,光標后的文本相應向右移動
小寫x:刪除光標所在位置的字符(命令模式下)
小寫dd:刪除光標所在行(命令模式下)
2.5.1.2.3編輯模式
編輯模式用于對文件中的指定內容執行保存、查找或替換等操作。在命令模式狀態下按“:”鍵,此時 Vim 窗口的左下方出現一個“:”符號,這是就可以輸入相關指令進行操作了
相關命令
- Esc +:wq
- Esc +:wq!
- Esc+:q
- Esc+:!
- 顯示行 Esc + :set nu
- 搜索文本 :Esc+:/文本
查看上一個: N 查看下一個 :n
2.5.2 gedit
2.5.3 nano
2.6 縮和解壓縮
tar
打包示例 tar -cvf test.tar*.c
解壓示例 tar -xvf test.tar
2.7 查找
2.7.1 find
查找文件
sudo find /home/ling -name "*.c'
2.7.2 grep
查找文件中的字符
grep "d" a.c
dmesg
dmesg | grep usb
2.8 基礎編輯測試
- gcc
sudo apt install gcc
編譯 gcc - file
- chmod
文件所有者(Owner)
用戶組(Group)
其它用戶(Other Users)
sudo chmod 777 test.c
2.9 misc
- ifconfig
- echo
- ping
- ps axu 查看系統中所有運行進程
- top
- kill
- uname -a
- shutdown 60秒延時關閉系統
shutdown now 立即關閉 - reboot
- ctrl+c 終止進程 SIGINT
- ctrl+z 掛起程序
-jobs 查看當前終端的后臺任務
fg 將掛起的任務恢復到前臺運行
bg 將掛起的任務放到后臺繼續運行
kill %1 終止編號為1的后臺任務
3.環境搭建
3.1 注意
串口: windows要選擇到底連接哪里(windows/linux)
Windows關機之前,虛擬機要關閉
3.2 ssh(方便切換)
3.2.1Ubuntu
sudo apt-get install openssh-server
ifconfig
3.2.2Windows
MobaXterm
3.3 傳文件
3.3.1 FTP
3.3.1.1Ubuntu
- sudo apt-get install vsftpd
- sudo vim /etc/vsftpd.conf
找到 #write_enable=YES
把#刪掉,然后保存
- sudo /etc/init.d/vsftpd restart
3.3.1.2 Windows
安裝 FileZilla
3.3.2.3 注意:
如果連接不上,關閉Linux(sudo ufw disable)和Windows防火墻
3.3.2 samba
3.3.2.1Ubuntu
1.sudo apt-get upgrade
2.sudo apt-get update
3.sudo apt-get dist-upgrade
4.sudo apt-get install samba samba-common
5.samba -V #如果出現下面版本號說明已經安裝了samba服務器
6.sudo mkdir /home/share
7.sudo chmod 777 /home/share
8.sudo smbpasswd -a ling#需要確認輸入兩個相同的密碼確認
9.sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak #備份 smb.conf 配置文件
10.sudo vim /etc/samba/smb.conf #在配置文件smb.conf的最后添加下面的內容(里面的信息要改成自己的)
11.sudo service smbd restart(或者/etc/init.d/samba restart) #重啟samba服務器
[global]; 創建工作組 設定 Samba Server 所要加入的工作組或者域 workgroup = WORKGROUP ; 為了防止出現中文目錄亂碼的情況。其中根據你的local,UTF-8 有可能需要改成 cp936; display charset = UTF-8unix charset = UTF-8dos charset = cp936 ; 是否允許guest用戶訪問guest ok = no; 注:如果 #security 存在就直接修改,不存在就創建; security = user ; 安全模式 我們設置用戶安全級別security = user ; 說明:用來定義用戶名映射,比如可以將root換成administrator、admin等。不過要事先在smbusers文件中定義好。; 比如:root = administrator admin,這樣就可以用administrator或admin這兩個用戶來代替root登陸Samba Server,更貼近windows用戶的習慣。username map = /etc/Samba/smbusers ; 共享名,該共享標簽,該名字為在電腦上看到的共享名 注意網絡映射的路徑是這標簽名字不是共享路徑的名字
[share]; 該共享描述comment = Shared Folder with username and password ; 共享文件夾路徑path = /home/ling/; 表示是否允許匿名訪問該共享目錄public = no; 配置的Samba訪問賬號 指明可以訪問的用戶valid users = ling; 表示是否可以在 Window Explorer中顯示該目錄browsable = no; 指明新建立的文件的屬性create mask = 777 ; 指明新建立的目錄的屬性directory mask = 777; force group 和force user 規定創建的文件或文件夾的擁有者和組擁有者是誰 ; 一般這兩個值來空,則表示擁有者和組擁有者為創建文件者。 如設定值,如force group=ling; Force user=yhq,則不管是誰創建的文件和文件夾,擁有者都為yhq和yhq組。; force user強制把建立文件的屬主是誰。如果我有一個目錄,讓guest可以寫,那么guest就可以刪除,; 如果我用force user=yhq強制建立文件的屬主是yhq,同時限制create mask = 0755,; 這樣guest就不能刪除了。force user = lingforce group = ling; available用來指定該共享資源是否可用available = yes ; 共享路徑讀權限 設置共享是否可瀏覽,如果no則表示隱藏,需要通過"//ip/共享目錄"進行訪問browseable = yes; 共享路徑寫權限writable = yes
3.3.2.2 Windows
-
打開文件管理器
點擊此電腦 -
選擇映射網絡驅動器
-
添加
\虛擬機IP地址\share
eg:\192.168.31.169\share -
輸入用戶名&密碼
3.3.2.3 注意
如果連接不上,關閉Linux(sudo ufw disable)和Windows防火墻
3.3.3 scp
3.3.4 共享文件夾
4.系統編譯
4.1 交叉編譯器安裝
- cd /usr/local
sudo mkdir arm
cd arm - 把交叉編譯工具鏈拷貝到/usr/local/arm文件夾(FTP)
sudo chmod 777 arm - 解壓 sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
- 環境變量修改
- 查看環境變量
env
printenv
echo $PATH - 修改環境變量
sudo vim /etc/profile
最后面新一行添加
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
- 重啟sudo reboot
- 測試 arm-linux-gnueabihf-gcc -v
- 編譯
4.2 Uboot
4.2.1綜述
是一套裸機程序,可以理解為板子上電的初始化
Uboot的源代碼,啟動流程,都值得分析,面試會問
4.2.2 編譯
- 安裝編譯必用工具
sudo apt-get install lzop libncurses5-dev u-boot-tools
- 拷貝迅為Uboot源代碼
cd ~
mkdir Linux
mkdir uboot
cd uboot
拷貝FTP
- 解壓
tar -xvf uboot-imx-rel_imx_4.1.15_2.1.0_ga_20200512.tar.gz
cd uboot-imx-rel_imx_4.1.15_2.1.0_ga/
- 編譯
./create.sh
sudo apt install make
Makefile
- .config
- make menuconfig
- Kconfig
- 生成文件
- uboot.imx
- uboot.bin
4.2.3流程
4.2.3.1匯編部分
- 關
- 中斷
- 看門狗
- cache
- mmu
- …
- 進入SVC模式
- 基本硬件初始化
- 時鐘
- 串口
- flash
- 閃存
- 初始化堆棧
- 自搬移
- 重定位
- 內存運行塊
4.2.3.1C語言部分
- 初始化大部分硬件
- 網卡
- 屏幕
- usb
- …
- 把內核搬到內存
4.2.4Uboot源碼簡要分析
4.2.4.1匯編部分
- 跳轉到reset
arch/arm/lib/vectors.S
- arch/arm/cpu/armv7/start.S
-
reset
-
cpu_init_cp15
-
cpu_init_crit
-
arch/arm/cpu/armv7/lowlevel_init.S
-
arch/arm/lib/crt0.S
4.2.4.1C語言部分
-
common/board_f.c
board_init_f
-
common/board_r.c
board_init_r
run_main_loop
-
common/main.c
4.2.5 create.sh
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make distclean
make mx6ul_topeet_emmc_defconfig #.config
make #Makefile
怎么修改.config? make menuconfig
menuconfig界面怎么生成的? Kconfig
4.3 內核
4.3.1 編譯過程
- 拷貝迅為kernel源代碼
cd ~
cd Linux
mkdir kernel
cd kernel
拷貝 FTP
- 解壓
tar -xvf linux-imx-rel_imx_4.1.15_2.1.0_ga_20200903.tar.gz
cd linux-imx-rel_imx_4.1.15_2.1.0_ga
- 編譯
./create.sh - 編譯后自動生成的文件
- arch/arm/boot
image 非壓縮文件
zimage
uimage - arch/arm/boot/dts 設備樹
4.3.2 內核源碼
- 各個文件都是什么意思
- 源碼查看軟件 Source Insight 4.0
- 把解壓完的內核源碼從虛擬機拷貝到Windows
- 新建Source Insight工程
4.3.3 編譯腳本
- #!/bin/bash
bash腳本 - make imx_v7_defconfig
- arch\arm\configs
- .config
- make uImage LOADADDR=0x10008000 -j16
- make modules
- 驅動編譯的兩種方式
- 將驅動編譯進內核:obj-y:yes內建
- 將驅動編譯進ko文件:obj-m:module模塊
- make *.dtb
4.1 設備樹
4.1.1功能
包含芯片&板子 外設信息
系統驅動會匹配設備樹,匹配成功后加載驅動
驅動代碼怎么讀取設備樹信息?
4.1.2 路徑
arch/arm/boot/dts
4.1.3dts
- dtsi soc級
- dts 板級
- topeet_emmc_hdmi.dts
imx6ull-14x14-evk-emmc.dts
imx6ull-14x14-evk.dts
imx6ull.dtsi
4.1.4 dtc(device-tree-compiler 編譯器)
- 編譯
- 反編譯
dtc -I dtb -O dts -o test001.dts topeet_emmc_hdmi.dtb
4.1.4dtb :Blob
4.2 根文件系統proc
根文件系統制作rcs
5.燒錄調試
5.1調試模式V1
5.1.1原理
Uboot從板子emmc啟動
內核、設備樹、根文件系統從服務端(遠程)
- tftp:遠程下載內核、網絡、設備樹
- nfs:掛載網絡根文件系統network file system
5.1.2 網絡搭建
5.1.2.1硬件環境要求
- 板子網口2通過網線直接連接電腦
- 電腦沒有網口 可以買一個網卡轉usb
- 電腦有網口,但是用來連接網絡了(不是WIFI上網)
也可以買一個網口轉USB
5.1.2.2 tftp搭建
虛擬機Linux作為服務端
- cd ~
- mkdir tftpfile
- sudo chmod 777 tftpfile
- sudo apt-get install tftp-hpa tftpd-hpa
- sudo vim /etc/default/tftpd-hpa
修改為如下內容,具體路徑根據自己實際情況
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/wfeng/tftpfile"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l-c-s"
- sudo service tftpd-hpa restart
5.1.2.3 nfs搭建
1.下載
sudo apt-get install nfs-kernel-server rpcbind
2.創建文件夾
cd ~
mkdir nfs
- 修改文件
sudo vim /etc/exports
最后面添加
/home/ling/nfs *(rw,sync,no_root_squash)
具體添加內容 路徑 根據自己的實際情況
wq保存退出
5. 重啟nfs服務:
sudo /etc/init.d/nfs-kernel-server restart
5.1.2.4雙網卡模式設置
5.1.2.4.1 Windows端
將與板子網線連接的電腦網口的網卡設置成靜態IP
網線分別插在電腦網口和開發板網口上,開發板上電
-
找到網卡
-
雙擊點開設置IP地址
-
可以按照如圖設置,設置完記得點確定
5.1.2.4.2 VMware虛擬機設置
-
虛擬機點編輯,然后點虛擬網絡編輯器
-
點更改設置
-
點添加網絡(我添加的是VMnet1,名字不重要)
-
把主機模式改為橋接模式
-
選擇那會改為靜態IP的網卡
5.1.2.4.3 Ubuntu設置
-
虛擬機名字處點右鍵,然后點設置
-
點添加
-
選擇網絡適配器
-
此時會出現一個新的網絡適配器,選中,改為自定義,然后選擇那會的虛擬網卡,我的是VMnet1
-
打開虛擬機終端,輸入ifconfig,會看到兩個網卡,如果沒有就重啟一下Ubuntu(和圖片網卡名字不一致無所謂,第二個網卡沒有IP地址)
-
打開設置
-
選擇網絡,找到第二個沒有IP的網卡,點開開關,然后點設置(齒輪)
-
如果兩個網卡的紫色開關不能同時打開,需要按照下圖給兩個網卡添加不同的Profile,具體添加方式見下一步
-
兩個紫色開關可以同時打開的話,就忽略下圖
-
選IPV4,再選manual,再添加IP信息
-
輸入ifconfig
如圖顯示兩張網卡
- 一個是DHCP動態獲取,用于上網
- 一個是靜態IP,用于與板子通信
ping
5.1.2.5板子uboot網絡設置
- 板子連接串口,打開MobaXterm串口,115200
- 板子上電,在截圖中數字歸零之前按鍵盤任意按鍵,進入uboot設置
- 輸入 printenv 可以查看uboot當前環境變量
- 修改網絡相關環境變量
- 服務器IP,linux的IP
setenv serverip 192.168.31.200
- 網關
setenv gatewayip 192.168.31.1
- 開發板uboot的IP地址
setenv ipaddr 192.168.2.120
- 子網掩碼
setenv netmask 255.255.255.0
- 設置網卡地址
setenv ethaddr 42:03:07:3B:15:5F
- 保存環境變量
saveenv
這一步一定要做,要保存,保存到了emmc中
6. 重啟
reset
- 測試
互相ping
- 重啟板子,重新進入uboot
- 插上網線,打開虛擬機
- ping 虛擬機和windows的IP,如圖所示能ping通即可
顯示 alive就是ping通了,,活著,,,
- 注意:用虛擬機和windows ping uboot 是不通的
也不是ping不通,是uboot代碼里面沒有ping回復機制,或者說沒有相關代碼 - 如果想恢復uboot默認環境變量
env default -a
saveenv
5.1.3 修改uboot引導方式
5.1.3.1 把kernel、設備樹、根文件系統放在對應的文件夾
- tftffile 放內核和設備樹
- zImage:linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/boot/zlmage
- topeet_emmc_hdmi.dtb:/arch/arm/boot/dts/topeet_emmc_hdmi.dtb
- nfs 放根文件系統
- filezila傳輸 :網盤文件rootfs.tar.bz2
- samba傳輸 :網盤文件rootfs.tar.bz2
解壓 :tar -xvf rootfs.tar.bz2
5.1.3.2 進入uboot設置環境變量界面
- uboot前3秒內按任意鍵,進入uboot
- 修改bootcmd
setenv bootcmd 'tftp 80800000 zImage; tftp 83800000 topeet_emmc_hdmi.dtb; bootz 80800000 - 83800000'
下載內核 下載設備樹 加載內核和設備樹
3. 修改bootargs
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.31.200:/home/ling/nfs ip=192.168.31.120:192.168.31.200:192.168.31.1:255.255.255.0::eth0:off'
!!!上面的 /home/ling/nfs 不要復制啊!!!!!!,改成你自己的nfs路徑哦
可以pwd看看自己的路徑名
4, 保存到emmc
saveenv
- 重啟
reset
5.1.3.3 出現nfs掛載失敗問題(nfs版本問題)
解決方法
- Ubuntu打開文件
sudo vim /etc/default/nfs-kernel-server
- 末尾添加
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
前面不要有#
3. 保存
wq!
- 重啟nfs
sudo /etc/init.d/nfs-kernel-server restart
5.1.3.4 掛載成功后
- 用戶名 root
- 密碼 topeet
5.2燒寫到emmc
5.2.1燒寫軟件的使用
5.2.1.1燒寫要準備的
把要燒寫的固件放在這個路徑里,這個是必須的
下面這個路徑是Windows的燒寫工具路徑,別搞錯了
mfgtools_for_6ULL\Profiles\Linux\OS Firmware\files\linux
5.2.1.1固件包括
- Uboot文件
Uboot源碼編譯生成 uboot.imx - 內核文件
內核源碼編譯生成 zImage
路徑arch/arm/boot - 設備樹
內核源碼編譯生成 路徑arch/arm/boot/dts
- topeet_emmc_4_3.dtb
- topeet_emmc_5_0.dtb
- topeet_emmc_7_0.dtb
- topeet_emmc_9_7.dtb
- topeet_emmc_10_1.dtb
- topeet_emmc_1024x600.dtb
- topeet_emmc_hdmi.dtb
- 根文件系統
5.2.2進入USB燒錄模式
5.2.2.1把imx6ul板子撥碼開關撥到USB燒錄模式
5.2.2.2數據線連接到板子上標有OTG的USB口
另一端直接連接電腦USB口
5.2.2.3打開燒錄軟件mfgtools_for_6ULL
注意事項
- mfgtools_for_6ULL\Profiles\Linux\OS Firmware\files\linux里面的固件必須全
- 用右鍵管理員權限打開MfgTool2.exe
- 盡量關掉虛擬機
- 如果打不開,或者報錯,去任務管理器關閉殘余進程
5.2.2.4開發板上電
5.2.2.5看到燒錄軟件顯示 符合 HID 標準的供應商定義設備后
點擊start 開始燒錄
5.2.2.6看到顯示右圖,代表燒錄完成
5.2.2.7關閉軟件先點Stop,再點Exit
5.2.3進入emmc啟動模式
- 燒錄完成后,開發板斷電
- 撥碼開關撥到 EMMC啟動方式
- 數據線插到板子上標有 UART的USB口上
- 打開MobaXterm,選擇對應串口,波特率115200
- 開發板上電
- 系統啟動
用戶名:root
密碼:topeet
6.應用入門
6.1oled&mpu6050使用
- 硬件購買
- 0.96OLED屏幕
- 2.00mm轉2.54mm母對母杜邦線
- 硬件接法
- 應用編譯
arm-linux-gnueabihf-gcc app.c -o app -lm
- 驅動編譯
內核模塊
ko文件
- 單獨編譯
- 單獨加載
insmod
rmmod
lsmod
- 放在網絡文件系統里就可以
設備樹的修改
iic地址
- 七位
- 八位
Z:\Linux\kernel\linux-imx-rel_imx_4.1.15_2.1.0_ga\arch\arm\boot\dts\imx6ull-14x14-evk.dts
mpu6050@68 {compatible = "mpu6050,INV_MPU6050";//interrupt-parent = <&gpio5>;//interrupts = <0 0>;reg = <0x68>;status = "okay";//position = <1>;};oled@3c {compatible = "i2c_oled";reg = <0x3c>;status = "okay";};
6.2應用源碼分析
文件描述符
dmesg查看內核打印的相關信息
dmesg | grep 6050
6.3一切皆文件
6.3.1. 虛擬文件系統
虛擬文件系統提供了一種統一的接口,使得用戶空間程序可以通過文件系統的方式來訪問各種設備和資源
- 文件描述符
- open、close、read、write
6.3.2 簡單文件讀寫測試
/*************************************************************************> File Name: test.c> Author: csgec> Mail: 12345678@qq.com > Created Time: 2025年04月10日 星期四 14時51分38秒************************************************************************/#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include<stdio.h>
int main(){int fd;char buff[]="iamlpy777\n";fd=open("./a.txt",O_RDWR|O_CREAT);if(fd<0){printf("can not open file");return fd;}write(fd,buff,sizeof(buff));memset(buff,'\0',sizeof(buff));lseek(fd,0,SEEK_SET);read(fd,buff,sizeof(buff));printf("buff:%s\n",buff);close(fd);return 0;
}
6.4自啟動
6.4.1自啟動修改文件
- /etc/init.d/rcS
- /etc/rc.local
- systemd
編寫服務配置步驟
新建sh
創建服務
編輯服務
sudo gedit /etc/systemd/system/my_script.service
6.4.2絕對路徑
相對路徑
6.4.3后臺執行
&
6.4.4異步通知
ctrl + c
kill -9 pid
-1SIGHUP 掛起信號 通常用于重新加載配置
-2SIGINT 中斷信號(Ctrl+C) 終止前臺進程
-9SIGKILL強制終止 立即終止,不可攔截
-15 SIGTERM默認終止信號(kill 的默認行為) 允許進程清理資源后退出
-19 SIGSTOP暫停進程(Ctrl+Z) 進程進入暫停狀態,可恢復
7.驅動入門
7.1什么是驅動
7.1.1物理驅動
電機驅動
7.1.2軟件驅動
框架
7.1.2.1應用層
7.1.2.2內核層
- 系統調用
- open
- read
- write
- ioctrl
- close
- 虛擬文件系統
- 驅動代碼
- 字符設備驅動
- 網絡設備驅動
- 塊設備驅動
- 設備接口
7.1.2.3硬件層
各種硬件設備
7.2驅動的分類
7.2.1字符設備驅動
按字節流順序訪問
- 串口
- 鼠標鍵盤
- 攝像頭
7.2.2網絡設備驅動
- 基于TCP/IP協議
- 有線網卡(百兆、千兆、萬兆)
- 無線網卡
- socket
7.2.3塊設備驅動
按塊隨機訪問
- 硬盤
- 存儲卡
多個自己一塊
7.3學驅動學的是什么
代碼框架
內核模塊三要素
- 入口
module_init:insmod - 出口
module_exit:rmmod - 許可證
MODULE_LICENSE(“GPL”);
開源協議
7.4MPU6050驅動流程
7.4.1 module_init(mpu6050_driver_init);
7.4.2 mpu6050_driver_init
7.4.3 i2c_add_driver(&mpu6050_driver);
i2c_register_driver(THIS_MODULE, driver)
7.4.4 mpu6050_driver
- .probe = mpu6050_probe
- .remove = mpu6050_remove
- .id_table = gtp_device_id
- .driver
- .name = “mpu6050”
- .owner = THIS_MODULE
- .of_match_table = mpu6050_of_match_table
{.compatible = “mpu6050,INV_MPU6050”},
7.4.5 mpu6050_probe
7.4.5.1分配設備號 alloc_chrdev_region(&mpu6050_devno, 0, DEV_CNT, DEV_NAME);
- 設備號
- 主設備號
- 次設備號
- 查看主次設備號
cd /dev/
ls -l
- 動態創建
- 靜態創建
- /proc
- 內核數據的映射
- 系統信息查詢接口:cat /proc/cpuinfo
-驗證你注冊的主設備號是否已經生效 cat /proc/devices - 查看中斷號是否被注冊 :cat /proc/interrupts
- 系統信息查詢接口:cat /proc/meminfo
- /sys
7.4.5.2 初始化字符設備結構體cdev_init(&mpu6050_chr_dev, &mpu6050_chr_dev_fops);
7.4.5.2.1. mpu6050_chr_dev_fops
- .open = mpu6050_open 函數作用:打開設備時調用。
mpu6050_init # 進行MPU6050初始化
內部會調用:
i2c_write_mpu6050(mpu6050_client, PWR_MGMT_1, 0X00)
i2c_transfer(mpu6050_client->adapter, &send_msg, 1);
即:通過 I2C 向 MPU6050 寫控制寄存器,通常是喚醒 MPU6050(PWR_MGMT_1 = 0x00)
- .read = mpu6050_read
函數作用:用戶調用 read() 讀取數據時執行。
流程如下
i2c_read_mpu6050(); // 發起 I2C 讀取動作
i2c_transfer(mpu6050_client->adapter, mpu6050_msg, 2); // I2C 收發
copy_to_user(buf, mpu6050_result, cnt); // 將讀取到的數據復制到用戶空間
- mpu6050_release
釋放設備,一般在 close() 時調用。
printk("\n mpu6050_release \n");
7.4.5.2.2綁定設備和fops結構體
fops:file_operations 的縮寫,是 Linux 內核中字符設備驅動的一個核心結構體,用于定義用戶空間調用設備文件時,內核該如何響應。
fops 是一個“函數指針表”,決定了 open()、read()、write() 等操作對應調用驅動中的哪個函數
7.4.5.3 添加設備cdev_add(&mpu6050_chr_dev, mpu6050_devno, DEV_CNT);
7.4.5.4創建設備類 class_create(THIS_MODULE, DEV_NAME);
7.4.5.5 創建設備節點device_create(class_mpu6050, NULL, mpu6050_devno, NULL, DEV_NAME)
7.4.6 module_exit(mpu6050_driver_exit)
i2c_del_driver(&mpu6050_driver)
7.5IOLED驅動流程
7.5.1模塊載入入口module_init(oled_init)
7.5.2oled_init函數中的核心操作
i2c_add_driver(&oled_driver);
將 oled_driver 注冊到 I2C 總線,系統會根據設備樹或板級信息自動調用 .probe = oled_probe。
7.5.3 oled_driver結構體定義
.name = "oled",
.owner = THIS_MODULE,
.probe = oled_probe,
.remove = oled_remove,
.id_table = oled_id,
.of_match_table = oled_of_match_table,
這部分表明該驅動支持的設備匹配方式,包括設備樹或設備 ID。
7.5.4oled_probe 函數中是驅動的核心邏輯:
字符設備注冊流程
alloc_chrdev_region(&devid, 0, 1, "oled"); // 1. 分配設備號
cdev_init(&i2c_cdev, &oled_fops); // 2. 初始化字符設備,并綁定 fops
cdev_add(&i2c_cdev, devid, 1); // 3. 添加到內核
class_create(THIS_MODULE, "oled_class"); // 4. 創建類
device_create(...); // 5. 創建設備節點
oled_fops 是 file_operations 函數指針表:
struct file_operations oled_fops = {.open = oled_open,.write = oled_write,.release = oled_release,.unlocked_ioctl = oled_ioctl,
};
各個函數含義:
函數 | 作用 |
---|---|
oled_open | 初始化硬件,調用 oled_hw_init() ,內部通過 oled_write_cmd() 進行 I2C 配置 ,oled_clear() :oled_write_cmd/oled_write_data;oled_pos(0,0) :oled_write_cmd |
oled_write | 向設備寫入數據,使用 copy_from_user() 獲取用戶數據,調用 OLED_ShowString() 顯示字符串(內部調用 OLED_ShowChar() → oled_write_data() → i2c_transfer() ) |
oled_ioctl | 控制命令,調用 switch-case 來控制顯示等功能 |
oled_release | 關閉設備,釋放資源(或者打印日志) |
7.6模塊卸載:
module_exit(oled_exit)
在卸載函數中調用:
i2c_del_driver(&oled_driver); // 卸載驅動
8.存儲器分類
8.1寄存器
8.2RAM
斷電之后,數據消失
- DRAM
- 電腦的內存條
- 靠電容存儲信息
- 特點:容量大、成本低、需不斷刷新(動態)
- SRAM
- CPU的多級緩存,cache
- 靠門電路來存儲
- 特點:速度快、功耗低、但價格貴、容量小,不需要刷新
8.3ROM
斷電之后,數據長久保存,主要用于固化程序,如 BIOS、啟動程序等。
-
RAM
最早期,不能寫 只能讀 -
PROM
可編程只讀存儲器(Programmable ROM)
只能寫入一次數據 -
EPROM
可編程可擦除只讀存儲器(Erasable Programmable Read Only Memory)
紫外線擦除
需整塊擦除、再重新編程 -
EEPROM
帶電可擦可編程只讀存儲器(EEPROM)
支持電擦除、反復寫入,但速率較慢
-
NorFlash
一次可以讀取一個字,每個bit都可以被尋址
優點:可直接執行代碼(XIP),讀速度快
缺點:寫入速度慢、成本高 -
NandFlash
優點:容量大、價格便宜,廣泛用于數據存儲
應用:SSD、U盤、SD卡、eMMC
eMMC:= NandFlash + 控制器 + 標準封裝接口(用于嵌入式系統)
分類 | 子類 | 特點或用途 |
---|---|---|
RAM | DRAM | 內存條,動態刷新,便宜 |
SRAM | CPU緩存,不刷新,貴但快 | |
ROM | PROM | 只能編程一次 |
EPROM | 紫外線擦除 | |
EEPROM | 電擦除,重復寫入,廣泛用于閃存 | |
NorFlash | XIP,讀取快 | |
NandFlash | 寫入快、便宜、容量大(SSD、U盤等) | |
eMMC | 嵌入式存儲解決方案(手機、MCU等) |