android 驱动开发 面试问题记录

本文记录自身面试Android驱动开发工程师时面试官问到的部分技术相关问题(仅供参考)。


一. 系统裁剪:具体方法?在裁剪过程中如何判别是否需要或者保留?
  1. 去除不必要的apk
    系统中有许多基本用不到的apk,大概占用system分区超过100MB的空间,去除之后可以有效地缩短开机时间.

  2. 去除不必要的驱动
    .config文件中有驱动的开关,不必要的可以直接关闭(make menuconfig)

  3. framework层
    删除部分语言(languages_full.mk),删除无用文件(mk文件中)

  4. 去除无用的服务
    删除无用的脚本和service(4G服务…),删除无用打印信息(不输出bootloader和uboot打印,kernel打印等级降为1)


二.调试外设时一般是怎样的流程?(比如LCD屏幕)
  1. 获取屏幕规格书(确定调试的是什么类型的屏幕<单/双lvds,edp,mipi…>);
  2. 在对应的dts文件中配置参数(kernel/arch/arm/boot/dts);
  3. 根据屏幕规格书确定参数:

1> 背光电压,屏供电电压;
2> clock-frequency: lcd时钟频率,单位为Hz;
3> Hactive:水平有效像素,Vactive:垂直有效像素
4> hback-porch/hfront-porch/hsync-len:水平同步信号,vback-porch/vfront-porch/vsync-len:垂直同步信号

  1. 对应硬件原理图配置gpio状态(根据硬件定义拉高或者拉低):

背光控制脚(enable),屏使能脚(enable),复位脚(reset)

  1. 调试排查手段:

cat d/dri/0/summary
查看vop的打开在状态以及屏幕接口
cat /sys/kernel/debug/gpio
查看gpio状态,确认gpio配置是否正常

注: 先开pwm背光,然后lvds输出使能,会导致出现的白屏画面( pwm背光使能延时 > lvds屏使能延时(先使能lvds后使能背光)。


三.驱动的通用流程?

驱动的通用流程如下:

  1. 初始化:进行一些必要的初始化操作,例如设置引脚模式、初始化设备等。
  2. 配置参数:根据硬件需求或用户需求,配置相应的参数,例如PWM的周期、占空比、极性等。
  3. 使能设备:打开相应的设备或模块,如启用SPI传输或者使能I2C总线等。
  4. 操作设备:执行具体的操作,例如向设备发送指令或数据,接收设备返回的数据等。
  5. 关闭设备:当操作完成之后,关闭设备或模块,释放相关资源,并做好善后工作。

在这里插入图片描述

四.中断?Linux中断的处理流程?中断来了会怎么办?同步?同步是干什么的?

中断:
CPU在执行指令时,收到某个中断信号转而去执行预先设定好的代码,执行完毕后再返回到原指令流中继续执行。分为硬件中断和软件中断

扫描二维码关注公众号,回复: 15980199 查看本文章

中断流程

  1. CPU收到中断信号后会把 ESP、CS等 能恢复当前执行状态流的寄存器数据 保存到内核栈上。
    基本都是采取双堆栈的设计形式,CPU会判断当前状态,先将用户栈切换为内核栈,然后再保存数据。

  2. 获取中断向量号。
    每一个中断信号都有一个中断向量号,中断向量号是一个整数。CPU收到一个中断信号会根据这个信号的中断的向量号去查询中断向量表,再调用向量表相应的处理函数。
    中断向量号与中断信号的对应关系:对于CPU异常来说,其向量号是由CPU架构标准规定的。对于外设来说,其向量号是由设备驱动动态申请的。对于IPI中断和指令中断来说,其向量号是由内核规定的。

  3. 根据中断向量号从中断向量表中找到对应的门描述符,对描述符做一番安全检查之后,CPU就开始执行中断处理函数(就是门描述符中的段偏移)。中断处理函数的最末尾执行IRET指令,这个指令会根据前面保存在栈上的数据跳回到原来的指令继续执行。

同步:
在操作系统引入了进程概念,进程成为调度实体后,系统就具备了并发运行多个进程的能力,但也导致了系统中各个进程之间的资源竞争和共享。另外,因为中断、异常机制的引入,以及内核态抢占都导致了这些内核运行路径(进程)以交错的方式运行。
对于这些交错路径运行的内核路径,如不采取必要的同步措施。将会对一些重要数据结构进行交错訪问和改动。从而导致这些数据结构状态的不一致,进而导致系统崩溃。
为了确保系统高效稳定有序地运行,linux必需要采用同步机制。

  1. 原子操作
    原子操作在内核中主要保护某个共享变量,防止该变量被同时访问造成数据不同步问题。

  2. 信号量
    信号量一般实现互斥操作,但是可以指定处于临界区的进程数目,当规定数目为1时,表示此为互斥信号量。

  3. 自旋锁
    对于数据结构或者变量的保护
    对于临界区代码的保护

    全局变量V,表示锁;当V=1时为锁定状态,V=0时为解锁状态;
    自旋锁机制仅仅同意唯一的一个运行路径持有自旋锁。假设处理器A上的代码要进入临界区。就先读取V的值。假设V!=0说明是锁定状态,表明有其它处理器的代码正在对共享数据进行訪问,那么此时处理器A进入忙等状态(自旋)。假设V=0。表明当前没有其它处理器上的代码进入临界区,此时处理器A能够訪问该临界资源。

    .
    .
    .


五.Linux通用的驱动模型

Linux设备驱动模型包含设备(device)、总线(bus)、类(class)和驱动(driver),它们之间相互关联。

总线bus:
在这里插入图片描述
设备:
每一个设备都由一个device结构体来描述。device结构体包含了设备所具有的一些通用信息。

当遇到新设备时,需要定义一个新的设备结构体,将device作为新结构体的成员。这样就可以在新的结构体中定义新设备的一些信息,而设备通用的信息就使用device结构体来表示。

驱动:

  1. struct device_driver是驱动程序在内核驱动框架中的抽象

  2. 关键元素1:name,驱动程序的名字,经常被用来作为驱动和设备的匹配依据

  3. 关键元素2:probe,驱动程序的探测函数,用来检测一个设备是否可以被该驱动所管理

类:

  1. 相关结构体:struct class 和 struct class_device

  2. udev的使用离不开class

  3. class的真正意义在于作为同属性一个class的多设备的容器。
    目的:为了对各种设备进行分类管理,class在分类的同时还对每个类贴上了些“标签”,这也是设备驱动模型为我们写驱动提供的基础设施。

猜你喜欢

转载自blog.csdn.net/weixin_45639314/article/details/131330353