安裝工具:
1.安裝遠程(串口/ssh)調試工具:Secure CRT.exe
2.安裝FTP服務器軟件:CuteFTP Professional.exe
3..安裝TFTP文件傳輸工具:Tftpd32.exe
韋東山的uboot的相關指令:
1.q--退出菜單;
2.menu--進入菜單;
3.print--打印環境變量;
4.set--設置相關參數;
5.save--保存;
6.reset--重啟U-boot;
7.md.w <adress> --md.w 0 // 查看0地址的內容;
8.直接回車則會執行上一次指令;
9.help--短幫助信息;help <cmd>--長幫助信息;
10.mtd--查看flash分區;
一、使用TFTP工具在Nandflash上燒寫裸板程序
1.0.安裝遠程(串口/ssh)調試工具:Secure CRT.exe
從Norflash啟動。
通過串口連接目標板,操作uboot.
1.1.OpenJTAG> print
bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0
bootdelay=2
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
netmask=255.255.255.0
mtdids=nand0=nandflash0
mtdparts=mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)
stdin=serial
stdout=serial
stderr=serial
partition=nand0,0
mtddevnum=0
mtddevname=bootloader
ipaddr=192.168.10.4
serverip=192.168.10.2
Environment size: 443/131068 bytes
1.2.設置windows和目標板uboot的IP
a.設置PC網卡的靜態IP為:
192.168.10.2
255.255.255.0
192.168.10.1
DNS不用設置
只有連接上目標板后,PC才能識別到目標板所在的以太網段,而且和無線外網並不沖突。正常情況下,通過能上網的PC輸入“ipconfig all”可查看當前網絡的網關和DNS。關閉防火牆,否則無法從虛擬機ping到Windows。
配置防火牆:sudo ufw allow from 192.168.10.1
b.設置目標板的靜態IP和Windows服務器的IP:
OpenJTAG> set ipaddr 192.168.10.4
OpenJTAG> set serverip 192.168.10.2 // 此處為TFTP Windows 服務器IP
OpenJ
1.3.打開Tftpd32.exe
選擇文件夾中的目標文件lcd.bin和服務器地址192.168.10.2
1.4.燒寫uboot代碼
a.tftp 30000000 lcd.bin
b.nand erase bootloader
c.nand write 30000000 bootloader
二、使用TFTP工具(Tftpd32.exe)在Nandflash上重燒整個系統
2.1.norflash上的uboot給nandflash燒寫uboot
a.tftp 30000000 u-boot.bin
b.nand erase bootloader
c.nand write 30000000 bootloader
2.2.norflash上的uboot給nandflash燒寫內核
a.tftp 30000000 uImage
b.nand erase kernel
c.nand write.jffs2 30000000 kernel // write.jffs2防止位翻轉
2.3.norflash上的uboot給nandflash燒寫文件系統
a.tftp 30000000 fs_qtopia.yaffs2 // tftp 30000000 fs.yaffs2
b.nand erase root
c.nand write.yaffs 30000000 0x00260000 $(filesize) // write.yaffs 防止位翻轉
or
a.tftp 30000000 fs_qtopia.jffs2
b.nand erase root
c.nand write.jffs2 30000000 0x00260000 $(filesize) // write.yaffs2防止位翻轉
使用NFS在Nandflash上重燒整個系統
2.4.Linux服務器下通過nfs給nandflash燒寫內核和文件系統
a.nfs 30000000 192.168.10.3:/work/system/linux-2.6.22.6/arch/arm/boot/uImage // 失敗
b.nand erase kernel
c.nand write.jffs2 30000000 kernel // write.jffs2防止位翻轉
a.nfs 30000000 192.168.10.3:/work/nfs_root/tmp/fs.yaffs2
b.nand erase root
c.nand write.yaffs 30000000 0x00260000 $(filesize) // write.yaffs 防止位翻轉
使用Linux上的DNW重燒整個系統
2.5.把Linux上的DNW考到服務器的/bin下,在服務器進行如下操作:
$ sudo chmod +x /bin/dnw
$ sudo chmod +s /bin/dnw
先讓VMware處於前台,再接USB
$ lsusb // 查看USB設備已連接
在uboot界面輸入k
$ /bin/dnw arch/arm/boot/uImage // 即可完成USB燒寫
三、使用韋東山做好的ubuntu服務器
3.1.下載安裝VMware
3.2.解壓ubuntu壓縮包
3.3.設置VMware網絡環境,一個物理網卡只能橋接一個虛擬網卡
“編輯/虛擬網絡編輯器/”設置為橋接;
“虛擬機/設置/網絡適配器/”設置為橋接,並選上“復制物理網絡連接狀態”;
3.4使用VMware打開ubuntu
3.5使用SecureCRT的ssh登陸Linux服務器
Hostname:192.168.10.3
Username:book
Key:123456
注意:修改work目錄的用戶權限
# sudo chown book:book /work -R
3.6安裝TFTP工具CuteFTP Professional.exe,傳輸文件。
前提是配置好網絡:
網關:192.168.10.1
Windows主機:192.168.10.2
Linux服務器:192.168.10.3
Linux目標板:192.168.10.4
--------------------------修改ip地址----------------------------
先用ifconfig -a 查看所有的網卡設備。
a.即時生效:
# ifconfig eth3 192.168.10.3 netmask 255.255.255.0
b.重啟生效:
Linux服務器:
# sudo vi /etc/network/interfaces
auto lo
iface lo inet loopback
# The primary network interface
auto eth3
iface eth3 inet static
address 192.168.10.3
netmask 255.255.255.0
gateway 192.168.10.1
#network 192.168.10.0
#broadcast 192.168.10.255
重啟網卡:
# sudo /etc/init.d/networking restart
Linux目標板:
# sudo vi /etc/init.d/rcS
#!/bin/sh
ifconfig eth0 192.168.10.4
或者
$ sudo ifconfig eth0 192.168.10.4
$ sudo ifconfig eth0 down // poen it
$ sudo ifconfig eth0 up // close it
---------------------修改default gateway---------------------
Linux服務器:
a.即時生效:
# route add default gw 192.168.10.1
b.重啟生效:
# vim /etc/network/interfaces
-------------------------------修改DNS---------------------------
Linux服務器:
不用互聯網則不用配置。
# sudo vi //etc/resolv.conf
search chotim.com
nameserver 192.168.1.1
重啟網卡服務即可
# sudo /etc/init.d/networking restart
--------------------------修改host name-----------------------
Linux服務器:
使用下面的命令來查看當前主機的主機名稱:sudo /bin/hostname
使用下面的命令來設置當前主機的主機名稱:sudo /bin/hostname newname
系統啟動時,它會從/bin/hostname來讀取主機的名稱。
--------------------------------------------------------------------
四、給uboot和目標板的Linux原始內核打補丁,制作根文件系統
4.1.uboot打補丁-- uboot.bin
a.$ tar xjf u-boot-1.1.6.tar.bz2 // 目錄在:韋東山\000_開發板光盤\CD1\system
b.$ cd u-boot-1.1.6/ // Linux服務器中的位置:work/system/u-boot-1.1.6
c.$ patch -p1 < ../u-boot-1.1.6_jz2440.patch
d.$ cd ..
e.$ tar cjf u-boot-1.1.6_jz2440.tar.bz2 u-boot-1.1.6 // 放到Windows下的source insight下查看
f.$ cd u-boot-1.1.6/
g.$ make 100ask24x0_config
h.$ make // 即可得到/work/system/u-boot-1.1.6/u-boot.bin
4.2.Linux內核打補丁--uImage
a.$ tar xjf linux-2.6.22.6.tar.bz2
b.$ cd linux-2.6.22.6/
c.$ patch -p1 < ../linux-2.6.22.6_jz2440.patch
d.$ cd ..
e.$ tar cjf linux-2.6.22.6_jz2440.tar.bz2 linux-2.6.22.6 // 放到Windows下source insight下查看
f.$ cd linux-2.6.22.6/
g.$ cp config_ok .config
h.$ make uImage // 即可得到/work/system/linux-2.6.22.6/arch/arm/boot/uImage
4.3.制作根文件系統-- fs.yaffs2
a.$ sudo tar xjf fs_mini_mdev.tar.bz2
// 制作Yaffs2文件系統,要用到mkyaffs2image工具,光盤work/linux/tools下,復制到服務器 /bin
b.$ sudo cp mkyaffs2image /bin
c.$ sudo chmod +x /bin/mkyaffs2image
d.$ cd /work/nfs_root/tmp/
e.$ mkyaffs2image fs_mini_mdev fs.yaffs2 // 即可得到/work/nfs_root/tmp/fs.yaffs2
// 燒寫到目標板
a.nfs 30000000 192.168.10.3:/work/nfs_root/tmp/fs.yaffs2
b.nand erase root
c.nand write.yaffs 30000000 0x00260000 $(filesize) // write.yaffs 防止位翻轉
五、使用mount指令將NFS作為根文件系統
5.1.手工mount服務器上的文件夾/work/nfs_root到目標板上/mnt
1.Linux服務器開啟nfs服務:
sudo apt-get install nfs-kernel-server portmap
vi /etc/exports 增加以下內容: /work/nfs_root *(rw,sync,no_root_squash)
sudo /etc/init.d/nfs-kernel-server restart // 重啟nfs服務
2.目標板掛載nfs:# mount -t nfs -o nolock,vers=2 192.168.10.3:/work/nfs_root /mnt
或者 # mount -t nfs -o nolock,vers=2 192.168.10.3:/work/nfs_root/tmp/fs_mini_mdev /mnt
5.2.使用NFS作為根文件系統來啟動
指令格式:
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
從SDRAM啟動:
OpenJTAG> set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
OpenJTAG> save
OpenJTAG> reset
從網絡文件系統啟動: // 設置失敗,可能是網關少寫了個0,在uboot中能ping通Linux服務器,但是無法使用nfs.
OpenJTAG> set bootargs noinitrd root=/dev/nfs nfsroot=192.168.10.3:/work/nfs_root/tmp/fs_mini_mdev ip=192.168.10.4:192.168.10.3:192.168.10.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
OpenJTAG> save
OpenJTAG> reset
5.2.在服務器的/etc/init.d/rcS啟動腳本中添加指令自動掛載nfs目錄:
a.修改rcS並保存:
# vi /etc/init.d/rcS
#!/bin/sh
ifconfig eth0 192.168.10.4
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mount -t nfs -o nolock,vers=2 192.168.10.3:/work/nfs_root/tmp/fs_mini_mdev /mnt
b.reboot后即可。
六、利用NFS掛載的文件夾,在服務器進行交叉編譯,在目標板進行測試驗證
6.1.在服務器Linux中編譯驅動和測試程序
(1).編譯驅動程序
$ cd first_drv/
$ vi Makefile // 確定開發版的內核位置KERN_DIR = /work/system/linux-2.6.22.6
(2).編譯測試程序
$ arm-linux-gcc -o firstdrvtest firstdrvtest.c
6.2.nfs將服務器的指定文件夾mount到目標板的目錄/mnt中,先在服務器的指定文件夾中編譯,然后在目標板測試相關程序
# /work/nfs_root/tmp/fs_mini_mdev/drivers_and_test/first_drv/
# insmod first_drv.ko // 加載驅動
# ./firstdrvtest // 運行測試程序
Usage :
./firstdrvtest <on|off>
# ./firstdrvtest on // led on
# ./firstdrvtest off // led off
七、修改編譯器版本和驅動
7.1.安裝arm-linux-gcc-x.x.x
1.解壓
$ tar xjf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2
$ cd /arm-linux-gcc-3.4.5-glibc-2.3.6/bin
2.設置環境變量PATH,在環境變量中添加/work/tools/gcc-3.4.5-glibc-2.3.6/bin
$ vi /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/tools/gcc-3.4.5-glibc-2.3.6/bin"
3.立馬生效編譯工具
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/tools/gcc-3.4.5-glibc-2.3.6/bin
7.2.修改目標版(TQ2440或者MINI2440)的LCD和DM9000驅動
1.將驅動代碼從\CD1\drivers_and_test\10th_lcd\4th\lcd.c拷貝到/work/system/linux-2.6.22.6/drivers/video
$ cd /work/system/linux-2.6.22.6/drivers/video
$ vi Makefile
obj-$(CONFIG_FB_S3C2410) += lcd.o #s3c2410fb.o
八、裸機驅動
文件:xxx.S xxx.c xxx.lds Makefile
目標:xxx.o xxx._elf xxx.bin xxx.dis
燒寫:tftp或者nfs燒寫到nandflash的0地址,程序從該處啟動會自動搬移4KB到SRAM。
8.1.裸機程序的啟動
NorFlash啟動:直接從0地址獲取指令。
NandFlash啟動:硬件自動將NandFlash的低4K內容移到片內SRAM,從SRAM0地址開始取指令。
啟動流程:
1.上電,自動復制NandFlash上的代碼;
2.關閉看門狗;
3.初始化時鍾;
4.初始化存儲器等外設;
5.把代碼復制到SDRAM
注意:
1.連接地址:是指運行時,程序所存儲的位置。
0x00000000地址對應片內SDRAM;
0x30000000對應片外SDRAM。
2.MMU:存儲物理地址的表格:頁表(段、大頁、小頁、極小頁),每個表項1M,總共4096個表項目。
3.NandFlash 的讀寫方式和RAM、寄存器的讀取方式不同。
8.2.中斷模式:
1.用戶模式;
2.管理模式;
3.系統模式;
4.中斷模式;
5.快速中斷模式;
6.未定義指令終止模式;
7.數據訪問終止模式
8.3.時鍾系統;
FCLK:400MHz,cpu用。
HCLK:100MHz~133MHz,SDRAM等用。
PCLK:50MHz,Uart、定時器用。
九、u-boot原理分析
9.1.bootloader的作用:
1.啟動內核:
flash和sdram讀寫;
初始化sdram;
啟動內核;
2.升級新固件:
網絡;
串口;
usb;
sd卡等。
9.2.uboot啟動后要做的事:
0.設置為管理模式
1.關閉看門狗,屏蔽中斷;
2.初始化時鍾;
3.初始化SDRAM;
4.從flash中復制程序到SDRAM;
5.設置棧,SP指向內存;
6.代碼重定位;
7.清理BSS段;
6.調用start.armboot,跳轉到內核c代碼,運行。
分析uboot的Makefile可知:
1.第一個文件:cpu/arm920t/start.S
2.鏈接地址:board/100ask24x0/u-boot.lds
uboot在內存中的地址TEXT_BASE=0x33f80000 在board/100ask24x0/config.mk
uboot中的關鍵函數:
1.s=getenv("bootcmd"); // 獲取環境變量
run_command(s); // 執行環境變量對應的指令
3.readline(); // 讀取menu界面串口輸入的指令
run_command(s);
make clean僅僅是清除之前編譯的可執行文件及配置文件。
而make distclean要清除所有生成的文件。
flash分區:
MTDPARTS_DEFAULT
name size offset
from 0 to 256k is bootloader: 0x00040000 0x00000000
next 128K is params: 0x00020000 0x00040000
next 2M is kernel: 0x00200000 0x00060000
next all is root: 0x0fda0000 0x00260000
OpenJTAG> mtd
#: name size offset mask_flags
0: bootloader 0x00040000 0x00000000 0
1: params 0x00020000 0x00040000 0
2: kernel 0x00200000 0x00060000 0
3: root 0x0fda0000 0x00260000 0
active partition: nand0,0 - (bootloader) 0x00040000 @ 0x00000000
defaults:
mtdids : nand0=nandflash0
mtdparts: mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)
9.3.u-boot源代碼分析:
1.uboot打補丁/編譯/燒寫/試驗。
2.uboot功能/結構分析,結合Makefile。
3.uboot的命令操作,添加一個指令。
4.啟動內核的過程:
(1)讀出flash: nand.read();
(2)啟動內核:do_boot
(a)讀出uImage的頭部(獲取加載地址和寫入地址,校驗等)
(b)設置啟動參數TAG:
0x30000100 -- 即bd->bi_boot_params
setup_start_tag(bd);
setup_memery_tag(bd);
setup_commandline_tag(bd, commandline);
bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
setup_end_tag(bd);
(c)跳到內核入口地址:
theKernel(0, bd->bi_arch_numer, bd->bi_boot_params);
// bd->bi_arch_numer = MACH_TYPE_S3C2440;機器ID
// bd->bi_boot_params = 0x30000100;
十、內核啟動流程
10.1.內核打補丁/編譯/燒寫/試驗
patch -p<1> <補丁文件名>
10.2.內核功能/結構,結合Makefile/Kconfig分析
(1)配置:
method1: make menuconfig,自定義配置
method2: use default config,change little in directory of "arch/arm/configs".
執行:make xxx_defconfig 和 make menuconfig,在出現的菜單中進行配置。
method3: use vendor config
(2)分析Makefile和鏈接腳本
內核啟動階段一:處理uboot傳入的參數; // in arch/arm/kernel/head.s
判斷是否支持該架構和單板,獲取機器ID;
建立一級頁表;
設置arm920CPU核,禁用I、D caches等;
使能MMU;
復制數據段,清楚BSS段,設置棧指針,保存CPU ID到processor id;
跳轉__machine_arch_type變量調用到start_kernel(),這是init/main.c的c函數;
內核啟動階段二:
輸出Linux版本信息;
設置與體系結構相關的環境;
初始化控制台;
啟動reset_init()
10.3.內核啟動過程分析
內核啟動的完整過程如下:
start_kernel()
-setup_arch() // 解析uboot傳入的參數
-setup_command_line() // 解析uboot傳入的參數
+do_early_param
-unknown_bootoption
+obsolete_checksetup
-reset_init()
+kernel_init()
prepare_namespace()
mount_root() // 掛載根文件系統
init_post() // 啟動應用程序。
十一、構建最小根文件系統
11.1.根文件系統的啟動
busybox->init_main
parse_inittab
file = fopen(INITTAB, "r"); // 打開配置文件"/etc/inittab"
new_init_action // 新建一個new_init_action結構體,並加入鏈表init_action_list
//
run_actions(SYSINIT);
waitfor // 等待process執行
run(a) // 創建子進程
waitpid // 等待結束
delete_init_action
run_actions(WAIT);
run_actions(ONCE);
while(1)
{
run_actions(RESPAWN);
run_actions(ASKFIRST);
wpid = wait(NULL); // 等待子進程退出
while (wpid > 0) {
a->pid = 0;
}
}
Format for inittab: <id>:<runlevels>:<action>:<process>
<id>:/dev/id,to specify the controlling tty: stdin, stdout, stderr, printf, scanf, err
<runlevels>: The runlevels field is completely ignored.
<action>:Valid actions include: sysinit, respawn, askfirst, wait, once, restart, ctrlaltdel, and shutdown.何時執行
<process>:Specifies the process to be executed and it's command line.應用程序和命令行。
exp:new_init_action(ASKFIRST, "-/bin/sh", "/dev/tty2");
11.2.最小根文件系統所需內容和工具:
操作終端:/dev/console /dev/null
busybox產生的init程序:/sbin/init
配置文件:/etc/inittab
配置文件里指定的應用程序:
庫文件:c庫(printf/fopen/fwrite...)
11.3.構建自己的最小根文件系統
a.配置、編譯busybox
win10資料目錄:CD1\system\busybox-1.7.0
linux服務器目錄:/work/system
$ tar xjf busybox-1.7.0.tar.bz2
$ cd busybox-1.7.0/ // INSTALL有操作說明 :make menuconfig/make/make install
$ vi Makefile // 加入下面一段
CROSS_COMPILE ?= arm-linux-
$ make menuconfig
Busybox Settings ---> Busybox Library Tuning --->
[*] Tab completion
$ mkdir -p /work/nfs_root/first_fs
$ make CONFIG_PREFIX=/work/nfs_root/first_fs install // 即可生成文件系統主體
b. 操作終端,添加文件節點 /dev/console /dev/null
$ mkdir dev
$ sudo mknod console c 5 1
$ sudo mknod null c 5 3
c.設置配置項/etc/inittab
$ cd /work/nfs_root/first_fs/
$ mkdir etc
$ vi etc/inittab // 加入下面
console::askfirst:-/bin/sh
d.安裝C庫
$ cd /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib
$ mkdir /work/nfs_root/first_fs/lib
$ cp *.so* /work/nfs_root/first_fs/lib -d
到此,得到最小根文件系統:bin dev etc lib linuxrc sbin usr
d.指定應用程序
e.制作yaffs映像文件
$ cd /work/system
$ tar -xjf yaffs_source_util_larger_small_page_nand.tar.bz2
$ cd Development_util_ok
$ cd yaffs2/
$ cd util
$ make
$ sudo cp mkyaffs2image usr/local/bin
$ sudo chmod +x /usr/local/bin/mkyaffs2image
$ cd /work/nfs_root
$ mkyaffs2image first_fs first_fs.yaffs2 // 即可得到文件系統的映像文件
11.4 完善最小文件系統
inittab中指定初始化配置文件列表,包括終端“consol::askfirst:-/bin/sh”和啟動腳本"::sysinit:/etc/init.d/rcS"等等。
/etc/init.d/rcS中mount -t proc none /proc 就可以使用“ps”命令
或者在rcS中寫“mount -a”替換上面mount指令,然后在/etc/fstab目錄下面加入要mount的設備信息。
11.5 從nfs啟動根文件系統
服務器允許別人掛接:在服務器的/etc/exports中加入"/work/nfs_root/first_fs *(rw,sync,no_root_squash )"
然后重啟nfs服務: sudo /etc/init.d/nfs_kernel_server restart
在目標板手動掛載目錄到服務器上:sudo mount -t nfs 192.168.1.19:/work/nfs_root/first_fs /mnt
修改啟動時的命令行參數,在/linux-2.6.22.6/Documentation/nfsroot.text中有介紹:
十二、字符設備驅動
12.1.字符設備的調用關系
應用層:c庫實現open/read/write
VFS:sys_open/sys_read/sys_write
驅動層:xxx.open/xxx.read/xxx.write
12.2.第一個字符設備驅動,點亮led
1.在win10中的CD1\Workspace\linux_projects\linux-2.6.22.6\test_file中新建一個first_drv.c的文件,編輯代碼。
2.放到linux服務器/work/nfs_root/first_fs/test_file目錄編譯,/work/nfs_root目標被mount到了目標板的/mnt目錄。
3.目標板上加載模塊:
# cd /mnt/first_fs/cd test_file/
# insmod /mnt/first_fs/test_file/first_drv.ko
4.# cat /proc/devices 查看設備
5.linux服務器/work/nfs_root/first_fs/test_file目錄中從win10復制一個first_drv_test.c,並用arm-linux-gcc編譯,
6.手動創建底層驅動設備節點,建立節點和底層驅動(設備類型和設備號)之間的聯系,以給上層的應用調用:# mknod /dev/xxx c 252 0
7.在目標板# ./first_drv_test,即可看到打印的信息。
8.移除字符設備# rmmod first_drv
9.在代碼中更新系統信息,讓系統自動加載設備節點。
class_create(); class_device_create();
class_device_unregister(); class_destroy();
物理地址到虛擬地址的映射:gpfcon = (volatile unsigned long) ioremap(0x56000050, 16);
用戶空間和內核空間傳遞數據:copy_from_user(&val, buf, count); // copy_to_user();
加入當前許可證信息:MODULE_LICENSE("GPL");
10.目標板/sys/class/firstdrv/xyz下即為設備節點。
11.# rmmod first_drv后,設備節點也會自動刪除。
# cat /proc/devices 查看所有運行的設備
# ls -l /dev/xyz 查看節點設備類型
# cd /sys/class/firstdrv/xyz 查看設備節點的具體內容
12.3.查詢方式獲取按鍵值
創建file_operations結構體;
建立相應的操作函數;
創建初始化設備的函數,設置主設備號和名字,創建設備類讓系統自動加載設備節點 ,gpio物理地址到虛擬地址的映射 ;
創建卸載函數;
加入到系統,module_init
說明許可證類型,MODULE_LICENSE("GPL");
top查看任務管理器。
12.4.中斷方式獲取按鍵值
手動執行按鍵底層驅動
# exec 5</dev/buttons
# cat /proc/interrupts // 查看所有的中斷信息
# ps // 查看進程ID等信息
# ls -l /proc/771/fd
# exec 5<& // 關閉/dev/buttons
# top 查看任務管理器
# ./fifth_drv_test & // 后台運行
12.5.設定時間內poll方式獲取按鍵值,超時后退出
12.6.異步通知方式獲取按鍵值
給進程發信號指令: kill -USR1 PID
kill -USR1 833 // kill -10 833
kill -9 833
過程:注冊信號處理函數、驅動通過kill指令發送信號給app的PID
12.7.同步互斥阻塞方式獲取按鍵值
同一個時刻只能有一個app能操作底層接口。
a.使用原子操作:
b.信號量
十三、自己寫u-boot
13.1.自己寫bootloader
暫時省略。