UTS3C6410RAM11Linux下LED灯驱动.docx
- 文档编号:11567307
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:10
- 大小:511.75KB
UTS3C6410RAM11Linux下LED灯驱动.docx
《UTS3C6410RAM11Linux下LED灯驱动.docx》由会员分享,可在线阅读,更多相关《UTS3C6410RAM11Linux下LED灯驱动.docx(10页珍藏版)》请在冰豆网上搜索。
UTS3C6410RAM11Linux下LED灯驱动
UT-S3C6410ARM11Linux下的LED驱动
在人东老师的要求下,让我把基于Linux下ARM的初级驱动开发流程在这里演示一遍,为了不枉费人东老师的一片心血,和对ARM还没有入门苦苦探索的亲们,给你们开启一扇窗户,少走一些弯路,废话少说,现在开始:
一、实验环境
操作系统:
ubuntu9.0或以上
交叉编译环境:
arm-Linux-gcc4.2.2或以上,安装在/usr/local/arm/4.2.2/
6410板子核源码路径在:
/s3c6410/linux-2.6.28-v1.0/
硬件平台:
UT-S3C6410开发板(其他类型的开发板也可以注意配置GPIO)
注:
交叉编译环境一定要装好,一般的开发板给的配套资料中都会有,安装过程也都有详细的过程,如果没有,亲,你只有自己解决了。
也可以联系我(476695721qq.),泪奔支持你们。
二、实验原理
控制LED是最简单的一件事情,就像学C语言时候写的“helloworld”程序一样,是一个入门的程序。
首先来了解一下相关的硬件知识:
UT-S3C6410 LED原理图
UT-S3C6410 LED外部引脚图
从上面的原理图可以得知,LED与CPU引脚的连接方法如下,高电平点亮。
LED1 -GPM0
LED2-GPM1
LED3 -GPM2
LED4 -GPM3
从数据手册可以找到相应的控制方法。
这里我们以LED1为例,介绍一下LED1的操作方法,其他的类似,请大家自行分析。
通过上面可以得知,需要先将GPM0设置为输出方式。
将寄存器GPMCON低四位配置成0001。
然后将GPMDAT寄存器的第0位置1灯亮,置LED0灯亮,开发板上有四个LED所以要对GPMDAT的低四位进行操作,就可以实现对灯的亮灭操作了。
三、实验步骤
1、编写驱动程序
driver_led.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineLED_MAJOR240
intled_open(structinode*inode,structfile*filp)
{
unsignedtmp;
tmp=readl(S3C64XX_GPMCON);
tmp=(tmp&~(0xffffU))|(0x1111U);
writel(tmp,S3C64XX_GPMCON);
printk("#########openGPMCON######\n");
return0;
}
ssize_tled_read(structfile*filp,char__user*buf,size_tcount,loff_t*f_pos)
{
printk("#########read######\n");
returncount;
}
ssize_tled_write(structfile*filp,constchar__user*buf,size_tcount,loff_t*f_pos)
{
charwbuf[10];
unsignedtmp;
printk("#########writeLED######\n");
copy_from_user(wbuf,buf,count);
switch(wbuf[0])
{
case0:
//on
tmp=readl(S3C64XX_GPMDAT);
tmp|=(0xfU);
writel(tmp,S3C64XX_GPMDAT);
break;
case1:
//off
tmp=readl(S3C64XX_GPMDAT);
tmp&=~(0xfU);
writel(tmp,S3C64XX_GPMDAT);
break;
default:
break;
}
returncount;
}
intled_release(structinode*inode,structfile*filp)
{
printk("#########release######\n");
return0;
}
structfile_operationsled_fops={
.owner=THIS_MODULE,
.open=led_open,
.read=led_read,
.write=led_write,
.release=led_release,
};
int__initled_init(void)
{intrc;
printk("Testleddev\n");
rc=register_chrdev(LED_MAJOR,"led",&led_fops);
if(rc<0)
{
printk("register%schardeverror\n","led");
return-1;
}
printk("ok!
\n");
return0;
}
void__exitled_exit(void)
{
unregister_chrdev(LED_MAJOR,"led");
printk("moduleexit\n");
return;
}
module_init(led_init);
module_exit(led_exit);
Makefile文件
Makefile
obj-m:
=driver_led.o
KDIR:
=/s3c6410/urbetter-linux2.6.28-v1.0
all:
make-C$(KDIR)M=$(shellpwd)modules
cpdriver_led.ko/home/fusq/nfs_share
clean:
make-C$(KDIR)M=$(shellpwd)clean
2、编写测试程序
test.c
#include
#include
#include
#include
intmain(void)
{
intfd;
charbuf[10]={0,1};
fd=open("/dev/my_led",O_RDWR);
if(fd<0)
{
printf("Open/dev/my_ledfileerror\n");
return-1;
}
while
(1)
{
write(fd,&buf[0],1);
sleep
(1);
write(fd,&buf[1],1);
sleep
(1);
}
close(fd);
return0;
}
3、编译驱动程序与测试程序
3.1编译驱动程序
#make
编译成驱动文件driver_led.ko并自动拷贝到了/home/fusq/nfs_share
注:
要注意Makefile要符合Linux下的文本格式,如果出现不执行,请在Linux下vi或vim重新编辑一下。
如果出现头文件找不到,请找到该头文件的具体位置一般都在(urbetter-linux2.6.28-v1.0)文件夹下,将该头文件最后路径的文件夹名字填到程序头文件调用中。
3.2编译测试程序
#arm-linux-gcc test.c -o test
将测试程序也放到/home/fusq/nfs_share共享文件夹下
#cp test /home/fusq/nfs_share
4、将程序下载到开发板
将开发板的IP地址修改,与主机在同一个网段,并修改PC机上Linux下/etc/exports网络配置文件的IP与开发板的一致。
确保PC机上Linux已经安装了NFS服务器,网络共享文件夹在/home/fusq/nfs_share。
在开发板的Linux下挂载nfs网络共享文件夹:
[rooturbetter/]#mount-tnfs-onolock192.168.1.80:
/home/fusq/nfs_share/mnt/nfs
挂载到/mnt/nfs下。
注:
如果没有安装NFS服务器,为了完成实验,可以用串口将或是USB等设备将driver_led.ko和test文件拷贝到开发板的Linux工作目录下效果是一样的。
5、测试
5.1加载驱动 #insmod /mnt/nfs/driver_led.ko
网络有点小不稳定,亲们要耐心等待,不过还是成功了!
5.2 创建设备文件 #mknod /dev/my_led c 240 0
5.3测试 ./test
[rooturbetter/]#./test
注:
此时可以看到UT-S3C6410板子上的LED0-3在闪烁,如果出现执行权限不过,修改一下test的用户执行权限如上图:
#chmod777test
5.4卸载驱动 #rmmod driver_led
从上面的结果我们可以看到,当用户调用相应的文件操作函数时,驱动程序中的相应的函数也会被调用。
大家可以修改相应程序,测试一下其他的情况,如有什么错误也可以一起探讨,今生为嵌入式事业奋斗终身,!
:
476695721qq.
sunxue0802163.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UTS3C6410RAM11Linux LED 驱动