基于I.MX6ULL + LINUX驱动程序 Qt车载系统

2024-04-30 1507阅读

Qt车载系统有的功能:音视频播放、天气显示、地图显示、起点搜索和终点搜索,路线导航,倒车影像,倒车障碍实时距离显示,温湿度曲线绘制,交叉编译,程序优美界面。

使用技术:  Qt应用程序开发,Linux 驱动程序开发,HC-SR04超声波模块驱动,Linux C嵌入式应用,JavaScript,Qt WebEngine(内嵌HTML),HTTP,JSON。

基于I.MX6ULL + LINUX驱动程序 Qt车载系统

基于I.MX6ULL + LINUX驱动程序 Qt车载系统

HC-SR04超声波模块驱动:

使用新字符设备驱动开发框架  (配置寄存器方式)  编写好HC-SR04超声波模块驱动 ,并提供应用层控制接口,然后将 .ko 文件拷入开发板加载入内核。每次应用空间对驱动文件读操作,将返回超声波模块一次声波来回的间隔时间(纳秒),根据公式将此数据转换为秒,然后带入L=V * T / 2,得出倒车距离。   这里用让驱动层返回纳秒的而不是距离的原因是:Linxu内核对浮点数操作挺麻烦的就直接传给应用层让QT去搞简简单单。

驱动源码:初始化两个GPIO引脚

#ifndef _MAIN_
#define _MAIN_
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
/* 寄存器物理地址 */
#define CCM_CGPR1_BASE  (0x020C406C)  //GPIO1
#define MUX_CTL_PAD_GPIO1_IO04_BASE   (0x020E006C)   
#define MUX_CTL_PAD_GPIO1_IO09_BASE   (0x020E0080)
#define PAD_CTL_PAD_GPIO1_IO04_BASE      (0x020E02F8)
#define PAD_CTL_PAD_GPIO1_IO09_BASE       (0x020E030C)
#define GPIO1_DR_BASE (0x0209C000)
#define GPIO1_GDIR_BASE (0x0209C004)
/* 映射后的寄存器虚拟地址指针 */
static void __iomem * CCM_CGPR1;
static void __iomem *MUX_CTL_PAD_GPIO1_IO04;
static void __iomem *MUX_CTL_PAD_GPIO1_IO09;
static void __iomem *PAD_CTL_PAD_GPIO1_IO04;
static void __iomem *PAD_CTL_PAD_GPIO1_IO09;
static void __iomem *GPIO1_DR;
static void __iomem *GPIO1_GDIR;
void register_init(void);
void HC_SR04_Init(void);
void myexit(void);
unsigned long long Test_Distance(void);
void SetBits(void);     //25
void ResetBits(void);
unsigned int ReadInputDataBit(void);    //24
void register_init(void)
{
   printk("register_init\r\n");
  CCM_CGPR1=ioremap(CCM_CGPR1_BASE,4);
	MUX_CTL_PAD_GPIO1_IO04=ioremap(MUX_CTL_PAD_GPIO1_IO04_BASE, 4);
	MUX_CTL_PAD_GPIO1_IO09=ioremap(MUX_CTL_PAD_GPIO1_IO09_BASE,4);
	PAD_CTL_PAD_GPIO1_IO04=ioremap(PAD_CTL_PAD_GPIO1_IO04_BASE,4);
	PAD_CTL_PAD_GPIO1_IO09=ioremap(PAD_CTL_PAD_GPIO1_IO09_BASE,4);
	GPIO1_DR = ioremap(GPIO1_DR_BASE, 4);
	GPIO1_GDIR = ioremap(GPIO1_GDIR_BASE, 4);
}
unsigned long long Test_Distance(void)
{
   unsigned long long start_time, end_time, diff_time;
    SetBits(); //25
		udelay(30);
    ResetBits(); //25
	 //read 24
    while(ReadInputDataBit()==0);
    start_time = ktime_get_ns();
    while(ReadInputDataBit()==1);
    end_time = ktime_get_ns();
		diff_time = end_time - start_time;
		mdelay(100);
    return diff_time;
}
void HC_SR04_Init(void)
{
	    unsigned int val;
  /*开启GPIO1时钟*/
	 val = readl(CCM_CGPR1);  
	 val &= ~(3 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]