欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

熟悉S3C44B0X開發(fā)板的開發(fā)流程

系統(tǒng) 2037 0

熟悉 S3C44B0X 開發(fā)板的開發(fā)流程

一. Bootloader

1. 建立 Cygwin 虛擬 linux 環(huán)境

(1) 點擊 setup.exe 開始安裝

(2) 點擊下一步,進入選擇安裝方法的界面:

1 安裝界面

圖二選擇安裝途徑界面

在這里,如果你的安裝文件沒有下載到本地,你可以選擇從 Internet 安裝。我們選擇從本地安裝,點擊下一步繼續(xù)。

圖三選擇安裝路徑等

圖四選擇 Cygwin 安裝程序路徑

(3) 選擇好 Cygwin 安裝程序的路徑后點擊下一步繼續(xù)安裝。

圖五選擇安裝模塊

(4) 選擇好自己需要的模塊后,點擊下一步繼續(xù)安裝

圖六選擇自己需要的模塊安裝

圖七拷貝文件過程

8 結束安裝

接下來 Cygwin 會進行自解壓過程

9Cygwin 自解壓過程

10 環(huán)境變量設置

安裝好 Cygwin 后,我們還需要設置一下環(huán)境變量。打開系統(tǒng)屬性對話框,點擊高級 - 56518. 環(huán)境變量,打開環(huán)境變量設置窗口。

11 新建環(huán)境變量

點擊新建按鈕增加一個環(huán)境一個用戶級的環(huán)境變量 PATH=C:/Cygwin/bin ,將 Cygwin/bin 目錄加入到用戶的 PATH 環(huán)境變量中,這樣用戶可以在任何路徑下都可以執(zhí)行 Cygwin/bin 目錄中的命令。

12 設置新的環(huán)境變量

至此 Cygwin Windows 下安裝就已經(jīng) OK 了。

2. 安裝基于 Cygwin ARM 平臺交叉編譯器

在Windows下安裝好Cygwin后,我們需要建立編譯arm程序的環(huán)境,也即安裝arm-tools工具。

將光盤目錄光盤:/工具/編程工具/armtools/windows版本復制到本地硬盤(在這里我們在D:盤建立一個armtools的目錄,然后將光盤:/工具/編程工具/armtools/windows版本復制到這里),然后在dos環(huán)境下進入此目錄,執(zhí)行unpack.bat批處理命令,解壓縮過程開始,不用關心在解壓縮的最后出現(xiàn)錯誤提示。請參看以下截圖:

最后添加將armtools的命令路徑添加到Windows的環(huán)境變量Path中。注意在上一步解壓的過程中,armtools被解壓到Cygwin的安裝目錄下,在這里Cygwin是安裝在C:/根目錄下的。這樣armtools交叉編譯環(huán)境就安裝好了。

3. u-boot 簡介

U-BOOT是一個開源bootloader,是由德國的工程師WolfgangDenk從8XXROM代碼發(fā)展而來的,它支持很多處理器,比如PowerPC、ARM、MIPS和x86。目前,U-BOOT源代碼在sourceforge網(wǎng)站的社區(qū)服務器中,Internet上有一群自由開發(fā)人員對其進行維護和開發(fā),它的項目主頁是http://sourceforge.net/projects/U-BOOT。U-BOOT的最新版本源代碼可以在Sourceforge的CVS服務器中匿名獲得。由于其成熟和穩(wěn)定,已經(jīng)在許多嵌入式系統(tǒng)開發(fā)過程中被采用。

為什么我們需U-BOOT?顯然可以將ucLinux直接燒入flash,從而不需要額外的引導裝載程序(bootloader)。但是從軟件升級的角度以及程序修補的來說,軟件的自動更新非常重要。

4. 編譯 u-boot

a) 在linux(或其他linux虛擬環(huán)境下,如cygwin)解壓源碼包,在這里我們選擇在Windows系統(tǒng)下的Cygwin環(huán)境下來編譯。先將光盤中的u-boot包拷貝到系統(tǒng)的一個目錄下,在這里我們拷貝到D:盤的s3c44b0目錄下

