芯众云 安卓驱动工程师
职位描述
Android开发经验 Java C++ Android客户端产品研发
1、正规院校本科以上学历,电子、通信、控制和计算机等相关专业毕业;
2、具有一定的硬件基础,能够很好的理解硬件电路设计原理,能看懂芯片手册;
3、精通C,C++语言,JAVA语言以及常用的数据结构和算法;
4、熟悉Linux内核驱动编程,熟悉Linux驱动架构;
5、有Android,Ubuntu驱动开发经验,能独立编写、移植或修改驱动程序;
6、熟悉Android,Ubuntu, Debian等系统下USB,LCD,Camra,GPS,Sensor,4G, TP,GPU等模块驱动开发和移植;
7、具有较强的工作积极性、责任心和团队合作精神;
8、有瑞芯微(RK3188/3288/3399),全志(A20/A31/H8),MTK方案开发经验者优先;
岗位描述:
1、负责Android系统软件的需求分析、设计、开发。
2、负责android设备的驱动开发及维护;
3、与硬件开发人员共同制定软硬件接口;
4、负责完成Android系统Kernel维护升级,Android HAL层基本开发,framework基本修改;
任职要求
1、正规院校大专以上学历,电子、通信、控制和计算机等相关专业毕业;
2、具有一定的硬件基础,能够很好的理解硬件电路设计原理,能看懂芯片手册;
3、精通C,C++语言,JAVA语言以及常用的数据结构和算法;
4、熟悉Linux内核驱动编程,熟悉Linux驱动架构;
5、有android驱动开发经验,能独立编写、移植或修改驱动程序;
6、熟悉Android下USB,LCD,Camra,GPS,Sensor,3G, TP等模块驱动开发;
7、具有较强的工作积极性、责任心和团队合作精神;
8、有瑞芯微(RK3188/3288/3399),全志工(A20/A31/H8),MTK方案开发经验者优先;
工作时间8:30-12:00 14:00-18:30 大小周daxiaozhou
其他节假日根据国家法定节假日放
公司福利:购买社保/节日礼物/生日礼物/不定时下午茶/生日趴/不定时旅游/团建活动等等
(基于芯众云职位要求设计,覆盖硬件基础、驱动开发、系统架构等核心能力)
一、硬件基础与芯片手册解析
面试题1:如何根据芯片手册(如RK3399)配置GPIO引脚为I2C功能?需说明寄存器操作步骤。
参考答案:
查阅芯片手册的引脚复用章节,确定目标GPIO的复用寄存器地址(如$ ext{GRF_GPIO4C_IOMUX} $)。计算复用位偏移:若GPIO4_C3用作I2C1_SDA,则设置偏移位$ ext{bit}[14:12]=0b001 $(二进制)。写入寄存器:通过映射物理地址,用
ioremap写入配置值,例如:
writel
writel((0b001<<12)|(0b001<<28),base_addr+0xE640)” role=”presentation”>writel((0b001<<12)|(0b001<<28),base_addr+0xE640)writel((0b001<<12)|(0b001<<28),base_addr+0xE640)
其中高16位为掩码,低16位为值。
面试题2:I2C通信中SCL信号被拉低无法恢复,可能有哪些硬件原因?如何排查?
参考答案:
原因:
设备地址冲突(从机未响应ACK)SDA/SCL线短路到GND上拉电阻阻值过大(如>10kΩ导致上升沿过慢)
排查步骤:
断开所有从设备,用示波器检测波形。测量SCL线对地阻抗,确认是否短路。检查I2C控制器驱动是否配置为开漏模式。
二、Linux驱动开发
面试题3:编写字符设备驱动时,结构体必须实现哪些函数?给出
file_operations函数的模板代码。
read
参考答案:
核心函数:,
open,
release,
read,
write。
unlocked_ioctl
static ssize_t my_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) {
uint8_t kernel_buf[256];
if (copy_to_user(buf, kernel_buf, min(count, sizeof(kernel_buf))))
return -EFAULT; // 用户空间拷贝失败
*f_pos += count;
return count;
}
面试题4:解释Linux设备树(Device Tree)的作用,并举例说明如何为SPI设备定义节点。
参考答案:
作用:解耦硬件描述与内核代码,支持动态硬件配置。SPI设备示例(以TP触摸屏为例):
&spi1 {
status = "okay";
touchscreen@0 {
compatible = "focaltech,ft6236";
reg = <0>; // CS0引脚
spi-max-frequency = <10000000>;
interrupt-parent = <&gpio4>;
interrupts = <5 IRQ_TYPE_EDGE_FALLING>; // GPIO4_A5
};
};
三、Android HAL与驱动移植
面试题5:将Linux摄像头驱动(如OV5640)移植到Android时,需在HAL层实现哪些接口?
参考答案:
CameraModule:实现和
get_number_of_cameras。CameraDevice:重写
get_camera_info和
set_preview_window。关键回调:通过
start_preview注册
set_callbacks传递数据帧。V4L2适配:在HAL中调用
notify_callback申请视频缓冲区。
ioctl(VIDIOC_REQBUFS)
面试题6:Android 10中Sensor驱动需满足哪些新规范?如何为陀螺仪实现Sensor HAL v2.0?
参考答案:
规范:必须支持Direct Report模式(低延迟)和动态传感器连接。实现步骤:
在中定义HIDL接口。实现
hardware/interfaces/sensors/2.0/返回
getSensorsList结构体(含$ ext{sensorType} = ext{GYROSCOPE} $)。重写
SensorInfo函数设置采样周期$ Delta t $(单位微秒)。
batch
四、模块开发与调试
面试题7:USB OTG功能在Android设备无法识别U盘,如何定位内核层问题?
参考答案:
检查dmesg日志:
adb shell dmesg | grep dwc3
若输出,可能是PHY时钟未使能。确认驱动配置:
ERR Setup Error
内核启用。Device Tree中
CONFIG_USB_CONFIGFS_F_FS=y设置为
dr_mode。
otg
测量VBUS电压:低于4.75V可能导致枚举失败。
面试题8:LCD出现花屏,从驱动角度分析可能原因及解决方案。
参考答案:
| 原因 | 解决方案 |
|---|---|
| 时序参数错误(如$ t_{ ext{HS}} $) | 调整中的/ |
| 帧缓冲(Framebuffer)未对齐 | 用分配内存,确保4K对齐 |
| MIPI DSI Lane干扰 | 降低时钟频率或增加Lane间距 |
五、算法与优化
面试题9:用C++实现快速排序算法,并说明其在驱动开发中的应用场景。
参考答案:
void quick_sort(int arr[], int left, int right) {
if (left >= right) return;
int pivot = arr[(left + right) / 2];
int i = left, j = right;
while (i <= j) {
while (arr[i] < pivot) i++;
while (arr[j] > pivot) j--;
if (i <= j) std::swap(arr[i++], arr[j--]);
}
quick_sort(arr, left, j);
quick_sort(arr, i, right);
}
应用场景:传感器数据预处理(如加速度计去噪时排序滤波)。
面试评价要点
硬件能力:是否准确分析电路问题(如I2C波形)。代码质量:驱动代码是否考虑并发(使用)、内存安全。系统理解:对Android从Kernel到HAL的完整调用栈描述是否清晰。调试经验:是否熟练使用
spin_lock、
ftrace等工具优化驱动性能。
perf
注:参考答案需结合候选人对瑞芯微/全志等平台的实际开发经验深度追问(如RK3399的NPU驱动移植难点)。


















暂无评论内容