Kernel中uart接口的bluetooth driver初始化分析

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

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

  1. staticint__inithci_uart_init(void)
  2. {
  3. staticstructtty_ldisc_opshci_uart_ldisc;
  4. interr;
  5. BT_INFO("HCIUARTdriverver%s",VERSION);
  6. /*Registerthettydiscipline*/
  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("HCIlinedisciplineregistrationfailed.(%d)",err);
  30. returnerr;
  31. }
  32. //以h4为例来进行讲解
  33. h4_init();
  34. ……return0;
  35. }
  36. int__inith4_init(void)
  37. {
  38. //就是向uartprotol中注册对应的driver,详细分析见下面。
  39. interr=hci_uart_register_proto(&h4p);
  40. if(!err)
  41. BT_INFO("HCIH4protocolinitialized");
  42. else
  43. BT_ERR("HCIH4protocolregistrationfailed");
  44. returnerr;
  45. }
  46. staticstructhci_uart_protoh4p={
  47. .id=HCI_UART_H4,
  48. .open=h4_open,
  49. .close=h4_close,
  50. .recv=h4_recv,
  51. .enqueue=h4_enqueue,
  52. .dequeue=h4_dequeue,
  53. .flush=h4_flush,
  54. };
  55. inthci_uart_register_proto(structhci_uart_proto*p)
  56. {
  57. if(p->id>=HCI_UART_MAX_PROTO)
  58. return-EINVAL;
  59. if(hup[p->id])
  60. return-EEXIST;
  61. //其实说白了就是初始化hup数组(hciuartproto)
  62. //在这之后的open,write,read什么的就可以通过这个数组找到对应proto的相应的调用接口中去
  63. hup[p->id]=p;
  64. return0;
  65. }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值