tarzxvfu-boot-xxxxxxxx.tar.gz

b) 解壓后進入u-boot目錄,輸入 makedistclean 清除上一次編譯的輸出文件

C) 輸入 makeITSN_s3c44b0_config ,以產(chǎn)生一些編譯配置文件(.mk文件)和相應的一些頭文件(.h文件)

d) 編譯,執(zhí)行 make

這一步驟生成了三個文件,其中:

u-boot,ELF文件格式,使用Flashpgm工具來打開此文件編程到Flash當中

u-boot.bin是二進制文件,使用Fluted工具來將此文件編程到Flash當中

5. U- BOOT 下載

在這里我們介紹兩種方法來將編譯好的U-Boot編程Flash,一種是使用Flashpgm工具,另外一種是Fluted工具。

a) FlashPgm

FlashPgm是什么公司的,是一個GUI界面的Flash編成工具。由于其友好的編程界面,更快的編程速度和更高的編程成功率使其被大家普遍使用。在使用FlashPgm編程Flash的時候注意使用JTAG板的Wiggler接口連接到目標板上,F(xiàn)lashPgm不支持STD的JTAG接口。打開Configuration菜單下的Communications可以設置設置FlashPgm的連接方式,在這里我使用,同時確保JTAG板的J5條線到Wiggler接口狀態(tài)。

點擊菜單File-Open選擇.ocd文件。Ooc文件是一個硬件系統(tǒng)的配置文件,設置了CPU,Flash類型,F(xiàn)lash接口的位寬等具體的參數(shù),可通過FlashPgm生成。光盤上已經(jīng)帶有兩個已經(jīng)配置好的.ocd文件,在光盤:/工具/Flash編程工具/目錄,其中包含兩個.ocd文件。

44B0X_SST.ocd —— 配有SST39VF160Flash的學習板使用

44B0X_AMD.ocd —— 配有AM29LV160Flash的學習板使用

點擊FlashID按鈕檢測一下FlashID能夠讀取到,以測試JTAG連接是否正常。如果能夠正常讀取出來,表示JTAG連接沒有問題

點擊Program按鈕,在出現(xiàn)的對話框中選擇編譯好的u-boot文件(ELF格式的),然后選擇在編程前先擦除選型,點擊Program。首先將會擦除相應的Flash區(qū)域,然后編程和校驗。進度條將顯示當前編程進度。

正在擦除 Flash

編程,校驗成功

這時候超級中斷將顯示 U-BOOT 打印輸出,通過 FlashPgm 成功的將 U-BOOT 燒寫到 Flash 當中。

B) Fluted.exe

Fluted.exe是一個基于命令行方式的Flash編程工具,其只支持STD方式的JTAG鏈接。以下是其運行的參數(shù):

命令:(大小寫無關)

R —— 讀Flash

W —— 寫Flash

E —— 擦除Flash

V —— 校驗Flash

T —— 測試掃描線

A —— 擦除+寫Flash

選項:(大小寫無關)

-V校驗(默認是關閉的,也就是說默認不校驗)

-DDebug模式(默認關閉)

-C指定配置文件(默認是default.fcd)

-F指定數(shù)據(jù)文件

-S指定Flash起始地址(十進制方式)

-L指定寫入的數(shù)據(jù)長度(256或者文件的大小,十進制方式)

一般我們使用Fluted.exe的方法如下,

allowio.exeFluted/aA Fu-boot.bin-V-S0

此命令將u-boot.bin文件(二進制)寫入到Flash,從地址0開始,使用默認的default.fcd文件,通常編寫將上述命令放在一個.bat批處理文件來方便執(zhí)行。

Fluted.exe工具編程的速度相對FlashPgm要慢得多,參看下圖實際的編程過程。

Fluted.exe 工具編程過程

6. U-BOOT的使用

