当前位置:   article > 正文

Kernel中uart接口的bluetooth driver初始化分析_hci_uart_init驱动加载

hci_uart_init驱动加载

在前面几篇文章中,我们把kernelbluetooth stack相关的初始化分析完成,今天晓东带大家来一起分析uart接口的bluetooth driver的初始化。首先,我们来到kernel/drivers/bluetooth目录,看hci_ldisc.c文件。又见到我们熟悉的module_init

module_init(hci_uart_init);好吧,动手来看吧:

[cpp]  view plain copy
  1. static int __init hci_uart_init(void)  
  2. {  
  3.     static struct tty_ldisc_ops hci_uart_ldisc;  
  4.     int err;  
  5.     BT_INFO("HCI UART driver ver %s", VERSION);  
  6.     /* Register the tty discipline */  
  7.     memset(&hci_uart_ldisc, 0, sizeof (hci_uart_ldisc));  
  8.     hci_uart_ldisc.magic        = TTY_LDISC_MAGIC;  
  9.     hci_uart_ldisc.name     = "n_hci";  
  10.     hci_uart_ldisc.open     = hci_uart_tty_open;  
  11.     hci_uart_ldisc.close        = hci_uart_tty_close;  
  12.     hci_uart_ldisc.read     = hci_uart_tty_read;  
  13.     hci_uart_ldisc.write        = hci_uart_tty_write;  
  14.     hci_uart_ldisc.ioctl        = hci_uart_tty_ioctl;  
  15.     hci_uart_ldisc.poll     = hci_uart_tty_poll;  
  16.     hci_uart_ldisc.receive_buf  = hci_uart_tty_receive;  
  17.     hci_uart_ldisc.write_wakeup = hci_uart_tty_wakeup;  
  18.     hci_uart_ldisc.owner        = THIS_MODULE;  
  19.     //注册了一个tty的新的线路规程,为N_HCI,并定义了他的一系列的操作  
  20. /*线路规程有什么作用呢,我们可以这样理解,tty向应用层注册了一系列的通用接口,这些接口(比如写数据)被调用后会根据对应的线路规程去找对应的driver,然后driver会对数据做一些处理发送到硬件中去。 
  21. 这个通路反过来也是成立。 
  22. 大概的模型如下: 
  23. -----tty层---------- 
  24. -----线路规程----- 
  25. -----driver层------- 
  26. -----硬件层--------- 
  27. */  
  28.     if ((err = tty_register_ldisc(N_HCI, &hci_uart_ldisc))) {  
  29.         BT_ERR("HCI line discipline registration failed. (%d)", err);  
  30.         return err;  
  31.     }  
  32. //以h4为例来进行讲解  
  33.     h4_init();  
  34. ……  return 0;  
  35. }  
  36.   
  37. int __init h4_init(void)  
  38. {  
  39.     //就是向uart protol中注册对应的driver,详细分析见下面。  
  40.     int err = hci_uart_register_proto(&h4p);  
  41.     if (!err)  
  42.         BT_INFO("HCI H4 protocol initialized");  
  43.     else  
  44.         BT_ERR("HCI H4 protocol registration failed");  
  45.     return err;  
  46. }  
  47.   
  48. static struct hci_uart_proto h4p = {  
  49.     .id     = HCI_UART_H4,  
  50.     .open       = h4_open,  
  51.     .close      = h4_close,  
  52.     .recv       = h4_recv,  
  53.     .enqueue    = h4_enqueue,  
  54.     .dequeue    = h4_dequeue,  
  55.     .flush      = h4_flush,  
  56. };  
  57.   
  58. int hci_uart_register_proto(struct hci_uart_proto *p)  
  59. {  
  60.     if (p->id >= HCI_UART_MAX_PROTO)  
  61.         return -EINVAL;  
  62.     if (hup[p->id])  
  63.         return -EEXIST;  
  64. //其实说白了就是初始化hup数组(hci uart proto)  
  65. //在这之后的open,write,read什么的就可以通过这个数组找到对应proto的相应的调用接口中去   
  66.     hup[p->id] = p;  
  67.     return 0;  
  68. }  

所以,总的来说,uart这边的脉络还是很清楚的,就是首先注册线路规程,所有和蓝牙相关的数据将会选择HCI这个线路规程,然后根据各家的方案设计不同,注册对应的proto,数据最终会根据proto选择对应的driver去做处理后发送到对应的硬件(蓝牙controller中)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/326583
推荐阅读
相关标签
  

闽ICP备14008679号