ARM開發(fā)板:S5PV210
驅(qū)動步驟:
1.定義一個cdev設(shè)備結(jié)構(gòu)體變量
2.給cdev申請?jiān)O(shè)備號
3.定義一個文件操作集
4.設(shè)備初始化
5.注冊設(shè)備進(jìn)內(nèi)核
6.申請GPIO口
GPIO相關(guān)函數(shù)接口:
1.gpio_request(引腳,給引腳的名字) ----申請GPIO口
第一個參數(shù):
在內(nèi)核代碼 \arch\arm\mach-s5pv210\include\mach\gpio.h 中有定義,如下圖(部分)
如GPJ2寄存器的第一個引腳,就是 S5PV210_GPJ2(0)
第二個參數(shù):
為管腳起一個名字而已。
例如:
申請GPJ2CON的第一個管腳,并取名為GPJ2_0:
gpio_request(S5PV210_GPJ2(0),"GPJ2_0");;
2.gpio_free(引腳) ----釋放引腳
既然有 gpio_request來申請引腳,那用完了就要釋放掉。釋放引腳用函數(shù) gpio_free
例如:
釋放GPJ2_0引腳:gpio_free(S5PV210_GPJ2(0));
3.gpio_direction_output(引腳,0/1) ----給引腳置0或1,并把引腳設(shè)置為輸出模式
例如:
給引腳GPJ2_0設(shè)置為輸出模式,并置1:gpio_direction_output(S5PV210_GPJ2(0),1);
返回值:失敗返回負(fù)值
4.gpio_direction_intput(引腳) ----給引腳設(shè)置成輸入模式
例如:
給GPJ2_0 設(shè)置成輸入模式:gpio_direction_input(SPPV210_GPJ2(0));
5.gpio_set_value(引腳,0/1) ----給引腳置0或1
例如:
給引腳GPJ2_0設(shè)置為1(高電平):gpio_set_value(S5PV210_GPJ2(0),1);
返回值:失敗返回負(fù)值
6.gpio_get_value(引腳) ----獲取引腳的電平。看是0還是1
例如:
獲取GPJ2_0 的電平: int ret;ret = gpio_get_value(S5PV210_GPJ2(0));
下面給出驅(qū)動代碼和應(yīng)用程序代碼:(實(shí)現(xiàn)Led燈輪流閃爍)
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*1.定義設(shè)備結(jié)構(gòu)體*/
static struct cdev led_cdev;
static dev_t dev_num;
static char *gpio_name[]={"GPJ20","GPJ21","GPJ22","GPJ23"};
static struct class *led_class = NULL;
static struct device *led_device = NULL;
static char wbuf[1]={0};
static int led_open(struct inode *inode, struct file *f)
{
int i;
printk("led open\n");
for(i=0;i<4;i++)
{
gpio_direction_output(S5PV210_GPJ2(i),1);
}
return 0;
}
void led_up(char i)
{
char j;
int k = i-'0';
printk("GET[%c]\n",i);
printk("GET[%d]\n",k);
for(j=0;j<4;j++)
{
gpio_set_value(S5PV210_GPJ2(j),1);
}
gpio_set_value(S5PV210_GPJ2(k),0);
}
static ssize_t led_write(struct file *f, const char __user*buf,
size_t len, loff_t *t)
{
copy_from_user(wbuf,buf,len);
if(wbuf[0]=='0')
{
led_up(wbuf[0]);
}
if(wbuf[0]=='1')
{
led_up(wbuf[0]);
}
if(wbuf[0]=='2')
{
led_up(wbuf[0]);
}
if(wbuf[0]=='3')
{
led_up(wbuf[0]);
}
return 0;
}
/*3.定義文件操作集*/
static const struct file_operations fops={
.owner = THIS_MODULE,
.open = led_open,
.write = led_write,
};
static int __init led_init(void)
{
int ret;
int i;
/*2.申請?jiān)O(shè)備號*/
ret = alloc_chrdev_region(&dev_num,0,1,"led");
if(ret<0)
{
printk("failed to register dev num\n");
goto failed_register;
}
/*4.字符設(shè)備的初始化*/
cdev_init(&led_cdev,&fops);
/*5.注冊設(shè)備*/
ret = cdev_add(&led_cdev,dev_num,1);
if(ret<0)
{
printk("failed to add cdev\n");
goto failed_add;
}
/*6.申請IO口*/
for(i=0;i<4;i++)
{
ret = gpio_request(S5PV210_GPJ2(i),gpio_name[i]);
if(ret<0)
{
printk("failed to request GPIO\n");
goto failed_request_IO;
}
}
/*7.創(chuàng)建設(shè)備類*/
led_class = class_create(THIS_MODULE,"led_class");
if(led_class == NULL)
{
printk("failed to create class\n");
goto failed_create_class;
}
/*創(chuàng)建設(shè)備文件結(jié)點(diǎn)*/
led_device = device_create(led_class,NULL,dev_num,NULL,"led_dev");
if(led_device == NULL)
{
printk("failed to create device\n");
goto failed_create_device;
}
printk("init completed\n");
return 0;
failed_create_device:
class_destroy(led_class);
failed_create_class:
failed_request_IO:
while(i--)
{gpio_free(S5PV210_GPJ2(i));}
cdev_del(&led_cdev);
failed_add:
unregister_chrdev_region(dev_num,1);
failed_register:
return -1;
}
static void __exit led_exit(void)
{
device_destroy(led_class,dev_num);
class_destroy(led_class);
gpio_free(S5PV210_GPJ2(3));
gpio_free(S5PV210_GPJ2(2));
gpio_free(S5PV210_GPJ2(1));
gpio_free(S5PV210_GPJ2(0));
cdev_del(&led_cdev);
unregister_chrdev_region(dev_num,1);
printk("led uninstall!\n");
}
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
應(yīng)用程序:
#include
#include
int main()
{
char buf[1];
char i;
int fd = open("/dev/led_dev",O_WRONLY);
if(fd<0)
{
perror("failed to open");
return -1;
}
while(1)
{
for(i='0';i<'4';i++)
{
buf[0]=i;
write(fd,buf,1);
sleep(1);
}
}
return 0;
}
上一篇:ARM開發(fā)之雜項(xiàng)設(shè)備的編寫----以LED驅(qū)動為例
下一篇:ARM開發(fā)之linux字符型驅(qū)動的編寫----LED驅(qū)動為例
推薦閱讀
史海拾趣
隨著技術(shù)的不斷成熟和市場的不斷擴(kuò)大,DDP Engineered LED Solutions公司開始注重市場拓展和品牌建設(shè)。公司積極參加國內(nèi)外各類展會和論壇,展示公司的產(chǎn)品和技術(shù)實(shí)力,與業(yè)界同行交流學(xué)習(xí)。同時,公司還加大品牌宣傳力度,通過廣告、宣傳冊等多種渠道提升品牌知名度和美譽(yù)度。這些努力不僅讓DDP的產(chǎn)品走進(jìn)了更多客戶的視野,也為公司的長遠(yuǎn)發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
隨著市場需求的不斷變化和消費(fèi)者需求的多樣化,常州星海電子不斷調(diào)整和優(yōu)化產(chǎn)品結(jié)構(gòu)。公司現(xiàn)已形成了包括普通整流、開關(guān)、快速恢復(fù)、高效率、超快速、肖特基、雙向觸發(fā)管、整流橋、高反壓以及瞬間突波電壓吸收、穩(wěn)壓等多種系列、多種封裝形式的二極管產(chǎn)品。這些產(chǎn)品廣泛應(yīng)用于電腦、家電、郵電通訊等行業(yè),為公司贏得了廣闊的市場空間。
Fibrefab始終堅(jiān)持以客戶為中心的服務(wù)理念。為了提升客戶滿意度和忠誠度,F(xiàn)ibrefab不斷加強(qiáng)售前咨詢、售中服務(wù)和售后支持等方面的投入。公司建立了一套完善的服務(wù)體系,為客戶提供從方案設(shè)計(jì)、產(chǎn)品選型、安裝調(diào)試到后期維護(hù)等全方位的服務(wù)支持。此外,F(xiàn)ibrefab還積極收集客戶反饋和建議,不斷優(yōu)化產(chǎn)品和服務(wù)以滿足客戶需求。
Fibrefab始終堅(jiān)持以客戶為中心的服務(wù)理念。為了提升客戶滿意度和忠誠度,F(xiàn)ibrefab不斷加強(qiáng)售前咨詢、售中服務(wù)和售后支持等方面的投入。公司建立了一套完善的服務(wù)體系,為客戶提供從方案設(shè)計(jì)、產(chǎn)品選型、安裝調(diào)試到后期維護(hù)等全方位的服務(wù)支持。此外,F(xiàn)ibrefab還積極收集客戶反饋和建議,不斷優(yōu)化產(chǎn)品和服務(wù)以滿足客戶需求。
隨著業(yè)務(wù)的不斷發(fā)展,F(xiàn)enwal Controls公司開始尋求全球擴(kuò)張。公司通過建立廣泛的分銷網(wǎng)絡(luò),將產(chǎn)品推廣至全球各地。同時,為了更好地滿足當(dāng)?shù)厥袌鲂枨螅現(xiàn)enwal Controls還積極實(shí)施本地化戰(zhàn)略,與各地合作伙伴緊密合作,共同開發(fā)符合當(dāng)?shù)厥袌鲂枨蟮亩ㄖ苹a(chǎn)品。這些舉措不僅提升了公司的品牌影響力,也進(jìn)一步鞏固了公司在全球市場的地位。
隨著電子行業(yè)的快速發(fā)展和市場競爭的加劇,Bestar Electric面臨著諸多挑戰(zhàn)。為了應(yīng)對這些挑戰(zhàn),公司不斷調(diào)整戰(zhàn)略方向,加大研發(fā)投入,提升產(chǎn)品技術(shù)含量和附加值。同時,公司還注重人才培養(yǎng)和團(tuán)隊(duì)建設(shè),吸引了一批優(yōu)秀的研發(fā)、銷售和管理人才,為公司的發(fā)展提供了有力保障。
淺談VHDL/Verilog的可綜合性以及對初學(xué)者的一些建議(轉(zhuǎn)) 一、HDL不是硬件設(shè)計(jì)語言 過去筆者曾碰到過不少VHDL或Verilog HDL的初學(xué)者問一些相似的問題,諸如如何實(shí)現(xiàn)除法、開根號,如何寫循環(huán)語句等等。在這個論壇上,也時常能看到一些網(wǎng)友提出這一類的問題。 對于這些問題,首先要明確的是VHDL和Verigl ...… 查看全部問答∨ |
|
關(guān)于裸機(jī)IIS應(yīng)用 我要崩潰了。 這是我的程序。幫我看看吧。弄了幾天都還是沒一點(diǎn)聲音。小弟在此感謝了。 #include \"2440addr.h\" #define L3C (1= 1; } rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | (L3C ...… 查看全部問答∨ |
|
準(zhǔn)備優(yōu)化一下自己的STM8_SWIM下載線,需要寫一個flashloader。 看了一下STVP里使用的flashloader算法,還是覺得有一些可以做到更加優(yōu)化/簡化的方法。 STM8的指令集找到了,但是里面沒有詳細(xì)的指令編碼,雖然編碼可以使用STM8的匯編器生成, ...… 查看全部問答∨ |
【曬經(jīng)典】電子指南針,簡單就是美!(第3、4季) 本帖最后由 dontium 于 2015-1-23 12:45 編輯 電路功能:隨著方向不同,發(fā)出不同頻率的聲音。特別適合盲人朋友使用的電子指南針。它的電路可以拆成兩部分看。以中間的運(yùn)放為界。左邊:1、霍爾元件IC1,信號是UGN-3501M。說起霍爾元件可以說是傳感 ...… 查看全部問答∨ |
我想維修護(hù)欄管led燈管,苦于沒有信號源。用什么可以信號源,同時要便宜的。淘寶上有這種東西賣嗎?我管內(nèi)ic是cd4050be和hef4094bp.… 查看全部問答∨ |
單片機(jī)新手求助CD4511驅(qū)動四位數(shù)碼管顯示 ,不懂CD4511七個端口怎么就能驅(qū)動四位連體的數(shù)碼管顯示的,求高手 說明一下是怎么實(shí)現(xiàn)四位數(shù)的同時顯示.............順便說一下小弟想用c語言來編單片機(jī)的程序… 查看全部問答∨ |
【解密05】基于51單片機(jī)的無線遙控坦克DIY 之 遙控手柄電路 上一回我們介紹完了坦克一端的硬件部分,這回繼續(xù)介紹一下手柄一端的硬件,比較之前的電路手柄這邊的電路要簡單一些了,還是老習(xí)慣我們先分析一下手柄的功能,如圖5-1。 手柄的主要任務(wù) ...… 查看全部問答∨ |
基于AT89C51和AD0809的數(shù)字電壓表設(shè)計(jì) 哪位大神能幫忙設(shè)計(jì)一下硬件電路和程序(C語言),基于AT89C51和AD0809的數(shù)字電壓表,使用proteus仿真和keil C的。急求!… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 面壁智能端側(cè)大模型首日上線,英特爾工程師聯(lián)合優(yōu)化實(shí)現(xiàn)2.2倍推理效率躍升
- 瞄準(zhǔn)車規(guī)級碳化硅,理想發(fā)表重要成果
- 車規(guī)級MCU國內(nèi)替代提速
- 博世新獲國內(nèi)頭部車企座艙域控項(xiàng)目定點(diǎn)
- 首款測量電動汽車電機(jī)溫度的傳感器問世,提升對磁鐵的保護(hù)以減少稀土的使用
- Arm開發(fā)出計(jì)算子系統(tǒng) 以加速汽車設(shè)計(jì)的下一代AI芯片的開發(fā)
- 福特汽車申請新專利 或?qū)崿F(xiàn)車庫定向音樂播放
- 泊車場景一定需要超聲波嗎?
- 同星新一代TC1055 Pro開啟車載網(wǎng)絡(luò)測試新時代
- 福特汽車申請新專利 或?qū)⑴鋫浒踩ㄗ粉櫹到y(tǒng)
- 在無人駕駛?cè)蛸惖郎希袊欠駥⒈幻绹h(yuǎn)遠(yuǎn)甩在身后?
- 機(jī)器人人才培養(yǎng)大討論:沒有人才,一切都是浮云
- 物靈科技CEO顧嘉唯:智能機(jī)器人的殺手锏,在于“靈性”
- 工信部公布工業(yè)互聯(lián)網(wǎng)發(fā)展行動計(jì)劃
- 國巨董事長表示MLCC供貨吃緊、價格混亂
- 芯擎科技總部落戶武漢:首款7nm車規(guī)級芯片明年流片
- Nexperia建立全新特定型應(yīng)用FET類別,提供卓越性能產(chǎn)品
- 羅姆發(fā)布面向下一代汽車駕駛艙的解決方案白皮書
- 納芯微借助模擬輸出溫度傳感器,實(shí)現(xiàn)主流輸出接口全覆蓋
- 全新STM32WB雙核無線MCU問市,出色RF性能,延長電池續(xù)航