基于[三星6818]芯片linux系统超声波测距驱动编写

  • 编写驱动代码
    • 头文件内容:
    • 1> 定义和初始化混杂设备
    • 2> 定义驱动文件集
    • 3>粗略介绍下超声波检测距离函数里面几个细节
    • 4> 编译内核参考
  • 编写应用程序

编写驱动代码

#PS:这次使用了标准gpio函数和ioctl函数进行编写,进一步缩小代码行数

头文件内容:

#define GEC6818_C7_STA       _IOR('K',  1, unsigned long)//这个是io的命令定义 有三种:_IOR,_IOW,_IORW在使用ioctl函数的时候要用到
#define GEC6818_C8_STA      _IOW('K',  2, unsigned long)struct csb_gpio_info{unsigned int gpio_ID;unsigned char* gpio_flag;
};//gpio函数要用的参数结构体static struct csb_gpio_info gpio_info[2]={//给结构体赋值{PAD_GPIO_C+7,//这个参数要参考kernel里面的代码,每个芯片都不一样"gpioc_7"//这个就什么只是一个标记而已},{PAD_GPIO_C+8,"gpioc_8"}
};

1> 定义和初始化混杂设备

(混杂设备定义简单,利于实验练习,可对比上一篇LED驱动使用的标准字符设备定义)

static int __init csb_drv_init(void){//这个是驱动程序入口函数类似于Main不过驱动入口要声明,参考函数module_init()int rt,var;rt = misc_register(&s3c_adc_miscdev);//这里初始化混杂设备,s3c_adc_miscdev这个参数下面有介绍if (rt!=0) {printk(KERN_ERR "cannot register miscdev on minor=%d (%d)\n",MISC_DYNAMIC_MINOR, rt);goto err_clk;}for (var = 0; var < 2; ++var) {//为了防止gpio驱动有冲突先释放gpio_free(gpio_info[var].gpio_ID);}//最好不要这样做,会出现bug,rmmod 驱动后重新insmod会出现断错误for (var = 0; var < 2; ++var) {rt=gpio_request(gpio_info[var].gpio_ID,gpio_info[var].gpio_flag);//申请GPIO驱动if(rt < 0){printk("gpio_request:%s fail\n",gpio_info[var].gpio_flag);goto gpio_request_fail;}}printk("gec6818 csb init\n");return 0;gpio_request_fail:for (var = 0; var < 2; ++var) {gpio_free(gpio_info[var].gpio_ID);}err_clk:misc_deregister(&s3c_adc_miscdev);//注销混杂设备return rt;
}
//***************************************************************
static void __exit csb_drv_register(void){misc_register(&s3c_adc_miscdev);//注销混杂设备
}//驱动程序的入口:insmod led_drv.ko调用module_init,module_init又会去调用gec6818_key_init。
module_init(csb_drv_init);//驱动程序的出口:rmsmod led_drv调用module_exit,module_exit又会去调用gec6818_key_exit。
module_exit(csb_drv_register);

2> 定义驱动文件集

#ps: 文件集是啥?就是定义你应用程序打开驱动文件、write驱动文件和ioctl驱动文件时会被调用的函数

