lugarnett 发表于 2013-08-18 16:18

linux 3.4.3内核里的HSI驱动源码问题

最近学习HSI驱动,资料少,只好看kernel里的驱动源码,但是看了后一知半解,故请教哪位前辈能给予解答一下?

1)/driver/hsi以及 /include/linux/hsi 两个文件夹下的源码里为什么找不到HSI寄存器配置的代码?
2)hsi.c和hsi_char.c是什么关系?
3)client文件夹里是什么内容?

lugarnett 发表于 2013-08-18 18:59

有人熟MIPI_HSI吗?

wwxxxxll 发表于 2013-08-19 10:41

本帖最后由 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

lugarnett 发表于 2013-08-20 11:17

先谢谢

我看驱动源码里没有直接对寄存器进行操作,还有你提到的..dummy..函数,是不是这个源码只是驱动程序框架?然后需要我根据需要裁减和修改,比如增加寄存器配置等。


回复 3# wwxxxxll


   

wwxxxxll 发表于 2013-08-20 12:36

应该是,驱动就是这样,要么是现成的,要么提供接口让你自己填!
页: [1]
查看完整版本: linux 3.4.3内核里的HSI驱动源码问题