系統(tǒng)上電后,U-BOOT開始執(zhí)行,在串口超級終端軟件上將有答應輸出,在3秒鐘內(nèi)按任意鍵,將進入U-BOOT命令提示符,如下圖。其中輸出信息提示SDRAM是8M字節(jié),F(xiàn)lash是2M字節(jié)。

執(zhí)行help指令,將顯示U-BOOT支持命令,常用U-BOOT指令有:

命令

功能

go

執(zhí)行指定地址上的程序

bootm

引導應用程序或者操作系統(tǒng)(壓縮格式)

tftp

通過太網(wǎng)調(diào)入指定的文件到指定的內(nèi)存地址

loadb

通過串口以kermit方式下載文件

md

Memorydisplay,顯示指定地址的值

mm

ModifyMemory,修改內(nèi)存指定地址的值

mw

MemoryWrite,寫內(nèi)存

cp

數(shù)據(jù)復制,如果目的地址空間在Flash中,就可以通過cp來寫Flash

printenv

顯示環(huán)境變量,如IP地址等

setenv

設置環(huán)境變量

Saveenv

保存環(huán)境變量

erase

擦除指定地址的Flash

flinfo

顯示Flash的信息

reset

復位CPU

version

顯示版本信息

?/help

顯示幫助信息

二. uClinux 編譯與下載

1 .建立編譯環(huán)境

與在 Windows Cygwin 環(huán)境下編譯 U-BOOT 類似,我們在 linux 下編譯運行在 ARM 上的程序同樣需要使用交叉編譯工具 armtools 。將光盤: / 工具 / 編程工具 /armtools/linux 版本 /arm-elf-tools-20040427.sh 拷貝到硬盤后執(zhí)行這個程序?qū)詣影惭b此 armtools 交叉編譯器。

2. 編譯 uClinux

uClinux 的壓縮包拷貝到 linux 主機上,然后通過下列命令解壓縮源碼包,這樣會在當前的目錄下面生成 uClinux-dist 目錄。(在這里,我們通過通過 SecureCRT 超級終端工具用 ssh 登陸到 Linux 主機的 , 因為在 Cygwin 的虛擬 Linux 環(huán)境下不能使用 makemenuconfig 。)

tarzxvfuClinux-dist-xxxxxxxx.tar.gz

進入 uClinux-Distru 目錄執(zhí)行 makemenuconfig ,將彈出以下的配置 uClinux 界面,如下。

選擇 Vendor/ProductSelection---> 進入下級菜單,我們的配置如下:

選擇 Exit 返回上級界面,然后選擇 Kernel/Library/DefaultsSelection---> ,界面如圖:在這里我們我們選擇了使用的 linux 內(nèi)核版本 linux-2.4.x Libc 版本選擇 uClibc ,然后選中 CustomizeKernelSettings( 內(nèi)核配置 ) CustomizeVendor/UserSettings(NEW)( 廠商 / 用戶程序設置 ) 進行更進一步的配置。

退出后選擇Yes保存配置信息,如下圖。

我們在上面配置的時候選擇了CustomizeKernelSettings和CustomizeVendor/UserSettings(NEW)選項。所以程序會自動進入KernelSettings和Vendor/UserSettings界面。

注:makemenuconfig將打開上一次的配置選項,如果希望重新構建一個全新的內(nèi)核,可以在makemenuconfig之前先運行makemrproper。

KernelSettings ,內(nèi)核配置界面

Vendor/UserSettings界面

這樣完成了上面兩個配置后,整個uClinux的配置就結束了。接下來編譯uClinux。依次執(zhí)行如下指令:

makedep

makeclean

makelib_only

makeuser_only

makeromfs

makeimage (這一步報錯不用管,只要下一步?jīng)]有錯就行)

make

完成所有的操作后,在uClinux-dist/images/目錄下將生成uclinux_rom.bin(二進制壓縮文件)。接下來我們可以通過U-BOOT配合串口或者網(wǎng)口來將此文件下載到Flash當中。

