2025-2026-2《嵌入式系统原理及应用》复习提纲

更新时间: 试题数量: 购买人数: 提供作者:

有效期: 个月

章节介绍: 共有个章节

收藏
搜索
题库预览
裸机程序开发 蜂鸣器原理图和部分寄存器功能如下所示,且GPIOC14 功能配置在 function1(01)的时候为普通 GPIO 口。请将蜂鸣器驱动程序补充完整。 蜂鸣器原理图: <此处为图片> 寄存器功能表: <此处为图片> 蜂鸣器驱动代码: beep_drv.c //省略头文件 //定义驱动命令 #define GEC6818_BEEP_ON _IO('B', 1) //开蜂鸣器 #define GEC6818_BEEP_OFF _IO('B', 2) //关蜂鸣器 //定义一个设备驱动 static struct cdev gec6818_beeep_cdev; static unsigned int beep_major=0;//主设备号 static unsigned int beep_minor=0;//次设备号 static dev_t beep_num;//设备号 static struct class *beep_class;//创建一个 class static struct device *beep_device;//device 的指针 static struct resource *beep_res;//资源 //指向虚拟地址的一个指针 static void __iomem *gpioc_base_va; static void __iomem *gpiocout_va; static void __iomem *gpiocoutenb_va; static void __iomem *gpiocaltn0_va; static long gec6818_beeep_ioctl(struct file *filp, unsigned int cmd, unsigned long args) { int temp; switch(cmd) { case GEC6818_BEEP_ON: temp=readl(gpiocout_va); temp |= (1<<14) ; writel(temp,gpiocout_va); break; case GEC6818_BEEP_OFF: temp = readl(gpiocout_va); temp &= ~(1<<14) ; writel(temp,gpiocout_va); break; default: return -ENIOCTLCMD; } return 0; } //定义一个文件操作集 并初始化 static const struct file_operations gec6818_beeep_fops={ .owner = THIS_MODULE, .unlocked_ioctl = gec6818_beeep_ioctl, }; //入口函数 static int __init gec6818_beeep_init(void) { int ret; int temp;//定义一个中间值 //3.动态申请设备号 ret = alloc_chrdev_region(&beep_num,beep_minor,1,"beep_driver"); if(ret<0) {//判断获取设备号是否有问题 printk("<4>""can not get a device number\n"); return ret; } //4.初始化字符设备 cdev_init(&gec6818_beeep_cdev, &gec6818_beeep_fops); //5. 加入内核 ret = cdev_add(&gec6818_beeep_cdev, beep_num, 1); if(ret < 0){ printk("<4>""can not add cdev \n"); goto cdev_add_error; } //6.创建 class,类名为"beep_class" beep_class = class_create(THIS_MODULE,"beep_class") ; if(beep_class == NULL){ printk("<4>""class create error \n"); ret=EBUSY; goto class_create_error; } //7.创建 device beep_device = device_create(beep_class,NULL,beep_num,NULL,"beep_drv"); if(beep_device == NULL){ printk("<4>""device create error \n"); ret=EBUSY; goto device_create_error; } //8.申请物理内存区 beep_res=request_mem_region(0xC001C000, 0x1000, "GPIOC_MEM"); if(beep_res == NULL){ printk("<4>""can no request memory \n"); ret=EBUSY; goto request_mem_error; } //9 IO 内存动态映射 gpioc_base_va = ioremap(0xC001C000, 0x1000); if(gpioc_base_va == NULL){ printk("<4>""can no ioremap memory \n"); ret=EBUSY; goto ioremap_error; } //得到每个寄存器的虚拟地址 gpiocout_va = gpioc_base_va+0x00; gpiocoutenb_va= gpioc_base_va+0x04; gpiocaltn0_va=gpioc_base_va+0x20; //10 访问虚拟地址 //使用 readl 和 writel //10.1 BEEP GPIOC14 ---->function1,作为普通 GPIO 口 temp = readl(gpiocaltn0_va); temp &= ~(3<<28) ; temp |= (1<<28); writel(temp,gpiocaltn0_va); //设置 GPIO 口为输出口 temp = readl(gpiocoutenb_va); temp |= (1<<14) ; writel(temp,gpiocoutenb_va); //10.3 GPIOC14-->设置默认为蜂鸣器不响,beep off temp = readl(gpiocout_va); temp &=~ (1<<14); writel(temp,gpiocout_va); //10.2 GPIOC14 -->设置为输出 printk("<4>""beep driver init chenyt\n"); return 0; } ioremap_error: release_mem_region(0xC001C000, 0X1000); request_mem_error: device_destroy(beep_class, beep_num); device_create_error: device_destroy(beep_class, beep_num); class_create_error: device_destroy(beep_class, beep_num); cdev_add_error: device_destroy(beep_class, beep_num); return ret; } (缺图)
1