static int  gec6818_csb_open (struct inode * inode, struct file *file)
{//配置GPIOC8为输出模式gpio_direction_output(gpio_info[1].gpio_ID,0);//使用标准gpio接口配置GPIO为输出模式//配置GPIOC7为输入模式gpio_direction_input(gpio_info[0].gpio_ID);//使用标准gpio接口配置GPIO为输入模式printk("gec6818_csb_open \n");return 0;
}
static int  gec6818_csb_release (struct inode * inode, struct file *file)
{printk("gec6818_csb_release \n");return 0;
}
static long gec6818_csb_ioctl (struct file *filp, unsigned int cmd, unsigned long args)
//第一个参数:驱动文件的文件描述符,第二个是iotcl的命令(去看头文件内容有),第三个参数你可以传指针,传值等会详细介绍一下
//这个函数是今天驱动的重点,ioctl函数,当应用层调用ioctl()时它会被调用
{switch (cmd) {case  GEC6818_C7_STA:{long csb_val;int rt; csb_val = sr04_get_distance();//这个函数就是返回测量的距离大家不用详细去看rt = copy_to_user((void*)args,&csb_val,4);/** static inline long copy_to_user(void __user *to,const void *from, unsigned long n)to:用户空间数据的地址from:内核空间数据的地址 (所以我们可以通过函数参数args传进来)n:要拷贝的字节数    */if(rt != 0){return -EFAULT;}}break;case  GEC6818_C8_STA:{gpio_set_value(gpio_info[1].gpio_ID,args);//gpio标准函数设置输出电平}break;}return 0;
}
static struct file_operations csb_fops = {//这是驱动文件的文件集机构体.owner         = THIS_MODULE,.open        = gec6818_csb_open,.release            = gec6818_csb_release,.unlocked_ioctl     = gec6818_csb_ioctl,
};
/** struct file_operations {struct module *owner;
...........loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);int (*open) (struct inode *, struct file *);
int (*release) (struct inode *, struct file *);...........
};
文件操作集的作用:
每个字符设备都必须有一个文件操作集,文件操作集是驱动程序给应用程序访问硬件的一个接口,应用层与驱动程序函数接口的对应关系如下:
*/
static struct miscdevice s3c_adc_miscdev = {//混杂设备属性的结构体.minor      = MISC_DYNAMIC_MINOR,  //指定了ADC的次设备号为131,也可以MISC_DYNAMIC_MINOR,动态分配次设备号.name        = "csb",     //设备名称,/dev/adc.fops        = &csb_fops,//文件操作集
};

3>粗略介绍下超声波检测距离函数里面几个细节

int sr04_get_distance(void)
{int t=0;gpio_set_value(gpio_info[1].gpio_ID,1);udelay(20);gpio_set_value(gpio_info[1].gpio_ID,0);while(gpio_get_value(gpio_info[0].gpio_ID)==0)//PEin(6)==0){t++;udelay(1);if(t >= 1000000)return 0xFFFFFFFF;}t=0;while(gpio_get_value(gpio_info[0].gpio_ID)){t++;udelay(8);}t=t/2;return 3*t;
}
这里主要讲一下udelay()函数,内核延时有长延时和短延时它们各自的原理都不一样,对CPU占用也各自不同
我有这个相关文档可以找我拿,WX:a812417530

4> 编译内核参考

LED驱动文章

编写应用程序

#define GEC6818_C7_STA       _IOR('K',  1, unsigned long)//这个是ioctl命令,这里定义必须与驱动程序定义一样
#define GEC6818_C8_STA      _IOW('K',  2, unsigned long)int main(void){int csb_fd,distance;//打开gec6818_leds设备csb_fd = open("/dev/csb",O_RDWR);if(csb_fd < 0){perror("open /dev/csb:fail");return -1;}while (1) {ioctl(csb_fd,GEC6818_C7_STA,&distance);//这个函数会直接调用我们驱动代码里面的gec6818_csb_ioctl()函数if(distance==0xFFFFFFFF){printf("sr04 is error\r\n");}else {printf("the distance = %d\n",distance);}sleep(1);}}

然后用开发板的交叉编译工具编译,把程序和驱动下载到开发板


分别加载驱动和运行程序,完成~~~~~

基于[三星6818]芯片超声波测距驱动编写相关推荐

  1. 基于51单片机HC-SR04超声波测距带温度补偿

    基于51单片机HC-SR04超声波测距带温度补偿 1 开发环境 2 功能说明介绍 3 程序 3.1 工程文件 3.2 代码 4 原理图 5 元器件清单 6 PCB 7全部资料 1 开发环境 仿真图:p ...

  2. 51单片机 普中V2 超声波测距 报警 显示 基于MCS51单片机的超声波测距模块的开发

    基于MCS51单片机的超声波测距模块的开发 采用C51程序设计语言,完成下列功能要求. l 必选功能: (1) 超声波模块和单片机的接口设计,画出完整的电路原理图.(15分) (2) 开发板上电时,显 ...

  3. (十)基于Linux算时差——超声波测距原理及代码实现

    学习日志(十) 基于Linux算时差--超声波测距原理及代码实现 测距原理基本说明 超声波测距模块:是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离 ...

  4. 基于51单片机的超声波测距及温度补偿

    具体实现功能 系统由STC89C52单片机+超声波测距传感器(HC-SR04)+DS18B20温度传感器+LCD1602液晶显示屏+按键+蜂鸣器+电源构成 具体功能:1.LCD1602液晶显示测量的距 ...

  5. 基于stm32单片机的超声波测距显示倒车雷达提醒报警系统Proteus仿真

    资料编号:145   下面是相关功能视频演示: 145-基于stm32单片机的超声波测距显示倒车雷达提醒报警系统Proteus仿真(源码+原理图+仿真+论文) 设计内容 本次嵌入式课程设计综合实验的内 ...

  6. 基于51单片机的超声波测距模块

    实现功能 通过超声波模块进行测距显示在LCD1602上并通过设在程序上设置上下限进行进行超出上下限的报警蜂鸣器 模块 1.89c51 2.lcd1602 3.超声波测距模块 4,蜂鸣器 作者用的是51 ...

  7. 基于52单片机的超声波测距模块(hc-sr04超声波测距模块+1602液晶显示器)

    二年级课设做了超声波测障仪,用的是hc-sr04超声波测距模块+1602液晶显示器和52单片机. 由于自己之前的学习很是不牢固,在课设的时候没少走弯路,最后在第二个周的星期五做了出来,浪费了很多的时间 ...

  8. 基于51单片机的超声波测距_液位检测_温度检测protues仿真

    硬件设计 (末尾附文件) 代码设计 //宏定义 #define uchar unsigned char #define uint unsigned int #define ULint unsigned ...

  9. vxWorks6.6下基于VxBus架构的Can控制器(sja1000t)驱动编写

    vxWorks6.6下基于VxBus架构的Can控制器驱动编写 目录 1       VxBus下驱动的架构...1 1.1        WorkBench3.0的认识...1 1.2        ...

  10. 测距必备,8个超声波测距方案,实时更可控

    由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现.利用超声波检测往往比较迅速.方便.计算简单.易于做到实时控制,并且 ...

最新文章

  1. CVPR 2022放榜!录用 2067 篇,接收数量上升24%
  2. mysql 西安_MySQL分区维护
  3. 构建根文件系统之busybox(三)最小根文件系统
  4. 爱吃苹果的与喜欢篮球的没必要非得达成一致~
  5. Java High CPU故障排除指南–第1部分
  6. GIS工具篇(一):2000大地坐标系转换指南
  7. hdu 1161 Eddy's mistakes
  8. Python项目--飞机作战完整版(附带图片素材)
  9. 如何显示电脑已连接的WiFi的密码
  10. 计算机维护费入什么会计科目,​系统维护费记入什么会计科目
  11. %02x与%2x 区别
  12. 电路定理——替代定理
  13. Creator仿超级玛丽小游戏源码分享
  14. Egret引擎制作旅行青蛙
  15. 必须了解的待人处事小技巧
  16. VirtualBox 虚拟机软件
  17. 数组循环左移问题,将一个N个元素的数组向左移i个位置
  18. 台式机系统安装成功之后,官网下载,安装台式机主板最匹配的官网驱动
  19. unknown custom element: <router-link> - did you register the component correctly? For recursiv
  20. Windows10系统蓝屏解决方案

热门文章

  1. 计算机网络 谢希仁(第8版)第五章习题答案
  2. Android自定义view之围棋动画(化繁为简)
  3. 松翰单片机之M2ASM创建新工程
  4. 构建具有时间依存协变量的Elastic-net Cox模型
  5. 我的第二次知识图谱问答(末尾gan货)
  6. 如何细分目标客户群体,让邮件效果更好?
  7. js 实现文件下载——文档流形式和本地文件下载——基础积累
  8. 开源数据库连接池的使用
  9. html宋体四号字如何设置,宋体小四字体是多少号 首先打开WORD文档,进入界面
  10. 影子内存(Shadow RAM)介绍_4