3. uClinux 下載到 Flash

我們這里通過U-BOOT提供的幾種方式來將編譯好的uClinux下載到Flash當中運行。

a )串口下載(下載速度慢):

U-BOOT 命令提示符下輸入 loadb0xC500000 命令 (0xC500000 是下載文件存放的地址, SDRAM ) U-BOOT 將等待用戶傳送文件。然后我們啟動超級終端的文件發(fā)送,點擊菜單傳送 -> 發(fā)送文件,出現(xiàn)發(fā)送文件對話框。選擇好發(fā)送協(xié)議為 Kermit 協(xié)議,選擇發(fā)送的文件,然后點擊發(fā)送。這時候出現(xiàn)發(fā)送進度對話框

文件發(fā)送完后, uClinux 的壓縮的二進制文件就存放在地址 0xC500000 SDRAM 空間)上了。

如果我們要測試新編譯的 uClinux 運行情況,可以直接輸入 bootm 命令,這樣 U-BOOT 就會在當前放置下載的程序的地方 ( 這里是 0xC500000) 解壓縮代碼到指定地址,然后跳轉(zhuǎn)到這個地址開始運行程序

接下來我們通過cp命令將數(shù)據(jù)從0xC500000寫入到Flash中的0x50000開始的地方。在復制數(shù)據(jù)之前,先將Flash對應的區(qū)域刪除。拷貝數(shù)據(jù)的長度是按照雙字來操作的,所以我們需要將字節(jié)長度/4+1來得到最終要輸入的長度參數(shù)(16進制)。

數(shù)據(jù)寫入到Flash空間的0x50000后,我們可以重啟我們的系統(tǒng),就可以看到這個啟動過程了。U-Boot啟動后,3秒鐘內(nèi)如果超級終端沒有任何輸入,就會自動從Flash0x50000(0x50000這個地址是U-B0OT程序編程固定的,可以根據(jù)需要修改)的地址上將壓縮的uClinux解壓縮到0xc008000(SDRAM)上,然后跳轉(zhuǎn)到這個地址上,開始uClinux的啟動。

b) 網(wǎng)口下載(下載速度快):

網(wǎng)口下載是通過tftp協(xié)議的,在下載之前先確認一下U-BOOT的環(huán)境變量配置是否正確,在U-BOOT的命 令提示符下輸入printenv顯示環(huán)境變量(啟動參數(shù)),如下圖:

其主要的環(huán)境參數(shù)包括:

bootcmd —— 啟動命令,也就是U-Boot啟動后如果在指定時間內(nèi)沒有按下任何按鍵后執(zhí)行的指令。

bootdelay —— 指定自動啟動的等待時間,單位為秒

baudrate —— 串口波特率

etheaddr —— 以太網(wǎng)芯片的MAC地址

stdin —— 指定標準輸入設備

stdout —— 指定標準輸出設備

stderr —— 指定標準錯誤輸出設備

bootfile —— 通過tftp從服務器上獲取的文件名

ipaddr —— 本機(S3C44B0板)的IP地址

serverip —— 運行tftp服務器程序的PC機IP地址

我們在使用tftp下載的時候要關心的參數(shù)是bootfile,ipaddr,serverip三個。

需要保證服務器的IP與目標板的IP在同一個網(wǎng)段內(nèi)。如果需要修改參數(shù)可以通過setenv命令修改,例如:

=>setenvipaddr192.168.1.104//設置本級的IP為192.168.1.104

=>setenvserverip192.168.1.100//設置Server的IP為192.168.1.100

=>setenvbootfile uclinux_rom.bin //設置tftp獲取uclinux_rom.bin文件

注意在使用的時候不要使用 = ,例如setenvipaddr=192.168.1.104是錯誤。

