香橙派PC2的LED驱动

首先要编写字符设备驱动,代码大同小异,随便复制粘贴就行了。

但是要注意了,一定要保护好寄存器,不要乱搞,要不然系统崩了可别怪老夫没提醒。

led.c

#include

#include

#include

#include

#include

#include


辣鸡

#include"led.h"

#defineLED_MAJOR245//主设备号

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设置成输出

//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设置

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设备为字符设备

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

if(ret<0)

{

printk(DEVICE_NAME"majornumberregisterfalid!\n");

returnret;

}

//注册一个类,使mdev可以在/dev/下面建立设备节点

leds_class=class_create(THIS_MODULE,DEVICE_NAME);

if(IS_ERR(leds_class))

{

printk("creatleds_classfailed!");

return-1;

}

//创建一个设备节点,节点名字为DEVICE_NAME

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

printk(DEVICE_NAME"initialized!");

return0;

}

staticvoidled_exit(void)

{

//注销设备

unregister_chrdev(LED_MAJOR,DEVICE_NAME);

//删除设备节点

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改成你开发板内核源码对应目录,指定交叉编译工具链,如果没有什么问题,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

最后是应用软件,安装led.ko内核模块会产生一个/dev/myled的设备节点,现在我们需要打开它,并对其进行读写操作

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

点亮

然后随便浪吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容