文章目录

  • 实验环境准备
  • 步骤简要说明:
  • 第一步:测试三个系统是否连通
  • 第二步:编写并编译好驱动程序和测试驱动的程序
    • 编写直流电机驱动程序dc_motor.c
    • 编写驱动程序的Makefile文件
    • 编写驱动测试程序dcMotor_test.c
    • 编写测试驱动程序的Makefile文件
  • 第三步:编译生成dc_motor.ko与dcMotor_test二进制执行文件
  • 第四步:将dc_motor.ko文件与dcMotor_test文件挂载到实验箱板子
  • 第五步:在实验箱装载驱动并使用程序进行测试

实验环境准备

实验材料:GEC6818实验箱、电脑、
实验环境:VMware下Linux系统、arm-linux-交叉编译环境,windows系统、secureCRT平台

步骤简要说明:

因为需要用到Linux系统环境,所以在Windows下装了个虚拟机,使用虚拟机的环境来开发驱动,并编写了测试驱动的程序,然后把驱动与测试驱动的两个文件传送到实验箱中,接着在实验箱上测试驱动是否可用

第一步:测试三个系统是否连通

  1. 禁用pc机无线网卡、关闭所有防火墙、使用网线连接PC机与实验箱
  2. 设置pc机的IP地址(192.168.1.160)、子网掩码(255.255.255.0)
  3. 设置虚拟机IP地址,在终端下输入:
ifconfig eth0 192.168.1.170
  1. 设置实验箱IP地址,在secureCRT下,输入:
ifconfig eth0 192.168.1.180
  1. 然后三个系统之间互相ping一下,看是否能ping通,注意,一定要ping通才能做接下来的实验

第二步:编写并编译好驱动程序和测试驱动的程序

编写直流电机驱动程序dc_motor.c

/*---------------------------------------*功能描述:  直流电机驱动 *创建者:   粤嵌技术部*创建时间: 2017,01,01---------------------------------------*修改日志:*修改内容:*修改人:*修改时间:----------------------------------------*//**************************************************头文件*************************************************/#include <linux/kernel.h>#include <linux/module.h>#include <linux/miscdevice.h>#include <linux/fs.h>#include <linux/types.h>#include <linux/moduleparam.h>#include <linux/slab.h>#include <linux/ioctl.h>#include <linux/cdev.h>#include <linux/delay.h>#include <linux/gpio.h>#include <mach/gpio.h>#include <mach/platform.h>#include <asm/gpio.h>#define DEVICE_NAME      "dc_motor"            //设备名字      //电机管脚static int motor_gpios[] = {(PAD_GPIO_C + 24),(PAD_GPIO_C + 25),};#define MOTOR_NUM        ARRAY_SIZE(motor_gpios) //电机的数量/**************************************************电机初始化*************************************************/static void motor_init(void){gpio_set_value(motor_gpios[0], 0);gpio_set_value(motor_gpios[1], 0);}/**************************************************电机正传*************************************************/static void motor_foreward(void){gpio_set_value(motor_gpios[0], 1);gpio_set_value(motor_gpios[1], 0);}/**************************************************电机反转*************************************************/static void motor_rollback(void){gpio_set_value(motor_gpios[1], 1);gpio_set_value(motor_gpios[0], 0);}/**************************************************电机设备打开*************************************************/static int gec6818_motor_open(struct inode *inode, struct file *filp){printk(DEVICE_NAME ":open\n");motor_init();return 0;}/**************************************************电机控制程序*************************************************/static long gec6818_motor_ioctl(struct file *filp, unsigned int cmd,unsigned long arg){switch(cmd) {case 0:if (arg > MOTOR_NUM) {return -EINVAL;}motor_init();printk("Motor Stop.\n");break;case 1:if (arg > MOTOR_NUM) {return -EINVAL;}motor_rollback();printk("Motor Rollback.\n");break;case 4:if (arg > MOTOR_NUM) {return -EINVAL;}      motor_foreward();printk("Motor Foreward.\n");break;default:return -EINVAL;}return 0;}/**************************************************文件操作集*************************************************/static struct file_operations gec6818_motor_dev_fops = {.owner            = THIS_MODULE,.unlocked_ioctl  = gec6818_motor_ioctl,.open = gec6818_motor_open};/**************************************************杂项设备*************************************************/static struct miscdevice gec6818_motor_dev = {.minor          = MISC_DYNAMIC_MINOR,.name         = DEVICE_NAME,.fops            = &gec6818_motor_dev_fops,};/*********************************************************************驱动的初始化函数--->从内核中申请资源(内核、中断、设备号、锁....)********************************************************************/static int __init gec6818_motor_dev_init(void){int ret;int i;for (i = 0; i < MOTOR_NUM; i++) {ret = gpio_request(motor_gpios[i], "MOTOR");if (ret) {printk("%s: request GPIO %d for MOTOR failed, ret = %d\n", DEVICE_NAME,motor_gpios[i], ret);return ret;}gpio_direction_output(motor_gpios[i], 0);}gpio_set_value(motor_gpios[0], 0);gpio_set_value(motor_gpios[1], 0);ret = misc_register(&gec6818_motor_dev);printk(DEVICE_NAME"\tinitialized\n");return ret;}/******************************************************************驱动退出函数 --->将申请的资源还给内核*****************************************************************/static void __exit gec6818_motor_dev_exit(void) {int i;for (i = 0; i < MOTOR_NUM; i++) {gpio_free(motor_gpios[i]);}misc_deregister(&gec6818_motor_dev);}module_init(gec6818_motor_dev_init);                //驱动的入口函数会调用一个用户的初始化函数module_exit(gec6818_motor_dev_exit);                //驱动的出口函数会调用一个用户的退出函数//驱动的描述信息: #modinfo  *.ko , 驱动的描述信息并不是必需的。MODULE_AUTHOR("kaoyangou");                         //驱动的作者MODULE_DESCRIPTION("Dc_Motor of driver");           //驱动的描述MODULE_LICENSE("GPL");                              //遵循的协议

