linux 3.4.3内核里的HSI驱动源码问题
最近学习HSI驱动,资料少,只好看kernel里的驱动源码,但是看了后一知半解,故请教哪位前辈能给予解答一下?1)/driver/hsi以及 /include/linux/hsi 两个文件夹下的源码里为什么找不到HSI寄存器配置的代码?
2)hsi.c和hsi_char.c是什么关系?
3)client文件夹里是什么内容? 有人熟MIPI_HSI吗? 本帖最后由 wwxxxxll 于 2013-08-19 10:42 编辑
我一点也不懂hsi驱动,而且我用的linux-3.2.36没有hsi驱动,
我简单看了一下linux-3.9.6的代码,还是能回答你的一些问题
hsi_char.c和hsi.c
hsi.c是hsi-core,提供一些面向操作系统,例如hsi_register_controller和hsi_unregister_controller等函数
就像usb生成的usb-core.ko
hsi_char.c应该是面向设备的具体的驱动代码,包涵文件操作和寄存器的操作
当用户用ioctl发HSC_SET_RX
hsc_ioctl->hsc_rx_set(channel->cl, &rxc);->hsc_break_request
313 static int hsc_break_request(struct hsi_client *cl)
314 {
315 struct hsc_client_data *cl_data = hsi_client_drvdata(cl);
316 struct hsi_msg *msg;
317 int ret;
318
319 if (test_and_set_bit(HSC_RXBREAK, &cl_data->flags))//应该测试是否可设置,猜的
320 return -EBUSY;
321
322 msg = hsi_alloc_msg(0, GFP_KERNEL);
323 if (!msg) {
324 clear_bit(HSC_RXBREAK, &cl_data->flags);
325 return -ENOMEM;
326 }
327 msg->break_frame = 1;
328 msg->complete = hsc_break_received;
329 msg->destructor = hsc_break_req_destructor;
330 ret = hsi_async_read(cl, msg);//
331 if (ret < 0)
332 hsc_break_req_destructor(msg);
333
334 return ret;
335 }
369 static inline int hsi_async_read(struct hsi_client *cl, struct hsi_msg *msg)
370 {
371 msg->ttype = HSI_MSG_READ;
372 return hsi_async(cl, msg);
373 }
343 int hsi_async(struct hsi_client *cl, struct hsi_msg *msg)
344 {
345 struct hsi_port *port = hsi_get_port(cl);
346
347 if (!hsi_port_claimed(cl))
348 return -EACCES;
349
350 WARN_ON_ONCE(!msg->destructor || !msg->complete);
351 msg->cl = cl;
352
353 return port->async(msg);
354 }
hsi_alloc_controller里
port->async = hsi_dummy_msg;
188 static inline int hsi_dummy_msg(struct hsi_msg *msg __maybe_unused)
189 {
190 return 0;
191 }
这里是虚的,可能你要实现一个具体的硬件操作
从hsi提供的软件模型上说,感觉还好。
当然我对hsi硬件一点不懂!硬件是否复杂我就不清楚了
可以到我们群问问
群:163617970 先谢谢
我看驱动源码里没有直接对寄存器进行操作,还有你提到的..dummy..函数,是不是这个源码只是驱动程序框架?然后需要我根据需要裁减和修改,比如增加寄存器配置等。
回复 3# wwxxxxll
应该是,驱动就是这样,要么是现成的,要么提供接口让你自己填!
页:
[1]