先將PC機的tftp服務器軟件啟動,在這里我們使用的CiscoTFTPServer(安裝文件在光盤:/工具/FTP軟件/tftpserver/TFTPServer1-1-980730.exe)。第一次啟動我們需要設置tftp服務器的本地路徑,點擊view->Options彈出tftp設置窗口,如圖6-13所示。在這里我們主要設置tftp的服務器路徑(就是包含你需要下載到學習板的文件的目錄路徑)。單擊確定后,tftp服務器就設置好了,這時候我們可以使用U-Boot來下載uclinux到目標板上了。

然后在U-BOOT命令提示符下輸入tftp0xC500000命令,下載就開始了。下載完后界面如下:

tftp 下載完界面

同時CiscoTFTPServer也將打印相應的信息,如下圖。

后續(xù)的操作如同串口下載一樣,我們可以通過bootm直接解壓縮代碼執(zhí)行,也可以先將Flash擦除,然后通過cp命令將壓縮代碼寫入Flash,這樣每次U-BOOT都能夠在啟動的時候自動解壓并運行這個程序。

我們也可以使用光盤:/工具/FTP軟件/tftpserver/tftpd32.exe這一個tftp服務器端軟件,其使用方法很簡單,無需安裝,直接啟動后設置下載文件的服務器路徑(此路徑包含了我們需要下載的文件)就好了。下載界面參看下圖

三. 應用程序

lo 1 Helloworld

建立 helloworld 應用程序步驟如下:

uClinux-dist/user 目錄下新建目錄: Myapp

1 1 編寫 Helloworld 程序

編寫 demo.c 文件,代碼如下:

#include<stdlib.h>

#include<stdio.h>

intmain(void)

{

printf( HelloWorld!Thisismyfirstapplication./n );

return0;

}

保存在 Myapp 目錄下。

1 2 編寫 Makefile 文件

內(nèi)容如下:

EXEC=demo

OBJS=demo.o

all:$(EXEC)

$(EXEC):$(OBJS)

$(CC)$(LDFLAGS)-o$@$(OBJS)$(LDLIBS)

romfs:

$(ROMFSINST)/bin/$(EXEC)

clean:

-rm-f$(EXEC)*.elf*.gdb*.o

同樣放在 Myapp 目錄下。

1 3 修改 user/Makefile

為了讓編譯器編譯上述添加的內(nèi)容,在 user/Makefile 中添加一句(一般按照字母

排列):

dir_$(CONFIG_USER_MYAPP_DEMO)+=Myapp

1 4 修改 config/config.in

config/config.in 文件中添加的內(nèi)容會在對用戶選項進行配置時反映出來。在文件

的最后,增加一條:

###################################################################

mainmenu_optionnext_comment

comment'MyNewApplication'

bool'demo'CONFIG_USER_MYAPP_DEMO

endmenu

###################################################################

輸入 makemenuconfig

選擇

然后 exit 保存,自動進入下一個畫面

選擇 Myapplication 回車,出現(xiàn)

選中,然后退出,保存。

接著執(zhí)行:

makedep

makeclean

makelib_only

makeuser_only

makeromfs

makeimage

make

下載到開發(fā)板,可以通過串口終端在 teraterm 看到 bin 下面多了一個 demo 程序。

輸入 ./demo 啟動演示程序

輸出: HelloWorld!Thisismyfirstapplication.

四. 驅(qū)動程序的編寫

一個簡單的驅(qū)動程序

一個典型的驅(qū)動程序 , 大體上可以分為以下兩個方面 :

1) 注冊設備 : 在系統(tǒng)初啟時 , 必須將設備登記到相應的設備數(shù)組 , 例如 : 對于字符驅(qū)動設備來說 , 要使用 register-chrdev() 來注冊設備的驅(qū)動號 , 然后對這個設備的所有調(diào)用都用這個設備號來實現(xiàn) ;