编写驱动程序的Makefile文件

INSTALLDIR   =  /home/Helloifneq ($(KERNELRELEASE),)obj-m:=dc_motor.oelseKERNELDIR:=/home/Hello/demo/6818GEC/kernelCROSS_COMPILE:=/home/Hello/demo/6818GEC/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-PWD:=$(shell pwd)default:mkdir -p $(INSTALLDIR)$(MAKE) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modulescp --target-dir=$(INSTALLDIR) dc_motor.koclean:rm -rf *.o *.order .*.cmd *.ko *.mod.c *.symversendif

编写驱动测试程序dcMotor_test.c

/*---------------------------------------*功能描述:  直流电机测试程序*创建者:   粤嵌技术部*创建时间: 2015,01,01---------------------------------------*修改日志:*修改内容:*修改人:*修改时间:----------------------------------------*//**************************************************头文件*************************************************/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#define PATH   "/dev/dc_motor"                 //绝对路径/**************************************************主函数*************************************************/int main(void){int fd;unsigned int val;fd = open(PATH, O_RDWR);                         //打开设备,成功返回0if (fd < 0) {perror("Failed to open!\n");exit(1);}do{ printf(" Please select how to operate the DC motor.\n");printf("0 ->Stop\n");printf("1 -> Rollback\n");printf("4 -> Foreward\n");printf("9 -> Exit!\n");scanf("%d", &val);if(val == 9) break;ioctl(fd, val, 0);}while(1);close(fd);return 0;}

编写测试驱动程序的Makefile文件

