088、ISP Firmware 与 HAL 交互:从 APP 请求到 ISP 寄存器写入的调用链路
088、ISP Firmware 与 HAL 交互:从 APP 请求到 ISP 寄存器写入的调用链路
一、一个让我熬夜三天的bug
去年做某平台旗舰机调试,遇到一个诡异现象:相机预览偶尔卡死,log里没有任何错误,ISP寄存器读出来全是0xDEAD。查了三天,最后发现是HAL层在发送AE统计请求时,firmware侧的中断处理函数里一个指针没做空检查,导致在特定时序下写入了非法地址。这个bug让我意识到,从APP按下快门到ISP寄存器真正写入,中间这条调用链路远比想象中脆弱。
今天就把这条链路从头到尾扒一遍,重点讲那些文档里不会写的“坑”。
二、APP层:你以为的“拍照”其实是“发消息”
APP调用takePicture()时,你以为它在直接操作硬件?太天真了。Android Camera HAL3架构下,APP通过CameraDevice的capture()方法提交一个CaptureRequest,这个请求会经过CameraService的调度,最终到达HAL层的processCaptureRequest()。
这里有个关键点:APP的请求是异步的。capture()返回后,APP并不知道ISP什么时候真正开始曝光。HAL层收到请求后,会把它塞进一个请求队列,然后立刻返回。真正的处理在另一个线