2) 定義功能函數(shù) : 對于每一個驅(qū)動函數(shù)來說 , 都有一些和此設備密切相關的功能函數(shù) , 就最常用的字符設備來說 , 都存在著諸如 open() read() write() ioctrol() 這一類的操作。當系統(tǒng)調(diào)用這些操作時 , 將自動的使用 file-operations 結構中對應的函數(shù)來實現(xiàn)具體的操作 ; 在編寫驅(qū)動程序前 , 不得不提 file-operations 這個結構 , 每個設備都有自己的 file-operations 結構 , 它定義了設備的基本入口

, 即上面提到的功能函數(shù)。下面以一個簡單的演示例子 , 說明編寫字符設備驅(qū)動程序的具體過程 , 設備取名為“ test , 設備號定為 254, 當然這個設備并沒有涉及真正的硬件 , 僅是從內(nèi)核空間拷貝了一些特定數(shù)據(jù)到用戶空間。

第一步 : 在目錄 /linux-2 . 4 .x /drives/char 編寫源

程序 test.c, 源碼如下 :

頭文件和全局變量 :

#include<linux/module.h>

#include<linux/kernel.h>

#include<linux/types.h>

#include<linux/fs.h>

#include<linux/mm.h>

#include<linux/errno.h>

#include<asm/uaccess.h>

inttest_major=254;

// 讀函數(shù) , 僅向用戶緩沖區(qū)填入數(shù)據(jù) 1

staticssize_tread_test(structfile*file,char*buf,ssize_tcount,loff_t*f_pos)

{

intleft,ret;

chardata=0x41;

for(left=count;left>0;left--)

{

put_user(data,buf);buf++;}

returncount;

}

// 寫函數(shù) , 空操作

staticssize_twrite_test(structfile*file,char*buf,ssize_tcount,loff_t*f_pos)

{returncount;

}

// 打開函數(shù)

staticintopen_test(structinode*inode,structfile*file)

{

MOD_INC_USE_COUNT;return0;}

// 釋放函數(shù)

staticvoidrelease_test(structinode*inode,structfile*file)

{

MOD_DEC_USE_COUNT;}

structfile_operationstest_fops={

read:read_test,

write:write_test,

open:open_test,

release:release_test,

};

// 注冊函數(shù)

inttest_init(void)

{

intresult;

result=register_chrdev(254,"test",&test_fops);

if(result<0){printk("test:cannotgetmajornumber!/n");

returnresult;}

return0;

}

// 撤消函數(shù)

voidcleanup_module(void)

{unregister_chrdev(test_major,"test");}

第二步 : 添加設備 ;

1) 修改 l in ux-2 . 4.x/driver/char/Makefile 在適當位置添加一行 :obj - (CONFIG - TEST)+=test.o

2)linux-2 1 4.x/driver/char/Config.in, 添加一行 :bool testdevice CONFIG - TEST

3) 修改 linux-2 1 4.x/driver/char/mem.c 在適當位置添加 :

#ifdefCONFIG - TEST

externvoidtest - init(void);

#endif

同時在 chr - dev - init() 函數(shù)中添加 :

#ifdefCONFIG - TEST

test - init();

#endif

4) 修改 vendor/Samsung/44bb0/Makefile 建立設備節(jié)點 :

12---35 行間 ,DEVICE 部分添加如下內(nèi)容 test,c,254,0

5)makemenuconfig, characterdevice 選中 testdevice

重新編譯內(nèi)核 , 在控制臺輸入

/proc>catdevices

Characterdevices:

1mem

2pty

3ttyp

4ttyS

5cua

10misc

162raw

180usb

254test

Blockdevices:

1ramdisk

31Blkmem

/proc>

就包含了名為“ test ”的設備驅(qū)動 , 下面的例子是用于驗證這個設備驅(qū)動程序 .

B. 應用程序的編寫

在μ CLinux /user 目錄下提供許多資源供開發(fā)者參考。下面以上節(jié)提到的源程序為例 , 說明在μ CLinux 中加入自己應用程序的過程。第一步 : 首先在 /user/ 目錄下建立自己的文件夾如 , 取名 apptest, 然后在新建文件夾 (apptest) 下編輯自己的應用程序 apptest.c( 源碼為上面的設備驅(qū)動驗證程序 ), 然后參照 user 目錄下其他應用程序編寫自己的 makefile, 同樣保存