## Makefile for Linux application test example.##---------------------------------------------------------------# Linux application Makefile sample# make          -- the optical output without debug info# make clean    -- clean the object file(s)# make install  -- install the execute file(s) to INSTALLDIR#---------------------------------------------------------------# History:#         INSTALLDIR  = /home/Hello#---------------------------------    /* execute file(s) */TESTFILE   = dcMotor_test#---------------------------------   /* object file(s) */SRCFILE     = dcMotor_test.c#--------------------------------- /* header file(s) */TESTFILE_H  =CROSS = arm-none-linux-gnueabi-CC = $(CROSS)gccAS = $(CROSS)asLD = $(CROSS)ldCFLAGS  += -O2 -Wallall:   $(TESTFILE)$(TESTFILE):  $(SRCFILE) $(TESTFILE_H) Makefilemkdir -p $(INSTALLDIR) $(CC) $(CFLAGS) -o $@ $@.ccp --target-dir=$(INSTALLDIR) $(TESTFILE)clean:rm -f $(TESTFILE)

第三步:编译生成dc_motor.ko与dcMotor_test二进制执行文件

  1. 将驱动程序dc_motor.c与其对应Makefile文件放在同一目录下,然后在该目录下执行命令make,生成目标文件dc_motor.ko
    注意:Makefile中可能制定了生成的二进制执行文件安装路径:INSTALLDIR = 某某某
  2. 将驱动程序dcMotor_test.c与其对应Makefile文件放在同一目录下,然后在该目录下执行命令make,生成目标文件dcMotor_test
    注意:Makefile中可能制定了生成的二进制执行文件安装路径:INSTALLDIR = 某某某
    需要知道的是,以上的编译属于交叉编译,Makefile文件中已指定相应的交叉编译器

第四步:将dc_motor.ko文件与dcMotor_test文件挂载到实验箱板子

  1. 将dc_motor.ko文件与dcMotor_test文件统一放在虚拟机的nfs_share目录上
  2. 在secureCRT命令框使用mount命令进行挂载,命令中的ip地址是虚拟机的ip地址
mount -o nolock,tcp 192.168.1.170:/home/Hello/nfs_share /mnt

第五步:在实验箱装载驱动并使用程序进行测试

  1. 在secureCRT中输入命令lsmod,然后回车,在返回的消息中如果找到有dc_motor字眼的一行,则使用rmmod dc_motor进行卸载原有驱动,确保实验箱系统不存在直流电机的驱动程序
lsmod    //查看已存在驱动rmmod dc_motor   //卸载dc_motor直流电机的驱动
  1. 进入到目录 /mnt,然后插入驱动dc_motor.ko,因为刚才把自己制作的驱动挂载到了/mnt目录下
insmod dc_motor.ko
  1. 测试,输入命令打开直流电机
./dcMotor_test

然后,选择1或4选项,发现直流电机转动,实验成功!

