香橙派PC2的LED驅(qū)動

首先要編寫字符設(shè)備驅(qū)動,代碼大同小異,隨便復(fù)制粘貼就行了傻丝。

但是要注意了甘有,一定要保護(hù)好寄存器,不要亂搞葡缰,要不然系統(tǒng)崩了可別怪老夫沒提醒亏掀。

led.c

#include

#include

#include

#include

#include

#include


辣雞

#include"led.h"

#defineLED_MAJOR245//主設(shè)備號

unsignedint*led_config;

unsignedint*led_data;

unsignedint*led_pull;

structcdevcdev;

dev_tdevno;

intled_open(structinode*node,structfile*filp)

{

uint32_tregister_dat;

//000:Input001:Output

led_config=ioremap(PA_CFG1,4);//從datesheet里面查詢你的寄存器這里用的是PA10

register_dat=readl(led_config);//先讀取寄存器值只操作你需要操作的位段不要干擾其他端口

register_dat&=~(0x7<<8);//清空PA10的值

writel(register_dat|0x1<<8,led_config);//PA10設(shè)置成輸出

//00:Pull-up/downdisable01:Pull-up10:Pull-down11:Reserved

led_pull=ioremap(PA_PILL0,4);

register_dat=readl(led_pull);//讀取寄存器值

register_dat&=~(0x3<<2*10);//清空PA10設(shè)置

writel((register_dat|0x1<<2*10),led_pull);//PA10上拉

led_data=ioremap(PA_DAT,4);

return0;

}

longled_ioctl(structfile*filp,unsignedintcmd,unsignedlongarg)

{

uint32_treg_dat;

switch(cmd)

{

caseLED_ON:

reg_dat=readl(led_data);

reg_dat&=~(1<<10);

writel(reg_dat|0x0<<10,led_data);

return0;

caseLED_OFF:

reg_dat=readl(led_data);

reg_dat&=~(1<<10);

writel(reg_dat|0x1<<10,led_data);

return0;

default:

return-EINVAL;

}

}

staticstructfile_operationsled_fops=

{

.owner=THIS_MODULE,

.open=led_open,

.unlocked_ioctl=led_ioctl,

};

#defineDEVICE_NAME"myled"

staticstructclass*leds_class;

staticintled_init(void)

{

intret;

//注冊LED設(shè)備為字符設(shè)備

ret=register_chrdev(LED_MAJOR,DEVICE_NAME,&led_fops);

if(ret<0)

{

printk(DEVICE_NAME"majornumberregisterfalid!\n");

returnret;

}

//注冊一個類,使mdev可以在/dev/下面建立設(shè)備節(jié)點

leds_class=class_create(THIS_MODULE,DEVICE_NAME);

if(IS_ERR(leds_class))

{

printk("creatleds_classfailed!");

return-1;

}

//創(chuàng)建一個設(shè)備節(jié)點泛释,節(jié)點名字為DEVICE_NAME

device_create(leds_class,NULL,MKDEV(LED_MAJOR,0),NULL,DEVICE_NAME);

printk(DEVICE_NAME"initialized!");

return0;

}

staticvoidled_exit(void)

{

//注銷設(shè)備

unregister_chrdev(LED_MAJOR,DEVICE_NAME);

//刪除設(shè)備節(jié)點

device_destroy(leds_class,MKDEV(LED_MAJOR,0));

//注銷類

class_destroy(leds_class);

}

module_init(led_init);