在文件 apptest ;

#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<fcntl.h>

#include<sys/types.h>

#include<sys/stat.h>

main()

{

intfd,i,j;

charbuf[10];

fd=open("/dev/test",O_RDWR);

if(fd<0)

{

printf("cannotopenfile/n");

exit(0);

}

j=read(fd,buf,10);

for(i=0;i<j;i++)

printf("%d/n",buf[i]);

close(fd);

}

第二步 : /user/Makefile 中適當位置加入下行語句 :

dir - (CONFIG - USER - APPTEST)+=apptest

第三步 : /config/Configure.help 的適當位置添加以下語句 :

CONFIG - USER - APPTEST

ThisprogramdoesAPPTESTthingstoyourbars.

第四步 : /config/config.in 的適當位置添加以下語句 :

bool apptest CONFIG - USER - APPTEST

最后再重新編譯內(nèi)核 , makemenuconfig , 選中自己的應用程序 , 完成后在 /

bin 目錄可以看見 ap2ptest 的可執(zhí)行文件 , 通過控制臺直接輸入該文件名即可

運行該程序 ! 當然也可以在文件 vendor/Samsung/44B0/rc 中添加文件名

apptest, 重新編譯 , uclinux 啟動后自動執(zhí)行該應用程序 .

字符設備的另一種做法

(這個設備驅(qū)動程序是讓蜂鳴器叫)

這里不采用前面提到的 file 結構中的 readwrite 等,而使用 IOCTL 來實現(xiàn)。

首先修改前面給出的 test.c ,添加 Port_init 函數(shù),這個函數(shù)用來初始化 I/O 配置寄存器。然

后就是修改

structfile_operationstest_fops={

ioctl:ledman_ioctl,/*ledman_ioctl*/

};

去除原先的內(nèi)部結構,最后定義 ledman_ioctl 函數(shù)。整個驅(qū)動程序的結構如下,

#include<linux/module.h>

#include<linux/kernel.h>

#include<linux/types.h>

#include<linux/fs.h>

#include<linux/mm.h>

#include<linux/errno.h>

#include<asm/uaccess.h>

#include<asm/arch/s3c44b0x.h>

inttest_major=254;

#defineNon_Cache_Start(0x2000000)

#defineNon_Cache_End(0xc000000)

#defineBEEP_CMD_SIGNAL0

/*************************PORTS****************************/

staticintledman_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg);

voidPort_Init(void)

{

(*(volatileunsigned*)S3C44B0X_PCONA)=0x1ff;

(*(volatileunsigned*)S3C44B0X_PDATB)=0x3ff;

(*(volatileunsigned*)S3C44B0X_PCONB)=0x3ff;

(*(volatileunsigned*)S3C44B0X_PDATC)=0xffff;//AllI/OIsHigh

(*(volatileunsigned*)S3C44B0X_PCONC)=0x0f05ff55;

(*(volatileunsigned*)S3C44B0X_PUPC)=0x30f0;//PULLUPRESISTORshouldbeenabledtoI/O

(*(volatileunsigned*)S3C44B0X_PDATD)=0xff;

(*(volatileunsigned*)S3C44B0X_PCOND)=0x0;

(*(volatileunsigned*)S3C44B0X_PUPD)=0x0;

(*(volatileunsigned*)S3C44B0X_PDATE)=0x1ff;

(*(volatileunsigned*)S3C44B0X_PCONE)=0x25568;

(*(volatileunsigned*)S3C44B0X_PUPE)=0x0df;pull-upresistor.

(*(volatileunsigned*)S3C44B0X_PDATF)=0x1ff;//AllI/OIsHigh

(*(volatileunsigned*)S3C44B0X_PCONF)=0x20900a;//AllNCisINPUT

(*(volatileunsigned*)S3C44B0X_PUPF)=0x163;

(*(volatileunsigned*)S3C44B0X_PDATG)=0xff;

(*(volatileunsigned*)S3C44B0X_PCONG)=0x00ff;

(*(volatileunsigned*)S3C44B0X_PUPG)=0x0;//shouldbeenabled

(*(volatileunsigned*)S3C44B0X_SPUCR)=0x7;//D15-D0pull-updisable

(*(volatileunsigned*)S3C44B0X_EXTINT)=0x0;//AllEXTINT0-7Lowlevelinterrupt

(*(volatileunsigned*) S3C44B0X_NCACHBE0)=0;//((Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12);

}

