嵌入式linux驱动实验.docx
- 文档编号:15068623
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:14
- 大小:290.96KB
嵌入式linux驱动实验.docx
《嵌入式linux驱动实验.docx》由会员分享,可在线阅读,更多相关《嵌入式linux驱动实验.docx(14页珍藏版)》请在冰点文库上搜索。
嵌入式linux驱动实验
实验题目:
嵌入式linux驱动实验
一、实验目的
1)安装linux-2.6.38
2)让Makefile中的路径与linux-2.6.38保持一致。
3)修改驱动.c文件,使得用pc0来控制红灯。
4)通过交叉编译器进行交叉编译生成可执行文件
5)通过tftp传送文件。
6)实现驱动的加载和卸载。
二、实验原理
1)工作原理框图
2)工作原理
根据上图通过编写驱动程序可以控制pc0接口,当它高电平时,D9led灯熄灭;当它低电平时,D9led灯点亮。
在编写适当的应用程序完成实验。
三、参考程序
1、Led_app.c(应用程序)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineLED_DEVICE"/dev/led_cugb"
#defineLED_ON0
#defineLED_OFF1
staticunsignedcharbuf_wr[10]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};
staticunsignedcharbuf_rd[10];
intmain()
{
intfd;
intval=-1;
inti,ret;
if((fd=open(LED_DEVICE,O_RDWR))<0)
{
printf("opendeviceerror!
\r\n");
exit
(1);
}
while
(1)
{
printf("0:
LEDON,1:
LEDOFF,2:
Writetest,3:
Readtest,4:
quit\r\n");
scanf("%d",&val);
switch(val)
{
case0:
ioctl(fd,LED_ON,0);
break;
case1:
ioctl(fd,LED_OFF,0);
break;
case2:
ret=write(fd,buf_wr,sizeof(buf_wr));
if(ret<0)
{
printf("Writeerror!
\r\n");
}
break;
case3:
ret=read(fd,buf_rd,sizeof(buf_rd));
if(ret>=0)
{
printf("app:
read%dbytes:
",ret);
for(i=0;i { printf("0x%02x",buf_rd[i]); } printf("\r\n"); } else { printf("Readerror! \r\n"); } break; case4: close(fd); exit (1); break; default: printf("inputerror! \r\n"); } } } 2、led_drv.c(驱动.c) #include #include #include #include #include #include #include #include #include #include #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("Mr.Zeng"); MODULE_VERSION("V1.0"); MODULE_DESCRIPTION("LedDriverforAT91RM9200"); #defineLED_MAJOR231 #defineDEVICE_NAME"led_cugb" #defineLED_ON0 #defineLED_OFF1 #defineBUF_SIZE64 staticunsignedcharg_buf[BUF_SIZE]; staticintled_open(structinode*inode,structfile*filp) { intminor,i; minor=MINOR(inode->i_rdev); at91_set_gpio_output(AT91_PIN_PC2,1); for(i=0;i { g_buf[i]=0x00; } printk("%sok\r\n",__FUNCTION__); return0; } staticssize_tled_read(structfile*filp,char__user*pbuf,size_tSize, loff_t*other) { size_tsize_local; size_local=Size; if(Size>BUF_SIZE) size_local=BUF_SIZE; copy_to_user(pbuf,g_buf,size_local); printk("driver: read%dbytes\r\n",size_local); printk("%sok\r\n",__FUNCTION__); returnsize_local; } staticssize_tled_write(structfile*filp,constchar__user*pbuf, size_tSize,loff_t*other) { inti; size_tsize_local; size_local=Size; if(Size>BUF_SIZE) size_local=BUF_SIZE; copy_from_user(g_buf,pbuf,size_local); printk("driver: write%dbyte: ",size_local); for(i=0;i { printk("0x%02x",g_buf[i]); } printk("\r\n"); printk("%sok\r\n",__FUNCTION__); return0; } staticintled_release(structinode*inode,structfile*filp) { printk("%sok\r\n",__FUNCTION__); return0; } staticlongled_ctl_ioctl(structfile*filp,unsignedintcommand,unsignedlongarg) { interr=0; switch(command) { caseLED_OFF: err=at91_set_gpio_value(AT91_PIN_PC2,1);break; caseLED_ON: err=at91_set_gpio_value(AT91_PIN_PC2,0);break; } printk("%sok\r\n",__FUNCTION__); returnerr; } staticstructfile_operationsled_ctl_fops={ .owner=THIS_MODULE, .open=led_open, .write=led_write, .read=led_read, .unlocked_ioctl=led_ctl_ioctl,//.ioctl-->.unlocked_ioctl .release=led_release, }; staticint__initled_init(void) { intret; ret=register_chrdev(LED_MAJOR,DEVICE_NAME,&led_ctl_fops); if(ret<0) { printk(DEVICE_NAME"registerfailed\r\n"); } else { printk(DEVICE_NAME"registerok\r\n"); } returnret; } staticvoid__exitled_exit(void) { unregister_chrdev(LED_MAJOR,DEVICE_NAME); printk(DEVICE_NAME"unregisterok\r\n"); } module_init(led_init); module_exit(led_exit); 四、实验步骤 1、解压linux-2.6.38.tar.bz2到/home/at9200/kernel/linux-2.6.38/的目录下; 2、交叉编译生成可执行文件led_app 指令: arm-linux-gcc–oled_appled_app.c 3、用make指令生成led_drv.ko(文件目录下包含led_drv.c和Makefile) 4、用tftp传送led_app,led_drv.ko两个文件到目标板上 (1)启动tftp,设置好共享目录,并将led_app,led_drv.ko置于目录下。 (2)启动超级终端,建立好连接 (3)设置好目标板的Ip地址 (4)进入到jffs2的目录下 (5)用tftp传送文件 (6)加载驱动 (7)chmod777led_app (8)设定主设备号 (9)运行 (10)卸载 五、实验结果 在开发板上会发现在超级终端界面上输入0时红灯亮; 输入1时红灯灭。 六、实验体会 通过这次的实验我初步了解到了嵌入式系统中驱动程序的编写,以及如何加载和卸载。 也让我认识到了驱动程序与应用程序之间的区别,驱动程序中是不含有main函数的,而应用程序中是含有main函数的,此外我通过这次实验完成了用软件实时操作硬件,引起了我的兴趣和求知欲,我想这会有利于我以后对嵌入式系统的学习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 linux 驱动 实验