/* * QEMU DirectSound audio driver header * * Copyright (c) 2005 Vassili Karpov (malc) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #ifdef DSBTYPE_IN #define NAME "capture buffer" #define TYPE in #define IFACE IDirectSoundCaptureBuffer #define BUFPTR LPDIRECTSOUNDCAPTUREBUFFER #define FIELD dsound_capture_buffer #else #define NAME "playback buffer" #define TYPE out #define IFACE IDirectSoundBuffer #define BUFPTR LPDIRECTSOUNDBUFFER #define FIELD dsound_buffer #endif static int glue (dsound_unlock_, TYPE) ( BUFPTR buf, LPVOID p1, LPVOID p2, DWORD blen1, DWORD blen2 ) { HRESULT hr; hr = glue (IFACE, _Unlock) (buf, p1, blen1, p2, blen2); if (FAILED (hr)) { dsound_logerr (hr, "Could not unlock " NAME "\n"); return -1; } return 0; } static int glue (dsound_lock_, TYPE) ( BUFPTR buf, struct audio_pcm_info *info, DWORD pos, DWORD len, LPVOID *p1p, LPVOID *p2p, DWORD *blen1p, DWORD *blen2p, int entire ) { HRESULT hr; int i; LPVOID p1 = NULL, p2 = NULL; DWORD blen1 = 0, blen2 = 0; DWORD flag; #ifdef DSBTYPE_IN flag = entire ? DSCBLOCK_ENTIREBUFFER : 0; #else flag = entire ? DSBLOCK_ENTIREBUFFER : 0; #endif for (i = 0; i < conf.lock_retries; ++i) { hr = glue (IFACE, _Lock) ( buf, pos, len, &p1, &blen1, &p2, &blen2, flag ); if (FAILED (hr)) { #ifndef DSBTYPE_IN if (hr == DSERR_BUFFERLOST) { if (glue (dsound_restore_, TYPE) (buf)) { dsound_logerr (hr, "Could not lock " NAME "\n"); goto fail; } continue; } #endif dsound_logerr (hr, "Could not lock " NAME "\n"); goto fail; } break; } if (i == conf.lock_retries) { dolog ("%d attempts to lock " NAME " failed\n", i); goto fail; } if ((p1 && (blen1 & info->align)) || (p2 && (blen2 & info->align))) { dolog ("DirectSound returned misaligned buffer %ld %ld\n", blen1, blen2); glue (dsound_unlock_, TYPE) (buf, p1, p2, blen1, blen2); goto fail; } if (!p1 && blen1) { dolog ("warning: !p1 && blen1=%ld\n", blen1); blen1 = 0; } if (!p2 && blen2) { dolog ("warning: !p2 && blen2=%ld\n", blen2); blen2 = 0; } *p1p = p1; *p2p = p2; *blen1p = blen1; *blen2p = blen2; return 0; fail: *p1p = NULL - 1; *p2p = NULL - 1; *blen1p = -1; *blen2p = -1; return -1; } #ifdef DSBTYPE_IN static void dsound_fini_in (HWVoiceIn *hw) #else static void dsound_fini_out (HWVoiceOut *hw) #endif { HRESULT hr; #ifdef DSBTYPE_IN DSoundVoiceIn *ds = (DSoundVoiceIn *) hw; #else DSoundVoiceOut *ds = (DSoundVoiceOut *) hw; #endif if (ds->FIELD) { hr = glue (IFACE, _Stop) (ds->FIELD); if (FAILED (hr)) { dsound_logerr (hr, "Could not stop " NAME "\n"); } hr = glue (IFACE, _Release) (ds->FIELD); if (FAILED (hr)) { dsound_logerr (hr, "Could not release " NAME "\n"); } ds->FIELD = NULL; } } #ifdef DSBTYPE_IN static int dsound_init_in (HWVoiceIn *hw, audsettings_t *as) #else static int dsound_init_out (HWVoiceOut *hw, audsettings_t *as) #endif { int err; HRESULT hr; dsound *s = &glob_dsound; WAVEFORMATEX wfx; audsettings_t obt_as; #ifdef DSBTYPE_IN const char *typ = "ADC"; DSoundVoiceIn *ds = (DSoundVoiceIn *) hw; DSCBUFFERDESC bd; DSCBCAPS bc; #else const char *typ = "DAC"; DSoundVoiceOut *ds = (DSoundVoiceOut *) hw; DSBUFFERDESC bd; DSBCAPS bc; #endif err = waveformat_from_audio_settings (&wfx, as); if (err) { return -1; } memset (&bd, 0, sizeof (bd)); bd.dwSize = sizeof (bd); bd.lpwfxFormat = &wfx; #ifdef DSBTYPE_IN bd.dwBufferBytes = conf.bufsize_in; hr = IDirectSoundCapture_CreateCaptureBuffer ( s->dsound_capture, &bd, &ds->dsound_capture_buffer, NULL ); #else bd.dwFlags = DSBCAPS_STICKYFOCUS | DSBCAPS_GETCURRENTPOSITION2; bd.dwBufferBytes = conf.bufsize_out; hr = IDirectSound_CreateSoundBuffer ( s->dsound, &bd, &ds->dsound_buffer, NULL ); #endif if (FAILED (hr)) { dsound_logerr2 (hr, typ, "Could not create " NAME "\n"); return -1; } hr = glue (IFACE, _GetFormat) (ds->FIELD, &wfx, sizeof (wfx), NULL); if (FAILED (hr)) { dsound_logerr2 (hr, typ, "Could not get " NAME " format\n"); goto fail0; } #ifdef DEBUG_DSOUND dolog (NAME "\n"); print_wave_format (&wfx); #endif memset (&bc, 0, sizeof (bc)); bc.dwSize = sizeof (bc); hr = glue (IFACE, _GetCaps) (ds->FIELD, &bc); if (FAILED (hr)) { dsound_logerr2 (hr, typ, "Could not get " NAME " format\n"); goto fail0; } err = waveformat_to_audio_settings (&wfx, &obt_as); if (err) { goto fail0; } ds->first_time = 1; obt_as.endianness = 0; audio_pcm_init_info (&hw->info, &obt_as); if (bc.dwBufferBytes & hw->info.align) { dolog ( "GetCaps returned misaligned buffer size %ld, alignment %d\n", bc.dwBufferBytes, hw->info.align + 1 ); } hw->samples = bc.dwBufferBytes >> hw->info.shift; #ifdef DEBUG_DSOUND dolog ("caps %ld, desc %ld\n", bc.dwBufferBytes, bd.dwBufferBytes); dolog ("bufsize %d, freq %d, chan %d, fmt %d\n", hw->bufsize, settings.freq, settings.nchannels, settings.fmt); #endif return 0; fail0: glue (dsound_fini_, TYPE) (hw); return -1; } #undef NAME #undef TYPE #undef IFACE #undef BUFPTR #undef FIELD href='#n96'>96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
#
# Copyright (C) 2015 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.

WPAN_MENU:=WPAN 802.15.4 Support

define KernelPackage/ieee802154
  SUBMENU:=$(WPAN_MENU)
  TITLE:=IEEE-802.15.4 support
  KCONFIG:= \
	CONFIG_IEEE802154 \
	CONFIG_IEEE802154_SOCKET=y \
	CONFIG_IEEE802154_NL802154_EXPERIMENTAL=n
  FILES:= \
	$(LINUX_DIR)/net/ieee802154/ieee802154.ko \
	$(LINUX_DIR)/net/ieee802154/ieee802154_socket.ko
  AUTOLOAD:=$(call AutoLoad,90,ieee802154 ieee802154_socket)
endef

define KernelPackage/ieee802154/description
  IEEE Std 802.15.4 defines a low data rate, low power and low
  complexity short range wireless personal area networks. It was
  designed to organise networks of sensors, switches, etc automation
  devices. Maximum allowed data rate is 250 kb/s and typical personal
  operating space around 10m.
endef

$(eval $(call KernelPackage,ieee802154))

define KernelPackage/mac802154
  SUBMENU:=$(WPAN_MENU)
  TITLE:=MAC-802.15.4 support
  DEPENDS:=+kmod-ieee802154 +kmod-crypto-aead +kmod-lib-crc-ccitt
  KCONFIG:= \
	CONFIG_MAC802154 \
	CONFIG_IEEE802154_DRIVERS=y
  FILES:=$(LINUX_DIR)/net/mac802154/mac802154.ko
  AUTOLOAD:=$(call AutoLoad,91,mac802154)
endef

define KernelPackage/mac802154/description
  This option enables the hardware independent IEEE 802.15.4
  networking stack for SoftMAC devices (the ones implementing
  only PHY level of IEEE 802.15.4 standard).

  Note: this implementation is neither certified, nor feature
  complete! Compatibility with other implementations hasn't
  been tested yet!
endef

$(eval $(call KernelPackage,mac802154))

define KernelPackage/fakelb
  SUBMENU:=$(WPAN_MENU)
  TITLE:=Fake LR-WPAN driver
  DEPENDS:=+kmod-mac802154
  KCONFIG:=CONFIG_IEEE802154_FAKELB
  FILES:=$(LINUX_DIR)/drivers/net/ieee802154/fakelb.ko
  AUTOLOAD:=$(call AutoLoad,92,fakelb)
endef

define KernelPackage/fakelb/description
  Say Y here to enable the fake driver that can emulate a net
  of several interconnected radio devices.
endef

$(eval $(call KernelPackage,fakelb))

define KernelPackage/atusb
  SUBMENU:=$(WPAN_MENU)
  TITLE:=ATUSB transceiver driver
  DEPENDS:=@USB_SUPPORT +kmod-usb-core +kmod-mac802154
  KCONFIG:=CONFIG_IEEE802154_ATUSB
  FILES:=$(LINUX_DIR)/drivers/net/ieee802154/atusb.ko
  AUTOLOAD:=$(call AutoProbe,atusb)
endef

$(eval $(call KernelPackage,atusb))

define KernelPackage/at86rf230
  SUBMENU:=$(WPAN_MENU)
  TITLE:=AT86RF230 transceiver driver
  DEPENDS:=+kmod-mac802154 +kmod-regmap-spi
  KCONFIG:=CONFIG_IEEE802154_AT86RF230 \
	CONFIG_IEEE802154_AT86RF230_DEBUGFS=n \
	CONFIG_SPI=y \
	CONFIG_SPI_MASTER=y
  FILES:=$(LINUX_DIR)/drivers/net/ieee802154/at86rf230.ko
  AUTOLOAD:=$(call AutoProbe,at86rf230)
endef

$(eval $(call KernelPackage,at86rf230))

define KernelPackage/mrf24j40
  SUBMENU:=$(WPAN_MENU)
  TITLE:=MRF24J40 transceiver driver
  DEPENDS:=+kmod-mac802154 +kmod-regmap-spi
  KCONFIG:=CONFIG_IEEE802154_MRF24J40 \
	CONFIG_SPI=y \
	CONFIG_SPI_MASTER=y
  FILES:=$(LINUX_DIR)/drivers/net/ieee802154/mrf24j40.ko
  AUTOLOAD:=$(call AutoProbe,mrf24j40)
endef

$(eval $(call KernelPackage,mrf24j40))

define KernelPackage/cc2520
  SUBMENU:=$(WPAN_MENU)
  TITLE:=CC2520 transceiver driver
  DEPENDS:=+kmod-mac802154
  KCONFIG:=CONFIG_IEEE802154_CC2520 \
	CONFIG_SPI=y \
	CONFIG_SPI_MASTER=y
  FILES:=$(LINUX_DIR)/drivers/net/ieee802154/cc2520.ko
  AUTOLOAD:=$(call AutoProbe,cc2520)
endef

$(eval $(call KernelPackage,cc2520))


define KernelPackage/ca8210
  SUBMENU:=$(WPAN_MENU)
  TITLE:=CA8210 transceiver driver
  DEPENDS:=+kmod-mac802154
  KCONFIG:=CONFIG_IEEE802154_CA8210 \
	CONFIG_SPI=y \
	CONFIG_SPI_MASTER=y \
	CONFIG_IEEE802154_CA8210_DEBUGFS=n
  FILES:=$(LINUX_DIR)/drivers/net/ieee802154/ca8210.ko
  AUTOLOAD:=$(call AutoProbe,ca8210)
endef

$(eval $(call KernelPackage,ca8210))


define KernelPackage/ieee802154-6lowpan
  SUBMENU:=$(WPAN_MENU)
  TITLE:= 6LoWPAN support over IEEE-802.15.4
  DEPENDS:=+kmod-6lowpan +kmod-ieee802154
  KCONFIG:=CONFIG_IEEE802154_6LOWPAN
  FILES:= \
	$(LINUX_DIR)/net/ieee802154/6lowpan/ieee802154_6lowpan.ko
  AUTOLOAD:=$(call AutoLoad,91,ieee802154_6lowpan)
endef

define KernelPackage/ieee802154-6lowpan/description
 IPv6 compression over IEEE 802.15.4
endef

$(eval $(call KernelPackage,ieee802154-6lowpan))