code: func (h *HCI) Init() error {
  	h.evth[0x3E] = h.handleLEMeta
  	h.evth[evt.CommandCompleteCode] = h.handleCommandComplete
  	h.evth[evt.CommandStatusCode] = h.handleCommandStatus
  	h.evth[evt.DisconnectionCompleteCode] = h.handleDisconnectionComplete
  	h.evth[evt.NumberOfCompletedPacketsCode] = h.handleNumberOfCompletedPackets
  
  	h.subh[evt.LEAdvertisingReportSubCode] = h.handleLEAdvertisingReport
  	h.subh[evt.LEConnectionCompleteSubCode] = h.handleLEConnectionComplete
  	h.subh[evt.LEConnectionUpdateCompleteSubCode] = h.handleLEConnectionUpdateComplete
  	h.subh[evt.LELongTermKeyRequestSubCode] = h.handleLELongTermKeyRequest
  	// evt.EncryptionChangeCode:                     todo),
  	// evt.ReadRemoteVersionInformationCompleteCode: todo),
  	// evt.HardwareErrorCode:                        todo),
  	// evt.DataBufferOverflowCode:                   todo),
  	// evt.EncryptionKeyRefreshCompleteCode:         todo),
  	// evt.AuthenticatedPayloadTimeoutExpiredCode:   todo),
  	// evt.LEReadRemoteUsedFeaturesCompleteSubCode:   todo),
  	// evt.LERemoteConnectionParameterRequestSubCode: todo),
  
  	skt, err := socket.NewSocket(h.id)
  	if err != nil {
  		return err
  	}
  	h.skt = skt
  
  	h.chCmdBufs <- make([]byte, 64)
  
  	go h.sktLoop()
  	h.init()
  
  	// Pre-allocate buffers with additional head room for lower layer headers.
  	// HCI header (1 Byte) + ACL Data Header (4 bytes) + L2CAP PDU (or fragment)
  	h.pool = NewPool(1+4+h.bufSize, h.bufCnt-1)
  
  	h.Send(&h.params.advParams, nil)
  	h.Send(&h.params.scanParams, nil)
  	return nil
  }
docs: // Init ...