嵌入式课程---嵌入式Linux的直流电机驱动开发相关推荐

  1. 嵌入式课程设计linux,嵌入式系统课程设计--基于U盘的linux操作系统的构建

    嵌入式系统课程设计--基于U盘的linux操作系统的构建 1 课程设计报告课程设计报告 课程名称课程名称 嵌入式系统课程设计嵌入式系统课程设计 设计题目设计题目基于基于 U盘的盘的 linux 操作系 ...

  2. 嵌入式课程设计linux,嵌入式课程设计报告

    一. 基础内容 1 .Linux内核移植实验 问题回答 1. 交叉编译环境包括哪些工具,它的作用是什么? 答:GNU的交叉编译器,包括以下组件: (1). Gcc交叉编译器,即在宿主机上开发编译目标上 ...

  3. linux 直流电机驱动设计,嵌入式Linux直流电机驱动.PPT

    嵌入式Linux直流电机驱动.PPT 嵌入式Linux直流电机驱动实验 开发平台中直流电机驱动的实现 S3C2410芯片自带定时器,所以控制部分省去了三角波产生电路.脉冲调制电路和PWM信号延迟及信号 ...

  4. 视频教程-初级玩转Linux+Ubuntu(嵌入式开发基础课程)-嵌入式

    初级玩转Linux+Ubuntu(嵌入式开发基础课程) 6年嵌入式开发经验,在多家半导体公司从事芯片测试.验证.Linux驱动开发都工作.熟悉芯片设计流程.熟悉产品平台方案开发流程. 王利涛 ¥39. ...

  5. 嵌入式Linux结课报告,嵌入式课程报告.doc

    嵌入式课程报告 嵌入式系统及应用设计报告 题 目 嵌入式Linux系统移植 专 业 电子与通信工程 姓 名 王文平 学 号 1320610012 一.硬件设备介绍 此次实验用的板子是友善之臂的Mini ...

  6. alin的学习之路:嵌入式课程设计总结(基于Linux的Qt版MP3播放器)

    嵌入式课程设计总结(基于Linux的Qt版MP3播放器) 废话不多写直接上图上代码,其中有很多不规范的地方,希望大佬们指正. 1.课设题目 设计一个MP3播放器,要求:使用Linux下的madplay ...

  7. 用linux设计99乘法表,嵌入式课程设计九九乘法表

    <嵌入式课程设计九九乘法表>由会员分享,可在线阅读,更多相关<嵌入式课程设计九九乘法表(8页珍藏版)>请在人人文库网上搜索. 1.安阳师范学院计算机与信息工程学院嵌入式系统课程 ...

  8. linux嵌入式主要学什么,学嵌入式linux,用什么开发板,请大家推荐一下

    搞个嵌入式linux培训班的课程来看下,就知道要学什么了 C语言基础.C++基础.数据结构.操作系统原理.Linux应用基础.电子电路基础 开课前一周:入学基础测试与辅导(C语言.C++.linux基 ...

  9. 嵌入式 Linux 与物联网软件开发 ——C 语言内核深度解析

    C 语言是嵌入式 Linux 领域的主要开发语言. 对于学习嵌入式.单片机.Linux 驱动开发等技术来说,C 语言是必须要过的一关.C 语言学习的特点是入门容易.深入理解难.精通更是难上加难.很多用 ...

最新文章

  1. 编写Java程序最容易犯的21种错误
  2. #celery#周期性任务
  3. C#LeetCode刷题之#852-山脉数组的峰顶索引(Peak Index in a Mountain Array)
  4. 父组件更新prop_如何在ReactJS中更新组件的prop —哦,是的,有可能
  5. 力扣114. 二叉树展开为链表(C++,解释一下别人的思路)
  6. VI中的多行删除与复制
  7. mysql:Cannot load driver class: com.mysql.jdbc.Driver
  8. 机器学习初学者入门实践:怎样轻松创造高精度分类网络
  9. SSH集成项目,使用注解方式,竟然还有这样的问题!!
  10. 汉字书写解码_汉字密码 | 500个字根即可解码10万个汉字,《说文解字》的神功...
  11. VS2010旗舰版安装图解
  12. matlab版深度学习入门之旅----体验过后的个人记录
  13. Windows系统微软拾色器小工具
  14. azure kinect 深度相机原理
  15. Springboot连接Redis超时问题解决
  16. 从软件工程师到有赞新零售技术负责人,34岁李星专访
  17. BZOJ 5442: [Ceoi2018]Global warming
  18. Python自动切换wifi
  19. 使用EndNote在Word中插入参考文献的格式设置
  20. xmlhttp的实际使用

热门文章

  1. 2022-07-11 BUD元宇宙面试记录及复盘(还是要多复习下语言的细节)
  2. 网工压轴题个人总结背诵版   专题二 配置VTP和STP
  3. 如果你打算将游戏业务外包 那么这篇文章你就不得不看!
  4. poj3255次短路
  5. 小程序生成网址链接,网址链接跳转小程序(附详细流程)
  6. 机票预定系统可行性分析
  7. 黑马c++学习笔记提高篇1
  8. 怎么看计算机电源型号,鲁大师怎么看电源 鲁大师电源参数查看方法
  9. Ipopt输出的含义
  10. 爱弹幕服务器不稳定,最爱弹幕视频 现代Hold X绚丽动手玩