voidBeep(intBeepStatus)

{

//PE5Lowavailable

if(BeepStatus==0)

(*(volatileunsigned*)S3C44B0X_PDATE)=(*(volatileunsigned*)S3C44B0X_PDATE)&0x1df;

else

(*(volatileunsigned*)S3C44B0X_PDATE)=(*(volatileunsigned*)S3C44B0X_PDATE)|0x020;

}

staticint ledman_ioctl(

structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg)

{

inti;

if(cmd==BEEP_CMD_SIGNAL){

printk("beep0/n");

Beep(0);

return(0);

}

e lse

{

printk("beep1/n");

Beep(1);

}

return0;

}

structfile_operationstest_fops={

ioctl:ledman_ioctl,/*ledman_ioctl*/

};

inttest_init(void)

{

intresult;

result=register_chrdev(254,"test",&test_fops);

if(result<0){printk("test:cannotgetmajornumber!/n");

returnresult;}

return0;

}

voidcleanup_module(void)

{unregister_chrdev(test_major,"test");}

其余文件不要動,將 test.c 存盤到 44b0 當前目錄下的 /linux-xxx/driver/char 然后在 44b0

錄下面 Make 進行編譯。

接著修改應用程序 apptest ,這個比較簡單,程序如下:

#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<fcntl.h>

#include<sys/types.h>

#include<sys/stat.h>

main()

{

intfd,i,j;

charbuf[10];

fd=open("/dev/test",O_RDWR);

if(fd<0){printf("cannotopenfile/n");

exit(0);

}

ioctl(fd,1,0);// 2 個參數(shù) 1 表示喇叭叫 ,0 表示不叫

close(fd);

}

其中把原先的 read,write 等調(diào)用改為 IOCTL 函數(shù)調(diào)用。

存盤后,執(zhí)行 makeuser_only 進行編譯。

<!--EndFragment-->

熟悉S3C44B0X開發(fā)板的開發(fā)流程


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 中文字幕亚洲一区 | 羞羞视频在线免费 | 日韩精品久久久久久 | 激情中文网 | 欧美一线免费http | 一区在线免费观看 | 成人国产精品免费视频不卡 | 日韩在线视频观看免费 | 国产一区二区精品在线 | 久久中文字幕2021精品 | 亚洲娇小性xxxx色 | 婷婷色综合网 | 亚洲一区二区三区中文字幕 | 日本高清高色 | 妹子干综合 | 99精品免费久久久久久久久日本 | 久久精品亚洲精品国产欧美kt∨ | 精品一区二区三区的国产在线观看 | 露娜同人18av黄漫网站 | 久久精品小视频 | 性看小视频 | 99在线热播精品免费 | 国产欧美一区二区视频 | 国产日韩欧美在线观看不卡 | 亚洲一区自拍 | 青娱在线视频 | 一级做a爰片性色毛片视频图片 | 日本三级网 | 亚洲婷婷综合网 | 欧美77| 日本精品一区二区三区四区 | 精品久久久久不卡无毒 | 欧美一区在线观看视频 | 亚洲免费在线 | 日韩福利视频 | 欧美3区| 99色精品 | 国产免费视频 | 日韩 欧美 自拍 | 天天插天天射天天干 | 欧美艹逼 |