module_exit(led_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("leo_learning");

MODULE_DESCRIPTION("myleddriver");

以下是

led.h

這里把所有的GPIO都列出來了

#ifndef_LED_H

#define_LED_H

//GPIOA_10

#defineGPIO_BASE0x01C20800

#definePA_CFG0GPIO_BASE+0x0000+0*0x24//GPIOA0-7

#definePA_CFG1GPIO_BASE+0x0004+0*0x24//GPIOA8-15

#definePA_CFG2GPIO_BASE+0x0008+0*0x24//GPIOA17-21

#definePA_CFG3GPIO_BASE+0x000C+0*0x24//GPIOA

#definePA_DATGPIO_BASE+0x0010+0*0x24//GPIOA_DAT

#definePA_DRV0GPIO_BASE+0x0014+0*0x24

#definePA_DRV1GPIO_BASE+0x0018+0*0x24

#definePA_PILL0GPIO_BASE+0x001C+0*0x24

#definePA_PILL1GPIO_BASE+0x0020+0*0x24

#definePC_CFG0GPIO_BASE+0x0000+1*0x24//GPIOC0-7

#definePC_CFG1GPIO_BASE+0x0004+1*0x24//GPIOC8-15

#definePC_CFG2GPIO_BASE+0x0008+1*0x24//GPIOC17-21

#definePC_CFG3GPIO_BASE+0x000C+1*0x24//GPIOC

#definePC_DATGPIO_BASE+0x0010+1*0x24//GPIOC_DAT

#definePC_DRV0GPIO_BASE+0x0014+1*0x24

#definePC_DRV1GPIO_BASE+0x0018+1*0x24

#definePC_PILL0GPIO_BASE+0x001C+1*0x24

#definePC_PILL1GPIO_BASE+0x0020+1*0x24

#definePD_CFG0GPIO_BASE+0x0000+2*0x24//GPIOD0-7

#definePD_CFG1GPIO_BASE+0x0004+2*0x24//GPIOD8-15

#definePD_CFG2GPIO_BASE+0x0008+2*0x24//GPIOD17-21

#definePD_CFG3GPIO_BASE+0x000C+2*0x24//GPIOD

#definePD_DATGPIO_BASE+0x0010+2*0x24//GPIOD_DAT

#definePD_DRV0GPIO_BASE+0x0014+2*0x24

#definePD_DRV1GPIO_BASE+0x0018+2*0x24

#definePD_PILL0GPIO_BASE+0x001C+2*0x24

#definePD_PILL1GPIO_BASE+0x0020+2*0x24

#definePE_CFG0GPIO_BASE+0x0000+3*0x24//GPIOE0-7

#definePE_CFG1GPIO_BASE+0x0004+3*0x24//GPIOE8-15

#definePE_CFG2GPIO_BASE+0x0008+3*0x24//GPIOE17-21

#definePE_CFG3GPIO_BASE+0x000C+3*0x24//GPIOE

#definePE_DATGPIO_BASE+0x0010+3*0x24//GPIOE_DAT

#definePE_DRV0GPIO_BASE+0x0014+3*0x24

#definePE_DRV1GPIO_BASE+0x0018+3*0x24

#definePE_PILL0GPIO_BASE+0x001C+3*0x24

#definePE_PILL1GPIO_BASE+0x0020+3*0x24

#definePF_CFG0GPIO_BASE+0x0000+4*0x24//GPIOF0-7

#definePF_CFG1GPIO_BASE+0x0004+4*0x24//GPIOF8-15

#definePF_CFG2GPIO_BASE+0x0008+4*0x24//GPIOF17-21

#definePF_CFG3GPIO_BASE+0x000C+4*0x24//GPIOF

#definePF_DATGPIO_BASE+0x0010+4*0x24//GPIOF_DAT

#definePF_DRV0GPIO_BASE+0x0014+4*0x24

#definePF_DRV1GPIO_BASE+0x0018+4*0x24

#definePF_PILL0GPIO_BASE+0x001C+4*0x24

#definePF_PILL1GPIO_BASE+0x0020+4*0x24

#definePG_CFG0GPIO_BASE+0x0000+5*0x24//GPIOG0-7

#definePG_CFG1GPIO_BASE+0x0004+5*0x24//GPIOG8-15

#definePG_CFG2GPIO_BASE+0x0008+5*0x24//GPIOG17-21

#definePG_CFG3GPIO_BASE+0x000C+5*0x24//GPIOG

#definePG_DATGPIO_BASE+0x0010+5*0x24//GPIOG_DAT

#definePG_DRV0GPIO_BASE+0x0014+5*0x24

#definePG_DRV1GPIO_BASE+0x0018+5*0x24

#definePG_PILL0GPIO_BASE+0x001C+5*0x24

#definePG_PILL1GPIO_BASE+0x0020+5*0x24

#definePL_CFG0GPIO_BASE+0x0000+6*0x24//GPIOL0-7

#definePL_CFG1GPIO_BASE+0x0004+6*0x24//GPIOL8-15

#definePL_CFG2GPIO_BASE+0x0008+6*0x24//GPIOL17-21

#definePL_CFG3GPIO_BASE+0x000C+6*0x24//GPIOL

#definePL_DATGPIO_BASE+0x0010+6*0x24//GPIOL_DAT

#definePL_DRV0GPIO_BASE+0x0014+6*0x24

#definePL_DRV1GPIO_BASE+0x0018+6*0x24

#definePL_PILL0GPIO_BASE+0x001C+6*0x24

#definePL_PILL1GPIO_BASE+0x0020+6*0x24

#definePA_INT_CFG00x0200+0x00+0*0x20

#definePA_INT_CFG10x0200+0x04+0*0x20

#definePA_INT_CFG20x0200+0x08+0*0x20

#definePA_INT_CFG30x0200+0x0C+0*0x20

#definePA_INT_CTL0x0200+0x10+0*0x20

#definePA_INT_STA0x0200+0x14+0*0x20

#definePA_INT_DEB0x0200+0x18+0*0x20

#definePF_INT_CFG00x0200+0x00+1*0x20

#definePF_INT_CFG10x0200+0x04+1*0x20

#definePF_INT_CFG20x0200+0x08+1*0x20

#definePF_INT_CFG30x0200+0x0C+1*0x20

#definePF_INT_CTL0x0200+0x10+1*0x20

#definePF_INT_STA0x0200+0x14+1*0x20

#definePF_INT_DEB0x0200+0x18+1*0x20

#definePG_INT_CFG00x0200+0x00+2*0x20

#definePG_INT_CFG10x0200+0x04+2*0x20

#definePG_INT_CFG20x0200+0x08+2*0x20

#definePG_INT_CFG30x0200+0x0C+2*0x20

#definePG_INT_CTL0x0200+0x10+2*0x20

#definePG_INT_STA0x0200+0x14+2*0x20

#definePG_INT_DEB0x0200+0x18+2*0x20

#defineLED_MAGIC'L'

#defineLED_ON_IO(LED_MAGIC,1)

#defineLED_OFF_IO(LED_MAGIC,0)

#endif

Makefile

把這里的KDIR改成你開發(fā)板內(nèi)核源碼對應(yīng)目錄滤愕,指定交叉編譯工具鏈,如果沒有什么問題怜校,make會編譯出led.ko间影,只要insmod led.ko就行了, so easy


obj-m:=led.o

KDIR:=/home/share/OrangePi_H5SDK/kernel

all:

make-C$(KDIR)M=$(PWD)modules\

CROSS_COMPILE=/home/share/OrangePi_H5SDK/toolchain/gcc-linaro-aarch/bin/aarch64-linux-gnu-ARCH=arm64

clean:

rm-f*.ko*.o*.mod.o*.mod.c*.symvers*.bak*.order

最后是應(yīng)用軟件,安裝led.ko內(nèi)核模塊會產(chǎn)生一個/dev/myled的設(shè)備節(jié)點茄茁,現(xiàn)在我們需要打開它魂贬,并對其進(jìn)行讀寫操作

led_app.c


#include

#include

#include

#include

#include


#include"led.h"

intmain(intargc,char*argv[])

{

intfd;

intcmd;

if(argc<2)

{

printf("pleaseenterthesecondpara!\n");

return0;

}

cmd=atoi(argv[1]);

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

if(cmd==1)

ioctl(fd,LED_ON);

else

ioctl(fd,LED_OFF);

return0;

}

aarch64-linux-gnu-gcc -o led_app led_app.c

通過

./led_app 0

熄滅LED

./led_app 1

點亮

然后隨便浪吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市裙顽,隨后出現(xiàn)的幾起案子付燥,更是在濱河造成了極大的恐慌,老刑警劉巖愈犹,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件键科,死亡現(xiàn)場離奇詭異,居然都是意外死亡甘萧,警方通過查閱死者的電腦和手機萝嘁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扬卷,“玉大人牙言,你說我怎么就攤上這事」值茫” “怎么了咱枉?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長徒恋。 經(jīng)常有香客問我蚕断,道長,這世上最難降的妖魔是什么入挣? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任亿乳,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘葛假。我一直安慰自己障陶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布聊训。 她就那樣靜靜地躺著抱究,像睡著了一般。 火紅的嫁衣襯著肌膚如雪带斑。 梳的紋絲不亂的頭發(fā)上鼓寺,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音勋磕,去河邊找鬼妈候。 笑死,一個胖子當(dāng)著我的面吹牛朋凉,可吹牛的內(nèi)容都是我干的州丹。 我是一名探鬼主播醋安,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼杂彭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吓揪?” 一聲冷哼從身側(cè)響起亲怠,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柠辞,沒想到半個月后团秽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡叭首,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年习勤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焙格。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡图毕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出眷唉,到底是詐尸還是另有隱情予颤,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布冬阳,位于F島的核電站蛤虐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肝陪。R本人自食惡果不足惜驳庭,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氯窍。 院中可真熱鬧饲常,春花似錦捏检、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至霹娄,卻和暖如春能犯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犬耻。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工踩晶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枕磁。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓渡蜻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親计济。 傳聞我的和親對象是個殘疾皇子茸苇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容