From 471edc0a355b4c21a83f3bdca0e151c265e5b7dc Mon Sep 17 00:00:00 2001 From: Sukru Senli Date: Mon, 23 Feb 2015 10:00:13 +0100 Subject: [PATCH] BB: update custom inteno packages from IOP3 --- ami_tool/Makefile | 2 +- ami_tool/src/list.h | 208 ++++ ami_tool/src/ucix.c | 32 + asterisk-1.8.x-mod/Makefile | 4 +- bcmkernel/414040.mk | 227 ++++ bcmkernel/416021.mk | 262 ++++ bcmkernel/416030.mk | 263 ++++ bcmkernel/Makefile | 270 +--- freecwmp/Makefile | 4 +- ice-client/Makefile | 133 +- .../broadcom/etc/init.d/layer2_interface_adsl | 1 - .../etc/init.d/layer2_interface_ethernet | 1 - .../broadcom/etc/init.d/layer2_interface_vdsl | 1 - layer2interface/broadcom/lib/network/vlan.sh | 4 +- ledmngr/src/brcmdaemon.h | 17 - ledmngr/src/log.h | 11 - ledmngr/src/ucix.h | 41 - luci/luci/Makefile | 11 +- peripheral_manager/Makefile | 60 + .../files/etc/init.d/peripheral_manager | 4 +- peripheral_manager/src/Makefile.am | 43 + peripheral_manager/src/configs/DG301R0 | 307 +++++ peripheral_manager/src/configs/hw | 349 ++++++ peripheral_manager/src/configure.ac | 77 ++ peripheral_manager/src/ledctl | 32 + peripheral_manager/src/m4/attributes.m4 | 288 +++++ peripheral_manager/src/src/button.c | 357 ++++++ peripheral_manager/src/src/button.h | 25 + .../src}/src/catv.c | 16 +- .../src}/src/catv.h | 2 +- peripheral_manager/src/src/gpio.c | 39 + peripheral_manager/src/src/gpio.h | 11 + peripheral_manager/src/src/gpio_button.c | 80 ++ peripheral_manager/src/src/gpio_led.c | 169 +++ peripheral_manager/src/src/i2c.c | 57 + {ledmngr => peripheral_manager/src}/src/i2c.h | 1 + peripheral_manager/src/src/led.c | 568 +++++++++ peripheral_manager/src/src/led.h | 47 + peripheral_manager/src/src/log.h | 14 + .../src/src/peripheral_manager.c | 175 +++ peripheral_manager/src/src/server.c | 57 + peripheral_manager/src/src/server.h | 13 + peripheral_manager/src/src/sfp.c | 1105 +++++++++++++++++ {ledmngr => peripheral_manager/src}/src/sfp.h | 0 peripheral_manager/src/src/sim_button.c | 191 +++ peripheral_manager/src/src/sim_led.c | 99 ++ .../src}/src/smbus.c | 0 .../src}/src/smbus.h | 0 peripheral_manager/src/src/touch_sx9512.c | 653 ++++++++++ peripheral_manager/src/src/touch_sx9512.h | 9 + peripheral_manager/src/src/ucix.c | 176 +++ peripheral_manager/src/src/ucix.h | 140 +++ questd/files/etc/init.d/quest | 14 +- questd/src/Makefile | 4 +- questd/src/{arp.c => arping.c} | 23 +- questd/src/ndisc.c | 507 ++++++++ questd/src/questd.c | 86 +- questd/src/questd.h | 20 - 58 files changed, 6731 insertions(+), 579 deletions(-) create mode 100644 ami_tool/src/list.h create mode 100644 bcmkernel/414040.mk create mode 100644 bcmkernel/416021.mk create mode 100644 bcmkernel/416030.mk delete mode 100644 ledmngr/src/brcmdaemon.h delete mode 100644 ledmngr/src/log.h delete mode 100644 ledmngr/src/ucix.h create mode 100644 peripheral_manager/Makefile rename ledmngr/files/etc/init.d/ledmngr => peripheral_manager/files/etc/init.d/peripheral_manager (70%) create mode 100644 peripheral_manager/src/Makefile.am create mode 100644 peripheral_manager/src/configs/DG301R0 create mode 100644 peripheral_manager/src/configs/hw create mode 100644 peripheral_manager/src/configure.ac create mode 100755 peripheral_manager/src/ledctl create mode 100644 peripheral_manager/src/m4/attributes.m4 create mode 100644 peripheral_manager/src/src/button.c create mode 100644 peripheral_manager/src/src/button.h rename {ledmngr => peripheral_manager/src}/src/catv.c (98%) rename {ledmngr => peripheral_manager/src}/src/catv.h (65%) create mode 100644 peripheral_manager/src/src/gpio.c create mode 100644 peripheral_manager/src/src/gpio.h create mode 100644 peripheral_manager/src/src/gpio_button.c create mode 100644 peripheral_manager/src/src/gpio_led.c create mode 100644 peripheral_manager/src/src/i2c.c rename {ledmngr => peripheral_manager/src}/src/i2c.h (98%) create mode 100644 peripheral_manager/src/src/led.c create mode 100644 peripheral_manager/src/src/led.h create mode 100644 peripheral_manager/src/src/log.h create mode 100644 peripheral_manager/src/src/peripheral_manager.c create mode 100644 peripheral_manager/src/src/server.c create mode 100644 peripheral_manager/src/src/server.h create mode 100644 peripheral_manager/src/src/sfp.c rename {ledmngr => peripheral_manager/src}/src/sfp.h (100%) create mode 100644 peripheral_manager/src/src/sim_button.c create mode 100644 peripheral_manager/src/src/sim_led.c rename {ledmngr => peripheral_manager/src}/src/smbus.c (100%) rename {ledmngr => peripheral_manager/src}/src/smbus.h (100%) create mode 100644 peripheral_manager/src/src/touch_sx9512.c create mode 100644 peripheral_manager/src/src/touch_sx9512.h create mode 100644 peripheral_manager/src/src/ucix.c create mode 100644 peripheral_manager/src/src/ucix.h rename questd/src/{arp.c => arping.c} (84%) create mode 100644 questd/src/ndisc.c diff --git a/ami_tool/Makefile b/ami_tool/Makefile index 1bd7c33d3..ff74b3e26 100644 --- a/ami_tool/Makefile +++ b/ami_tool/Makefile @@ -24,7 +24,7 @@ MAKE_FLAGS += TARGET="$(target)" define Package/ami CATEGORY:=Utilities - DEPENDS:= +libubox +ubus + DEPENDS:= +luci +libubox +ubus TITLE:=Asterisk management interface listener endef diff --git a/ami_tool/src/list.h b/ami_tool/src/list.h new file mode 100644 index 000000000..ab52acff2 --- /dev/null +++ b/ami_tool/src/list.h @@ -0,0 +1,208 @@ +/*- + * Copyright (c) 2011 Felix Fietkau + * Copyright (c) 2010 Isilon Systems, Inc. + * Copyright (c) 2010 iX Systems, Inc. + * Copyright (c) 2010 Panasas, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice unmodified, this list of conditions, and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _LINUX_LIST_H_ +#define _LINUX_LIST_H_ + +#include +#include + +#define prefetch(x) + +#ifndef container_of +#define container_of(ptr, type, member) \ + ({ \ + const typeof(((type *) NULL)->member) *__mptr = (ptr); \ + (type *) ((char *) __mptr - offsetof(type, member)); \ + }) +#endif + +struct list_head { + struct list_head *next; + struct list_head *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } +#undef LIST_HEAD +#define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name) + +static inline void +INIT_LIST_HEAD(struct list_head *list) +{ + list->next = list->prev = list; +} + +static inline bool +list_empty(const struct list_head *head) +{ + return (head->next == head); +} + +static inline bool +list_is_first(const struct list_head *list, + const struct list_head *head) +{ + return list->prev == head; +} + +static inline bool +list_is_last(const struct list_head *list, + const struct list_head *head) +{ + return list->next == head; +} + +static inline void +_list_del(struct list_head *entry) +{ + entry->next->prev = entry->prev; + entry->prev->next = entry->next; +} + +static inline void +list_del(struct list_head *entry) +{ + _list_del(entry); + entry->next = entry->prev = NULL; +} + +static inline void +_list_add(struct list_head *_new, struct list_head *prev, + struct list_head *next) +{ + + next->prev = _new; + _new->next = next; + _new->prev = prev; + prev->next = _new; +} + +static inline void +list_del_init(struct list_head *entry) +{ + _list_del(entry); + INIT_LIST_HEAD(entry); +} + +#define list_entry(ptr, type, field) container_of(ptr, type, field) +#define list_first_entry(ptr, type, field) list_entry((ptr)->next, type, field) +#define list_last_entry(ptr, type, field) list_entry((ptr)->prev, type, field) + +#define list_for_each(p, head) \ + for (p = (head)->next; p != (head); p = p->next) + +#define list_for_each_safe(p, n, head) \ + for (p = (head)->next, n = p->next; p != (head); p = n, n = p->next) + +#define list_for_each_entry(p, h, field) \ + for (p = list_first_entry(h, typeof(*p), field); &p->field != (h); \ + p = list_entry(p->field.next, typeof(*p), field)) + +#define list_for_each_entry_safe(p, n, h, field) \ + for (p = list_first_entry(h, typeof(*p), field), \ + n = list_entry(p->field.next, typeof(*p), field); &p->field != (h);\ + p = n, n = list_entry(n->field.next, typeof(*n), field)) + +#define list_for_each_entry_reverse(p, h, field) \ + for (p = list_last_entry(h, typeof(*p), field); &p->field != (h); \ + p = list_entry(p->field.prev, typeof(*p), field)) + +#define list_for_each_prev(p, h) for (p = (h)->prev; p != (h); p = p->prev) +#define list_for_each_prev_safe(p, n, h) for (p = (h)->prev, n = p->prev; p != (h); p = n, n = p->prev) + +static inline void +list_add(struct list_head *_new, struct list_head *head) +{ + _list_add(_new, head, head->next); +} + +static inline void +list_add_tail(struct list_head *_new, struct list_head *head) +{ + _list_add(_new, head->prev, head); +} + +static inline void +list_move(struct list_head *list, struct list_head *head) +{ + _list_del(list); + list_add(list, head); +} + +static inline void +list_move_tail(struct list_head *entry, struct list_head *head) +{ + _list_del(entry); + list_add_tail(entry, head); +} + +static inline void +_list_splice(const struct list_head *list, struct list_head *prev, + struct list_head *next) +{ + struct list_head *first; + struct list_head *last; + + if (list_empty(list)) + return; + + first = list->next; + last = list->prev; + first->prev = prev; + prev->next = first; + last->next = next; + next->prev = last; +} + +static inline void +list_splice(const struct list_head *list, struct list_head *head) +{ + _list_splice(list, head, head->next); +} + +static inline void +list_splice_tail(struct list_head *list, struct list_head *head) +{ + _list_splice(list, head->prev, head); +} + +static inline void +list_splice_init(struct list_head *list, struct list_head *head) +{ + _list_splice(list, head, head->next); + INIT_LIST_HEAD(list); +} + +static inline void +list_splice_tail_init(struct list_head *list, struct list_head *head) +{ + _list_splice(list, head->prev, head); + INIT_LIST_HEAD(list); +} + +#endif /* _LINUX_LIST_H_ */ diff --git a/ami_tool/src/ucix.c b/ami_tool/src/ucix.c index d702429fb..2a0d78a3f 100644 --- a/ami_tool/src/ucix.c +++ b/ami_tool/src/ucix.c @@ -77,6 +77,38 @@ void ucix_save_state(struct uci_context *ctx) uci_save(ctx, NULL); } +int ucix_get_option_list(struct uci_context *ctx, const char *p, + const char *s, const char *o, struct list_head *l) +{ + struct uci_element *e = NULL; + if(ucix_get_ptr(ctx, p, s, o, NULL)) + return 1; + if (!(ptr.flags & UCI_LOOKUP_COMPLETE)) + return 1; + e = ptr.last; + switch (e->type) + { + case UCI_TYPE_OPTION: + switch(ptr.o->type) { + case UCI_TYPE_LIST: + uci_foreach_element(&ptr.o->v.list, e) + { + struct ucilist *ul = malloc(sizeof(struct ucilist)); + ul->val = strdup((e->name)?(e->name):("")); + list_add_tail(&ul->list, l); + } + break; + default: + break; + } + break; + default: + return 1; + } + + return 0; +} + const char* ucix_get_option(struct uci_context *ctx, const char *p, const char *s, const char *o) { struct uci_element *e = NULL; diff --git a/asterisk-1.8.x-mod/Makefile b/asterisk-1.8.x-mod/Makefile index 97ad857c5..ee6c54744 100644 --- a/asterisk-1.8.x-mod/Makefile +++ b/asterisk-1.8.x-mod/Makefile @@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=asterisk18-mod PKG_VERSION:=1.8.10.1 -PKG_SOURCE_VERSION:=e6a06b24a4e3d5ff786a4ad55a7c90de1defb49e +PKG_SOURCE_VERSION:=5d132d039a72ca59c250873493f6657537fcf79f PKG_SOURCE_PROTO:=git ifeq ($(CONFIG_PACKAGE_bcmkernel),y) PKG_SOURCE_URL:=git@ihgsp.inteno.se:asterisk-aa @@ -45,7 +45,7 @@ define Package/asterisk18-mod $(call Package/asterisk18-mod/Default) TITLE:=Complete open source PBX, v1.8x MENU:=1 - DEPENDS:= +natalie-dect-h +PACKAGE_bcmkernel:bcmkernel +PACKAGE_bcmopen:bcmopen +libopenssl +libncurses +libpopt +libpthread +uci +ubus +zlib @!TARGET_avr32 + DEPENDS:= +natalie-dect-h +bcmkernel +libopenssl +libncurses +libpopt +libpthread +zlib @!TARGET_avr32 endef define Package/asterisk18-mod/description diff --git a/bcmkernel/414040.mk b/bcmkernel/414040.mk new file mode 100644 index 000000000..c8f753e68 --- /dev/null +++ b/bcmkernel/414040.mk @@ -0,0 +1,227 @@ +# +# Copyright (C) 2006-2008 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +# update this based on the Broadcom SDK version, 4.14L.04 -> 414040 +BRCM_SDK_VERSION:=414040 + +PKG_NAME:=bcmkernel-3.4 +PKG_VERSION:=4.14 +PKG_RELEASE:=$(BRCM_SDK_VERSION) + +PKG_SOURCE_URL:=git@iopsys.inteno.se:bcmkernel-4.14L.04 +PKG_SOURCE_PROTO:=git + +PKG_SOURCE_VERSION:=8216815ced065e527681a079ad0e17fbb007baec +PKG_SOURCE:=$(PKG_NAME)-$(BRCM_SDK_VERSION)-$(PKG_SOURCE_VERSION).tar.gz + +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) + + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/image.mk +include $(INCLUDE_DIR)/kernel.mk + +export CONFIG_BCM_CHIP_ID +export CONFIG_BCM_KERNEL_PROFILE +export CONFIG_SECURE_BOOT_CFE + + +BCM_BS_PROFILE = $(shell echo $(CONFIG_BCM_KERNEL_PROFILE) | sed s/\"//g) + +BCM_KERNEL_VERSION:=3.4.11-rt19 +BCM_SDK_VERSION:=bcm963xx +RSTRIP:=true + + +define Package/bcmkernel/removevoice + touch $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/endpointdd.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/endpointdd.ko +endef + +ifeq ($(CONFIG_BCM_ENDPOINT_MODULE),y) +define Package/bcmkernel/removevoice + echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/endpointdd.ko +endef +endif + + +define Package/bcmkernel/removei2c + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/i2c* +endef + +ifeq ($(CONFIG_BCM_I2C),y) +define Package/bcmkernel/removei2c + echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/i2c* +endef +endif + +define Package/bcmkernel/install + $(INSTALL_DIR) $(1)/lib/bcm + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_DIR) $(1)/usr/lib + $(INSTALL_DIR) $(1)/etc/adsl + $(INSTALL_DIR) $(1)/etc/wlan + $(INSTALL_DIR) $(1)/etc/cms_entity_info.d + + # Install header files + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/broadcom/include/bcm963xx + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/endpt/inc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/codec + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/casCtl/inc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/LinuxUser + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/shared/opensource/include/bcm963xx + + + $(CP) -r $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/shared/opensource/include/bcm963xx/* $(STAGING_DIR)/usr/include/bcm963xx/shared/opensource/include/bcm963xx + + $(CP) -r $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/opensource/include/bcm963xx/* $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx/ + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgTypes.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgTypes.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfg.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfg.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfgCustom.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfgCustom.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgLogCfgCustom.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgLogCfgCustom.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgLog.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgLog.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/countryArchive.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/countryArchive.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgCountry.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgCountry.h + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/casCtl/inc/casCtl.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/casCtl/inc/casCtl.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/codec/codec.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/codec/codec.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/endpt/inc/endpt.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/endpt/inc/endpt.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/endpt/inc/vrgEndpt.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/endpt/inc/vrgEndpt.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/LinuxUser/bosTypesLinuxUser.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/LinuxUser/bosTypesLinuxUser.h + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosMutex.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosMutex.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSpinlock.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSpinlock.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosMsgQ.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosMsgQ.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosCritSect.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosCritSect.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTypes.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTypes.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTime.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTime.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSem.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSem.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosCfgCustom.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosCfgCustom.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosIpAddr.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosIpAddr.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTimer.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTimer.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosError.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosError.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosLog.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosLog.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSleep.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSleep.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosMisc.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosMisc.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosCfg.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosCfg.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosEvent.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosEvent.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTask.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTask.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosUtil.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosUtil.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosInit.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosInit.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSocket.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSocket.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosFile.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosFile.h + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvSlic.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvSlic.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvApm.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvApm.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvCas.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvCas.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvTypes.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvTypes.h + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/broadcom/include/bcm963xx/endptvoicestats.h $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/broadcom/include/bcm963xx/endptvoicestats.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/broadcom/include/bcm963xx/endpointdrv.h $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/broadcom/include/bcm963xx/endpointdrv.h + echo "#define BCM_SDK_VERSION $(BRCM_SDK_VERSION)" > $(STAGING_DIR)/usr/include/bcm_sdk_version.h + + # create symlink to kernel build directory + rm -f $(BUILD_DIR)/bcmkernel + ln -sfn $(PKG_SOURCE_SUBDIR) $(BUILD_DIR)/bcmkernel + + # Install binaries + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/bin/* $(1)/usr/sbin/ + + rm -f $(1)/usr/sbin/dhcp6c + rm -f $(1)/usr/sbin/dhcp6s + rm -f $(1)/usr/sbin/dhcpc + rm -f $(1)/usr/sbin/dhcpd + rm -f $(1)/usr/sbin/dnsproxy + rm -f $(1)/usr/sbin/httpd + rm -f $(1)/usr/sbin/openssl + rm -f $(1)/usr/sbin/racoon + rm -f $(1)/usr/sbin/ripd + rm -f $(1)/usr/sbin/send_cms_msg + rm -f $(1)/usr/sbin/sshd + rm -f $(1)/usr/sbin/ssk + rm -f $(1)/usr/sbin/telnetd + rm -f $(1)/usr/sbin/tr64c + rm -f $(1)/usr/sbin/tr69c + rm -f $(1)/usr/sbin/ubi* + rm -f $(1)/usr/sbin/udhcpd + rm -f $(1)/usr/sbin/upnp + rm -f $(1)/usr/sbin/upnpd + rm -f $(1)/usr/sbin/vodsl + rm -f $(1)/usr/sbin/wlmngr + rm -f $(1)/usr/sbin/zebra + + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/cms_entity_info.d/eid_bcm_kthreads.txt $(1)/etc/cms_entity_info.d/ + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/cms_entity_info.d/symbol_table.txt $(1)/etc/cms_entity_info.d/ + + # Install libraries + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/* $(1)/usr/lib/ + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/gpl/* $(1)/usr/lib/ + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/private/* $(1)/usr/lib/ + + mv $(1)/usr/lib/ld-uClibc.so.0 $(1)/lib/bcm/ + mv $(1)/usr/lib/libc.so.0 $(1)/lib/bcm/ + mv $(1)/usr/lib/libdl.so.0 $(1)/lib/bcm/ + mv $(1)/usr/lib/libgcc_s.so.1 $(1)/lib/bcm/ + mv $(1)/usr/lib/libpthread.so.0 $(1)/lib/bcm/ + + rm -f $(1)/usr/lib/libcrypt.so.0 + rm -f $(1)/usr/lib/libm.so.0 + rm -f $(1)/usr/lib/libutil.so.0 + rm -f $(1)/usr/lib/libcms_boardctl.so + rm -f $(1)/usr/lib/libcms_msg.so + rm -f $(1)/usr/lib/libcms_util.so + rm -f $(1)/usr/lib/libcrypto.so.0.9.7 + rm -f $(1)/usr/lib/libssl.so.0.9.7 + rm -f $(1)/usr/lib/libnvram.so + + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/public/* $(1)/usr/lib/ + + rm -rf $(1)/usr/lib/modules + rm -rf $(1)/usr/lib/private + rm -rf $(1)/usr/lib/public + rm -rf $(1)/usr/lib/gpl + + # Install kernel modules + rm -rf $(1)/lib/modules/$(BCM_KERNEL_VERSION)/* + mkdir -p $(1)/lib/ + mkdir -p $(1)/lib/modules/ + mkdir -p $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ + mkdir -p $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra + + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/extra/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/ + find $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/ -name *.ko -exec cp {} $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ \; + + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/wlan/*_map.bin $(1)/etc/wlan + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/telephonyProfiles.d $(1)/etc/ + +# rm -rf $(1)/lib/modules/$(BCM_KERNEL_VERSION)/bcm_usb.ko + + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/kernel/linux-3.4rt/vmlinux $(KDIR)/vmlinux.bcm.elf + $(KERNEL_CROSS)strip --remove-section=.note --remove-section=.comment $(KDIR)/vmlinux.bcm.elf + $(KERNEL_CROSS)objcopy $(OBJCOPY_STRIP) -O binary $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/kernel/linux-3.4rt/vmlinux $(KDIR)/vmlinux.bcm + + # bootloader nor +# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/cfe/build/broadcom/bcm63xx_rom/bcm9$(CONFIG_BCM_CHIP_ID)_cfe.w $(KDIR)/bcm_bootloader_cfe.w + + # ram part of the bootloader for nand boot + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/cfe/build/broadcom/bcm63xx_ram/cfe$(CONFIG_BCM_CHIP_ID).bin $(KDIR)/cferam.001 + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/cfe/build/broadcom/bcm63xx_rom/cfe$(CONFIG_BCM_CHIP_ID)_nand.v $(KDIR)/cfe$(CONFIG_BCM_CHIP_ID)_nand.v + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/cfe/ $(KDIR)/cfe +# dd if=$(KDIR)/vmlinux.bcm.elf of=$(KDIR)/vmlinux.bcm bs=4096 count=1 +# $(KERNEL_CROSS)objcopy $(OBJCOPY_STRIP) -S $(LINUX_DIR)/vmlinux $(KERNEL_BUILD_DIR)/vmlinux.elf + + $(call Package/bcmkernel/removevoice,$(1)) + $(call Package/bcmkernel/removei2c,$(1)) +endef + diff --git a/bcmkernel/416021.mk b/bcmkernel/416021.mk new file mode 100644 index 000000000..1ac826b65 --- /dev/null +++ b/bcmkernel/416021.mk @@ -0,0 +1,262 @@ +# +# Copyright (C) 2006-2008 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +# update this based on the Broadcom SDK version, 4.16L.02 -> 416020 +# 4.16L.02A -> 416021 +BRCM_SDK_VERSION:=416021 + +PKG_NAME:=bcmkernel-3.4 +PKG_VERSION:=4.16 +PKG_RELEASE:=$(BRCM_SDK_VERSION) + +PKG_SOURCE_URL:=git@iopsys.inteno.se:bcmkernel-4.16L.02A +PKG_SOURCE_PROTO:=git + +PKG_SOURCE_VERSION:=00e673bd751d19059cb3ed5fd2dbf3831a7e0401 +PKG_SOURCE:=$(PKG_NAME)-$(BRCM_SDK_VERSION)-$(PKG_SOURCE_VERSION).tar.gz + +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) + + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/image.mk +include $(INCLUDE_DIR)/kernel.mk + +export CONFIG_BCM_CHIP_ID +export CONFIG_BCM_KERNEL_PROFILE +export CONFIG_SECURE_BOOT_CFE + + +BCM_BS_PROFILE = $(shell echo $(CONFIG_BCM_KERNEL_PROFILE) | sed s/\"//g) + +BCM_KERNEL_VERSION:=3.4.11-rt19 +BCM_SDK_VERSION:=bcm963xx +RSTRIP:=true + + +define Package/bcmkernel/removevoice + touch $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/endpointdd.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/endpointdd.ko +endef + +ifeq ($(CONFIG_BCM_ENDPOINT_MODULE),y) +define Package/bcmkernel/removevoice + echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/endpointdd.ko +endef +endif + +define Package/bcmkernel/removesound + touch $(1)/lib/modules/$(BCM_KERNEL_VERSION)/snd + touch $(1)/lib/modules/$(BCM_KERNEL_VERSION)/soundcore.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/snd* + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/soundcore.ko +endef + +ifeq ($(BCM_USBSOUND_MODULES),y) +define Package/bcmkernel/removesound + echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/snd* +endef +endif + + +define Package/bcmkernel/removei2c + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/i2c* +endef + +ifeq ($(CONFIG_BCM_I2C),y) +define Package/bcmkernel/removei2c + echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/i2c* +endef +endif + +define Package/bcmkernel/removebluetooth + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/bluetooth.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/bnep.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/btusb.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/rfcomm.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/hci_uart.ko +endef + +ifeq ($(CONFIG_BCM_BLUETOOTH),y) +define Package/bcmkernel/removebluetooth + echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/bluetooth.ko etc... +endef +endif + +define Package/bcmkernel/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_DIR) $(1)/usr/lib + $(INSTALL_DIR) $(1)/etc/adsl + $(INSTALL_DIR) $(1)/etc/wlan + $(INSTALL_DIR) $(1)/etc/cms_entity_info.d + + # Install header files + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/broadcom/include/bcm963xx + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/endpt/inc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/codec + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/casCtl/inc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/LinuxUser + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/shared/opensource/include/bcm963xx + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/userspace/private/apps/vodsl/voip/inc + + + $(CP) -r $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/shared/opensource/include/bcm963xx/* $(STAGING_DIR)/usr/include/bcm963xx/shared/opensource/include/bcm963xx + + $(CP) -r $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/opensource/include/bcm963xx/* $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx/ + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgTypes.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgTypes.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfg.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfg.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfgCustom.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfgCustom.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgLogCfgCustom.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgLogCfgCustom.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgLog.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgLog.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/countryArchive.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/countryArchive.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgCountry.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgCountry.h + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/casCtl/inc/casCtl.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/casCtl/inc/casCtl.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/codec/codec.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/codec/codec.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/endpt/inc/endpt.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/endpt/inc/endpt.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/endpt/inc/vrgEndpt.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/endpt/inc/vrgEndpt.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/LinuxUser/bosTypesLinuxUser.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/LinuxUser/bosTypesLinuxUser.h + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosMutex.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosMutex.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSpinlock.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSpinlock.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosMsgQ.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosMsgQ.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosCritSect.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosCritSect.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTypes.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTypes.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTime.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTime.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSem.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSem.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosCfgCustom.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosCfgCustom.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosIpAddr.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosIpAddr.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTimer.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTimer.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosError.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosError.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosLog.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosLog.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSleep.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSleep.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosMisc.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosMisc.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosCfg.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosCfg.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosEvent.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosEvent.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTask.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTask.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosUtil.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosUtil.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosInit.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosInit.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSocket.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSocket.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosFile.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosFile.h + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvSlic.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvSlic.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvApm.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvApm.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvCas.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvCas.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvTypes.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvTypes.h + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/broadcom/include/bcm963xx/endptvoicestats.h $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/broadcom/include/bcm963xx/endptvoicestats.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/broadcom/include/bcm963xx/endpointdrv.h $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/broadcom/include/bcm963xx/endpointdrv.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/userspace/private/apps/vodsl/voip/inc/tpProfiles.h $(STAGING_DIR)/usr/include/bcm963xx/userspace/private/apps/vodsl/voip/inc + echo "#define BCM_SDK_VERSION $(BRCM_SDK_VERSION)" > $(STAGING_DIR)/usr/include/bcm_sdk_version.h + + # create symlink to kernel build directory + rm -f $(BUILD_DIR)/bcmkernel + ln -sfn $(PKG_SOURCE_SUBDIR) $(BUILD_DIR)/bcmkernel + + # Install binaries + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/bin/* $(1)/usr/sbin/ + + rm -f $(1)/usr/sbin/dhcp6c + rm -f $(1)/usr/sbin/dhcp6s + rm -f $(1)/usr/sbin/dhcpc + rm -f $(1)/usr/sbin/dhcpd + rm -f $(1)/usr/sbin/dnsproxy + rm -f $(1)/usr/sbin/httpd + rm -f $(1)/usr/sbin/openssl + rm -f $(1)/usr/sbin/racoon + rm -f $(1)/usr/sbin/ripd + rm -f $(1)/usr/sbin/send_cms_msg + rm -f $(1)/usr/sbin/sshd + rm -f $(1)/usr/sbin/ssk + rm -f $(1)/usr/sbin/telnetd + rm -f $(1)/usr/sbin/tr64c + rm -f $(1)/usr/sbin/tr69c + rm -f $(1)/usr/sbin/ubi* + rm -f $(1)/usr/sbin/udhcpd + rm -f $(1)/usr/sbin/upnp + rm -f $(1)/usr/sbin/upnpd + rm -f $(1)/usr/sbin/vodsl + rm -f $(1)/usr/sbin/wlmngr + rm -f $(1)/usr/sbin/zebra + + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/cms_entity_info.d/eid_bcm_kthreads.txt $(1)/etc/cms_entity_info.d/ + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/cms_entity_info.d/symbol_table.txt $(1)/etc/cms_entity_info.d/ + + # Install libraries + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/* $(1)/usr/lib/ + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/gpl/* $(1)/usr/lib/ + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/private/* $(1)/usr/lib/ + + rm -f $(1)/usr/lib/ld-uClibc.so.0 + rm -f $(1)/usr/lib/libc.so.0 + rm -f $(1)/usr/lib/libdl.so.0 + rm -f $(1)/usr/lib/libgcc_s.so.1 + rm -f $(1)/usr/lib/libpthread.so.0 + rm -f $(1)/usr/lib/libm.so.0 + rm -f $(1)/usr/lib/libutil.so.0 + rm -f $(1)/usr/lib/libcms_boardctl.so + rm -f $(1)/usr/lib/libcms_msg.so + rm -f $(1)/usr/lib/libcms_util.so + rm -f $(1)/usr/lib/libnvram.so + rm -f $(1)/usr/lib/libcrypt.so.0 + + rm -f $(1)/usr/lib/libcrypto.so + ln -s /usr/lib/libcrypto.so.1.0.0 $(1)/usr/lib/libcrypto.so + rm -f $(1)/usr/lib/libcrypto.so.0.9.7 + ln -s /usr/lib/libcrypto.so.1.0.0 $(1)/usr/lib/libcrypto.so.0.9.7 + rm -f $(1)/usr/lib/libssl.so + ln -s /usr/lib/libssl.so.1.0.0 $(1)/usr/lib/libssl.so + rm -f $(1)/usr/lib/libssl.so.0.9.7 + ln -s /usr/lib/libssl.so.1.0.0 $(1)/usr/lib/libssl.so.0.9.7 + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/public/* $(1)/usr/lib/ + + rm -rf $(1)/usr/lib/modules + rm -rf $(1)/usr/lib/private + rm -rf $(1)/usr/lib/public + rm -rf $(1)/usr/lib/gpl + + # Install kernel modules + rm -rf $(1)/lib/modules/$(BCM_KERNEL_VERSION)/* + mkdir -p $(1)/lib/ + mkdir -p $(1)/lib/modules/ + mkdir -p $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ + mkdir -p $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra + + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/extra/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/ + find $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/ -name *.ko -exec cp {} $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ \; + + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/wlan/* $(1)/etc/wlan + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/telephonyProfiles.d $(1)/etc/ + +# rm -rf $(1)/lib/modules/$(BCM_KERNEL_VERSION)/bcm_usb.ko + + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/kernel/linux-3.4rt/vmlinux $(KDIR)/vmlinux.bcm.elf + $(KERNEL_CROSS)strip --remove-section=.note --remove-section=.comment $(KDIR)/vmlinux.bcm.elf + $(KERNEL_CROSS)objcopy $(OBJCOPY_STRIP) -O binary $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/kernel/linux-3.4rt/vmlinux $(KDIR)/vmlinux.bcm + + # bootloader nor +# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/cfe/build/broadcom/bcm63xx_rom/bcm9$(CONFIG_BCM_CHIP_ID)_cfe.w $(KDIR)/bcm_bootloader_cfe.w + + # ram part of the bootloader for nand boot + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/cfe/build/broadcom/bcm63xx_ram/cfe$(CONFIG_BCM_CHIP_ID).bin $(KDIR)/cferam.001 + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/cfe/build/broadcom/bcm63xx_rom/cfe$(CONFIG_BCM_CHIP_ID)_nand.v $(KDIR)/cfe$(CONFIG_BCM_CHIP_ID)_nand.v + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/cfe/ $(KDIR)/cfe +# dd if=$(KDIR)/vmlinux.bcm.elf of=$(KDIR)/vmlinux.bcm bs=4096 count=1 +# $(KERNEL_CROSS)objcopy $(OBJCOPY_STRIP) -S $(LINUX_DIR)/vmlinux $(KERNEL_BUILD_DIR)/vmlinux.elf + + $(call Package/bcmkernel/removevoice,$(1)) + $(call Package/bcmkernel/removesound,$(1)) +# $(call Package/bcmkernel/removei2c,$(1)) +endef + diff --git a/bcmkernel/416030.mk b/bcmkernel/416030.mk new file mode 100644 index 000000000..903be50c7 --- /dev/null +++ b/bcmkernel/416030.mk @@ -0,0 +1,263 @@ +# +# Copyright (C) 2006-2008 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +# update this based on the Broadcom SDK version, 4.16L.03 -> 416030 +BRCM_SDK_VERSION:=416030 + +PKG_NAME:=bcmkernel-3.4 +PKG_VERSION:=4.16 +PKG_RELEASE:=$(BRCM_SDK_VERSION) + +PKG_SOURCE_URL:=git@iopsys.inteno.se:bcmkernel-4.16L.03 +PKG_SOURCE_PROTO:=git + +PKG_SOURCE_VERSION:=dac270de1d80552e7bc39a8dc8980532948eba81 +PKG_SOURCE:=$(PKG_NAME)-$(BRCM_SDK_VERSION)-$(PKG_SOURCE_VERSION).tar.gz + +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) + + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/image.mk +include $(INCLUDE_DIR)/kernel.mk + +export CONFIG_BCM_CHIP_ID +export CONFIG_BCM_KERNEL_PROFILE +export CONFIG_SECURE_BOOT_CFE + + +BCM_BS_PROFILE = $(shell echo $(CONFIG_BCM_KERNEL_PROFILE) | sed s/\"//g) + +BCM_KERNEL_VERSION:=3.4.11-rt19 +BCM_SDK_VERSION:=bcm963xx +RSTRIP:=true + + +define Package/bcmkernel/removevoice + touch $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/endpointdd.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/endpointdd.ko +endef + +ifeq ($(CONFIG_BCM_ENDPOINT_MODULE),y) +define Package/bcmkernel/removevoice + echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/endpointdd.ko +endef +endif + +define Package/bcmkernel/removesound + touch $(1)/lib/modules/$(BCM_KERNEL_VERSION)/snd + touch $(1)/lib/modules/$(BCM_KERNEL_VERSION)/soundcore.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/snd* + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/soundcore.ko +endef + +ifeq ($(BCM_USBSOUND_MODULES),y) +define Package/bcmkernel/removesound + echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/snd* +endef +endif + + +define Package/bcmkernel/removei2c + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/i2c* +endef + +ifeq ($(CONFIG_BCM_I2C),y) +define Package/bcmkernel/removei2c + echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/i2c* +endef +endif + +define Package/bcmkernel/removebluetooth + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/bluetooth.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/bnep.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/btusb.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/rfcomm.ko + rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/hci_uart.ko +endef + +ifeq ($(CONFIG_BCM_BLUETOOTH),y) +define Package/bcmkernel/removebluetooth + echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/bluetooth.ko etc... +endef +endif + +define Package/bcmkernel/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_DIR) $(1)/usr/lib + $(INSTALL_DIR) $(1)/etc/adsl + $(INSTALL_DIR) $(1)/etc/wlan + $(INSTALL_DIR) $(1)/etc/cms_entity_info.d + + # Install header files + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/broadcom/include/bcm963xx + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/endpt/inc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/codec + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/casCtl/inc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/LinuxUser + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/shared/opensource/include/bcm963xx + $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/userspace/private/apps/vodsl/voip/inc + + + $(CP) -r $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/shared/opensource/include/bcm963xx/* $(STAGING_DIR)/usr/include/bcm963xx/shared/opensource/include/bcm963xx + + $(CP) -r $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/opensource/include/bcm963xx/* $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx/ + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgTypes.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgTypes.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfg.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfg.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfgCustom.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfgCustom.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgLogCfgCustom.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgLogCfgCustom.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgLog.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgLog.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/countryArchive.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/countryArchive.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgCountry.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgCountry.h + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/casCtl/inc/casCtl.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/casCtl/inc/casCtl.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/codec/codec.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/codec/codec.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/endpt/inc/endpt.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/endpt/inc/endpt.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/endpt/inc/vrgEndpt.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/endpt/inc/vrgEndpt.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/LinuxUser/bosTypesLinuxUser.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/LinuxUser/bosTypesLinuxUser.h + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosMutex.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosMutex.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSpinlock.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSpinlock.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosMsgQ.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosMsgQ.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosCritSect.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosCritSect.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTypes.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTypes.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTime.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTime.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSem.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSem.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosCfgCustom.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosCfgCustom.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosIpAddr.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosIpAddr.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTimer.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTimer.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosError.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosError.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosLog.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosLog.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSleep.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSleep.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosMisc.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosMisc.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosCfg.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosCfg.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosEvent.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosEvent.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTask.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTask.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosUtil.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosUtil.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosInit.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosInit.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSocket.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSocket.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosFile.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosFile.h + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvSlic.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvSlic.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvApm.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvApm.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvCas.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvCas.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvTypes.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvTypes.h + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/broadcom/include/bcm963xx/endptvoicestats.h $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/broadcom/include/bcm963xx/endptvoicestats.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/broadcom/include/bcm963xx/endpointdrv.h $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/broadcom/include/bcm963xx/endpointdrv.h + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/userspace/private/apps/vodsl/voip/inc/tpProfiles.h $(STAGING_DIR)/usr/include/bcm963xx/userspace/private/apps/vodsl/voip/inc + echo "#define BCM_SDK_VERSION $(BRCM_SDK_VERSION)" > $(STAGING_DIR)/usr/include/bcm_sdk_version.h + + # create symlink to kernel build directory + rm -f $(BUILD_DIR)/bcmkernel + ln -sfn $(PKG_SOURCE_SUBDIR) $(BUILD_DIR)/bcmkernel + + # Install binaries + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/bin/* $(1)/usr/sbin/ + + rm -f $(1)/usr/sbin/dhcp6c + rm -f $(1)/usr/sbin/dhcp6s + rm -f $(1)/usr/sbin/dhcpc + rm -f $(1)/usr/sbin/dhcpd + rm -f $(1)/usr/sbin/dnsproxy + rm -f $(1)/usr/sbin/httpd + rm -f $(1)/usr/sbin/openssl + rm -f $(1)/usr/sbin/racoon + rm -f $(1)/usr/sbin/ripd + rm -f $(1)/usr/sbin/send_cms_msg + rm -f $(1)/usr/sbin/sshd + rm -f $(1)/usr/sbin/ssk + rm -f $(1)/usr/sbin/telnetd + rm -f $(1)/usr/sbin/tr64c + rm -f $(1)/usr/sbin/tr69c + rm -f $(1)/usr/sbin/ubi* + rm -f $(1)/usr/sbin/udhcpd + rm -f $(1)/usr/sbin/upnp + rm -f $(1)/usr/sbin/upnpd + rm -f $(1)/usr/sbin/vodsl + rm -f $(1)/usr/sbin/wlmngr + rm -f $(1)/usr/sbin/zebra + + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/cms_entity_info.d/eid_bcm_kthreads.txt $(1)/etc/cms_entity_info.d/ + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/cms_entity_info.d/symbol_table.txt $(1)/etc/cms_entity_info.d/ + + # Install libraries + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/* $(1)/usr/lib/ + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/gpl/* $(1)/usr/lib/ + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/private/* $(1)/usr/lib/ + + rm -f $(1)/usr/lib/ld-uClibc.so.0 + rm -f $(1)/usr/lib/libc.so.0 + rm -f $(1)/usr/lib/libdl.so.0 + rm -f $(1)/usr/lib/libgcc_s.so.1 + rm -f $(1)/usr/lib/libpthread.so.0 + rm -f $(1)/usr/lib/libm.so.0 + rm -f $(1)/usr/lib/libutil.so.0 + rm -f $(1)/usr/lib/libcms_boardctl.so + rm -f $(1)/usr/lib/libcms_msg.so + rm -f $(1)/usr/lib/libcms_util.so + rm -f $(1)/usr/lib/libnvram.so + rm -f $(1)/usr/lib/libcrypt.so.0 + rm -f $(1)/usr/lib/libbcm_crc.so + rm -f $(1)/usr/lib/libbcm_flashutil.so + + rm -f $(1)/usr/lib/libcrypto.so + ln -s /usr/lib/libcrypto.so.1.0.0 $(1)/usr/lib/libcrypto.so + rm -f $(1)/usr/lib/libcrypto.so.0.9.7 + ln -s /usr/lib/libcrypto.so.1.0.0 $(1)/usr/lib/libcrypto.so.0.9.7 + rm -f $(1)/usr/lib/libssl.so + ln -s /usr/lib/libssl.so.1.0.0 $(1)/usr/lib/libssl.so + rm -f $(1)/usr/lib/libssl.so.0.9.7 + ln -s /usr/lib/libssl.so.1.0.0 $(1)/usr/lib/libssl.so.0.9.7 + + $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/public/* $(1)/usr/lib/ + + rm -rf $(1)/usr/lib/modules + rm -rf $(1)/usr/lib/private + rm -rf $(1)/usr/lib/public + rm -rf $(1)/usr/lib/gpl + + # Install kernel modules + rm -rf $(1)/lib/modules/$(BCM_KERNEL_VERSION)/* + mkdir -p $(1)/lib/ + mkdir -p $(1)/lib/modules/ + mkdir -p $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ + mkdir -p $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra + + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/extra/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/ + find $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/ -name *.ko -exec cp {} $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ \; + + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/wlan/* $(1)/etc/wlan + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/telephonyProfiles.d $(1)/etc/ + +# rm -rf $(1)/lib/modules/$(BCM_KERNEL_VERSION)/bcm_usb.ko + + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/kernel/linux-3.4rt/vmlinux $(KDIR)/vmlinux.bcm.elf + $(KERNEL_CROSS)strip --remove-section=.note --remove-section=.comment $(KDIR)/vmlinux.bcm.elf + $(KERNEL_CROSS)objcopy $(OBJCOPY_STRIP) -O binary $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/kernel/linux-3.4rt/vmlinux $(KDIR)/vmlinux.bcm + + # bootloader nor +# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/cfe/build/broadcom/bcm63xx_rom/bcm9$(CONFIG_BCM_CHIP_ID)_cfe.w $(KDIR)/bcm_bootloader_cfe.w + + # ram part of the bootloader for nand boot + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/cfe/build/broadcom/bcm63xx_ram/cfe$(CONFIG_BCM_CHIP_ID).bin $(KDIR)/cferam.001 + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/cfe/build/broadcom/bcm63xx_rom/cfe$(CONFIG_BCM_CHIP_ID)_nand.v $(KDIR)/cfe$(CONFIG_BCM_CHIP_ID)_nand.v + cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/cfe/ $(KDIR)/cfe +# dd if=$(KDIR)/vmlinux.bcm.elf of=$(KDIR)/vmlinux.bcm bs=4096 count=1 +# $(KERNEL_CROSS)objcopy $(OBJCOPY_STRIP) -S $(LINUX_DIR)/vmlinux $(KERNEL_BUILD_DIR)/vmlinux.elf + + $(call Package/bcmkernel/removevoice,$(1)) + $(call Package/bcmkernel/removesound,$(1)) +# $(call Package/bcmkernel/removei2c,$(1)) +endef + diff --git a/bcmkernel/Makefile b/bcmkernel/Makefile index bf184f843..a5358f593 100644 --- a/bcmkernel/Makefile +++ b/bcmkernel/Makefile @@ -1,40 +1,9 @@ # -# Copyright (C) 2006-2008 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. +# Primary/common bcmkernel makefile for all versions of Broadcom SDKs # include $(TOPDIR)/rules.mk -PKG_NAME:=bcmkernel-3.4 -PKG_VERSION:=4.16 -PKG_RELEASE:=4 - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=git@iopsys.inteno.se:bcmkernel-4.16L.02A -PKG_SOURCE_PROTO:=git - -PKG_SOURCE_VERSION:=104638f3401491d5355832641b0334d64e89f9c4 - - -PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) - -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/image.mk -include $(INCLUDE_DIR)/kernel.mk - -export CONFIG_BCM_CHIP_ID -export CONFIG_BCM_KERNEL_PROFILE -export CONFIG_SECURE_BOOT_CFE - - -BCM_BS_PROFILE = $(shell echo $(CONFIG_BCM_KERNEL_PROFILE) | sed s/\"//g) - -BCM_KERNEL_VERSION:=3.4.11-rt19 -BCM_SDK_VERSION:=bcm963xx -RSTRIP:=true - define Package/bcmkernel SECTION:=net CATEGORY:=Base system @@ -51,230 +20,25 @@ define Package/bcmkernel/config source "$(SOURCE)/Config.in" endef - -define Package/bcmkernel/removevoice - touch $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/endpointdd.ko - rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/endpointdd.ko -endef - -ifeq ($(CONFIG_BCM_ENDPOINT_MODULE),y) -define Package/bcmkernel/removevoice - echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/endpointdd.ko -endef +# Include SDK version specific makefile based on config selection +ifeq ($(CONFIG_ARCH),) +include $(TOPDIR)/.config endif -define Package/bcmkernel/removesound - touch $(1)/lib/modules/$(BCM_KERNEL_VERSION)/snd - touch $(1)/lib/modules/$(BCM_KERNEL_VERSION)/soundcore.ko - rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/snd* - rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/soundcore.ko -endef +ifeq ($(CONFIG_BRCM_SDK_VER_414040),y) +include ./414040.mk -ifeq ($(BCM_USBSOUND_MODULES),y) -define Package/bcmkernel/removesound - echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/snd* -endef +else ifeq ($(CONFIG_BRCM_SDK_VER_416021),y) +include ./416021.mk + +else ifeq ($(CONFIG_BRCM_SDK_VER_416030),y) +include ./416030.mk + +else +# Make 'make menuconfig' work even though no SDK version specified +PKG_VERSION:=none +include $(INCLUDE_DIR)/package.mk endif - -define Package/bcmkernel/removei2c - rm $(1)/lib/modules/$(BCM_KERNEL_VERSION)/i2c* -endef - -ifeq ($(CONFIG_BCM_I2C),y) -define Package/bcmkernel/removei2c - echo not removing $(1)/lib/modules/$(BCM_KERNEL_VERSION)/i2c* -endef -endif - -#define Package/bcmkernel/prepare -#endif - -define Package/bcmkernel/install - $(INSTALL_DIR) $(1)/lib/bcm - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_DIR) $(1)/etc/adsl - $(INSTALL_DIR) $(1)/etc/wlan - $(INSTALL_DIR) $(1)/etc/cms_entity_info.d - - - -# Install header files - $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/broadcom/include/bcm963xx - $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/endpt/inc - $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc - $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/codec - $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc - $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/casCtl/inc - $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/LinuxUser - $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc - $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx - $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/shared/opensource/include/bcm963xx - $(INSTALL_DIR) $(STAGING_DIR)/usr/include/bcm963xx/userspace/private/apps/vodsl/voip/inc - - - $(CP) -r $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/shared/opensource/include/bcm963xx/* $(STAGING_DIR)/usr/include/bcm963xx/shared/opensource/include/bcm963xx - - $(CP) -r $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/opensource/include/bcm963xx/* $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx/ - - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgTypes.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgTypes.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfg.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfg.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfgCustom.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgCountryCfgCustom.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgLogCfgCustom.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgLogCfgCustom.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgLog.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgLog.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/countryArchive.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/countryArchive.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/inc/vrgCountry.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/inc/vrgCountry.h - - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/casCtl/inc/casCtl.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/casCtl/inc/casCtl.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/codec/codec.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/codec/codec.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/endpt/inc/endpt.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/endpt/inc/endpt.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/voice_res_gw/endpt/inc/vrgEndpt.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/voice_res_gw/endpt/inc/vrgEndpt.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/LinuxUser/bosTypesLinuxUser.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/LinuxUser/bosTypesLinuxUser.h - - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosMutex.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosMutex.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSpinlock.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSpinlock.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosMsgQ.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosMsgQ.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosCritSect.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosCritSect.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTypes.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTypes.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTime.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTime.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSem.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSem.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosCfgCustom.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosCfgCustom.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosIpAddr.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosIpAddr.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTimer.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTimer.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosError.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosError.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosLog.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosLog.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSleep.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSleep.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosMisc.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosMisc.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosCfg.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosCfg.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosEvent.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosEvent.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosTask.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosTask.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosUtil.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosUtil.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosInit.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosInit.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosSocket.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosSocket.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_common/bos/publicInc/bosFile.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_common/bos/publicInc/bosFile.h - - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvSlic.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvSlic.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvApm.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvApm.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvCas.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvCas.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/xChange/dslx_common/xchg_drivers/inc/xdrvTypes.h $(STAGING_DIR)/usr/include/bcm963xx/xChange/dslx_common/xchg_drivers/inc/xdrvTypes.h - - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/broadcom/include/bcm963xx/endptvoicestats.h $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/broadcom/include/bcm963xx/endptvoicestats.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/broadcom/include/bcm963xx/endpointdrv.h $(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/broadcom/include/bcm963xx/endpointdrv.h - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/userspace/private/apps/vodsl/voip/inc/tpProfiles.h $(STAGING_DIR)/usr/include/bcm963xx/userspace/private/apps/vodsl/voip/inc - - - -### - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/bin/* $(1)/usr/sbin/ - - rm -f $(1)/usr/sbin/dhcp6c - rm -f $(1)/usr/sbin/dhcp6s - rm -f $(1)/usr/sbin/dhcpc - rm -f $(1)/usr/sbin/dhcpd - rm -f $(1)/usr/sbin/dnsproxy - rm -f $(1)/usr/sbin/httpd - rm -f $(1)/usr/sbin/openssl - rm -f $(1)/usr/sbin/racoon - rm -f $(1)/usr/sbin/ripd - rm -f $(1)/usr/sbin/send_cms_msg - rm -f $(1)/usr/sbin/sshd - rm -f $(1)/usr/sbin/ssk - rm -f $(1)/usr/sbin/telnetd - rm -f $(1)/usr/sbin/tr64c - rm -f $(1)/usr/sbin/tr69c - rm -f $(1)/usr/sbin/ubi* - rm -f $(1)/usr/sbin/udhcpd - rm -f $(1)/usr/sbin/upnp - rm -f $(1)/usr/sbin/upnpd - rm -f $(1)/usr/sbin/vodsl - rm -f $(1)/usr/sbin/wlmngr - rm -f $(1)/usr/sbin/zebra - - - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/cms_entity_info.d/eid_bcm_kthreads.txt $(1)/etc/cms_entity_info.d/ - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/cms_entity_info.d/symbol_table.txt $(1)/etc/cms_entity_info.d/ - - - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/* $(1)/usr/lib/ - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/gpl/* $(1)/usr/lib/ - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/private/* $(1)/usr/lib/ - - mv $(1)/usr/lib/ld-uClibc.so.0 $(1)/lib/bcm/ - mv $(1)/usr/lib/libc.so.0 $(1)/lib/bcm/ - mv $(1)/usr/lib/libdl.so.0 $(1)/lib/bcm/ - mv $(1)/usr/lib/libgcc_s.so.1 $(1)/lib/bcm/ - mv $(1)/usr/lib/libpthread.so.0 $(1)/lib/bcm/ - -# rm -f $(1)/usr/lib/libcrypt.so.0 - rm -f $(1)/usr/lib/libm.so.0 - rm -f $(1)/usr/lib/libutil.so.0 - rm -f $(1)/usr/lib/libcms_boardctl.so - rm -f $(1)/usr/lib/libcms_msg.so - rm -f $(1)/usr/lib/libcms_util.so -# rm -f $(1)/usr/lib/libcrypto.so.0.9.7 -# rm -f $(1)/usr/lib/libssl.so.0.9.7 - rm -f $(1)/usr/lib/libnvram.so - - - $(CP) $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/public/* $(1)/usr/lib/ - - rm -rf $(1)/usr/lib/modules - rm -rf $(1)/usr/lib/private - rm -rf $(1)/usr/lib/public - rm -rf $(1)/usr/lib/gpl - - - rm -rf $(1)/lib/modules/$(BCM_KERNEL_VERSION)/* - mkdir -p $(1)/lib/ - mkdir -p $(1)/lib/modules/ - mkdir -p $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ - mkdir -p $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra - - - cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/extra/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/extra/ - find $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/ -name *.ko -exec cp {} $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ \; -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/crypto/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/drivers/scsi/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/drivers/usb/serial/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/drivers/usb/storage/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/fs/cifs/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/net/ipv4/*.ko $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/net/dns_resolver/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/net/ipv4/netfilter/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/net/ipv6/netfilter/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/net/netfilter/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/drivers/char/hw_random/* $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/drivers/i2c/i2c-core.ko $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/drivers/i2c/i2c-dev.ko $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/drivers/i2c/algos/i2c-algo-bit.ko $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/drivers/i2c/busses/i2c-gpio.ko $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ -# cp $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/lib/modules/$(BCM_KERNEL_VERSION)/kernel/drivers/i2c/busses/i2c-gpio-custom.ko $(1)/lib/modules/$(BCM_KERNEL_VERSION)/ - - touch $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/broadcom/char/adsl/impl1/adsl_phy.bin -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/bcmdrivers/broadcom/char/adsl/impl1/adsl_phy.bin $(1)/etc/adsl/adsl_phy.bin - - cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/wlan/* $(1)/etc/wlan - cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/$(BCM_BS_PROFILE)/fs/etc/telephonyProfiles.d $(1)/etc/ - -# rm -rf $(1)/lib/modules/$(BCM_KERNEL_VERSION)/bcm_usb.ko - - cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/kernel/linux-3.4rt/vmlinux $(KDIR)/vmlinux.bcm.elf - $(KERNEL_CROSS)strip --remove-section=.note --remove-section=.comment $(KDIR)/vmlinux.bcm.elf - $(KERNEL_CROSS)objcopy $(OBJCOPY_STRIP) -O binary $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/kernel/linux-3.4rt/vmlinux $(KDIR)/vmlinux.bcm - -# bootloader nor -# cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/cfe/build/broadcom/bcm63xx_rom/bcm9$(CONFIG_BCM_CHIP_ID)_cfe.w $(KDIR)/bcm_bootloader_cfe.w -# ram part of the bootloader for nand boot - cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/cfe/build/broadcom/bcm63xx_ram/cfe$(CONFIG_BCM_CHIP_ID).bin $(KDIR)/cferam.000 - cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/cfe/build/broadcom/bcm63xx_rom/cfe$(CONFIG_BCM_CHIP_ID)_nand.v $(KDIR)/cfe$(CONFIG_BCM_CHIP_ID)_nand.v - cp -R $(PKG_BUILD_DIR)/$(BCM_SDK_VERSION)/targets/cfe/ $(KDIR)/cfe -# dd if=$(KDIR)/vmlinux.bcm.elf of=$(KDIR)/vmlinux.bcm bs=4096 count=1 -# $(KERNEL_CROSS)objcopy $(OBJCOPY_STRIP) -S $(LINUX_DIR)/vmlinux $(KERNEL_BUILD_DIR)/vmlinux.elf - - $(call Package/bcmkernel/removevoice,$(1)) - $(call Package/bcmkernel/removesound,$(1)) -# $(call Package/bcmkernel/removei2c,$(1)) -endef - $(eval $(call BuildPackage,bcmkernel)) + diff --git a/freecwmp/Makefile b/freecwmp/Makefile index 8eaf30fc2..467322760 100644 --- a/freecwmp/Makefile +++ b/freecwmp/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=cwmp -PKG_VERSION:=2.3-2014-12-01 +PKG_VERSION:=2.3-2015-02-13 PKG_FIXUP:=autoreconf ifeq ($(CONFIG_PACKAGE_bcmkernel),y) PKG_SOURCE_URL:=ssh://git@iopsys.inteno.se/freecwmp.git @@ -16,7 +16,7 @@ else PKG_SOURCE_URL:=http://ihgsp.inteno.se/git/freecwmp.git endif PKG_SOURCE_PROTO:=git -PKG_SOURCE_VERSION:=bfdc0ec0ba7f78a8babdcff9a8ccc3a67af07ece +PKG_SOURCE_VERSION:=afdf1008520761c382a7d495314238fd1d5bc9e4 PKG_RELEASE=$(PKG_SOURCE_VERSION) PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) diff --git a/ice-client/Makefile b/ice-client/Makefile index 913ee3a17..6546de666 100644 --- a/ice-client/Makefile +++ b/ice-client/Makefile @@ -15,15 +15,15 @@ export PLATFORM_INCLUDE:=platforms/iopsys/build.mk export DATE:=$(shell date +%Y-%m-%d-%H-%M-%S) export LOGIN:=$(shell whoami) -BASE_PKG_VERSION:=3.3.0 -PKG_RELEASE:=RC3 +BASE_PKG_VERSION:=3.2.0 +PKG_RELEASE:=RC1 PKG_VERSION:=$(BASE_PKG_VERSION)-$(PKG_RELEASE)_$(DATE)_$(LOGIN) export PKG_VERSION ###########################--RELEASE--################################ PKG_SOURCE_URL:=ssh://git@iopsys.inteno.se/ice-client.git -PKG_SOURCE_VERSION:=e4fe162bf4660c06029b93414cf871476fb3378e +PKG_SOURCE_VERSION:=1f95ce3d1eff1b2403a2357d0fa45063e56ff5e2 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(BASE_PKG_VERSION) PKG_SOURCE:=$(PKG_NAME)-$(BASE_PKG_VERSION)-$(PKG_RELEASE).tar.gz @@ -884,133 +884,6 @@ fi exit 0 endef -# torrent -define Package/ice-client-torrent - $(call Package/ice-client/Default) - TITLE:=torrent - DEPENDS+= +boost-system -# boost Boost C++ source libraries (header-only) -# boost-chrono Boost C++ source libraries (chrono) -# boost-date_time Boost C++ source libraries (date_time) -# boost-filesystem Boost C++ source libraries (filesystem) -# boost-graph Boost C++ source libraries (graph) -# boost-iostreams Boost C++ source libraries (iostreams) -# boost-locale Boost C++ source libraries (locale) -# boost-math Boost C++ source libraries (math) -# boost-program_options Boost C++ source libraries (program_options) -# boost-python Boost C++ source libraries (python) -# boost-random Boost C++ source libraries (random) -# boost-regex Boost C++ source libraries (regex) -# boost-serialization Boost C++ source libraries (serialization) -# boost-signals Boost C++ source libraries (signals) -# boost-timer Boost C++ source libraries (timer) -#boost-wave Boost C++ source libraries (wave) - -endef - -define Package/ice-client-torrent/description -torrent module for ice-client -endef - -define Package/ice-client-torrent/prerm -#!/bin/sh -if [ -z "$${IPKG_INSTROOT}" ]; then - if [ ! -f "/tmp/ice.pid" ] ; then exit 0 ; fi - PROC_ID=$$(cat /tmp/ice.pid) - PROC_EXISTS=$$(/usr/bin/pgrep -P $${PROC_ID}) - if [ -n "$$PROC_EXISTS" ]; then - read -t 1 <>/tmp/cfout - echo "system moduleRemove topic=torrentMgr" > /tmp/cfin - fi -fi -exit 0 -endef - -define Package/ice-client-torrent/preinst -#!/bin/sh -if [ -z "$${IPKG_INSTROOT}" ]; then - if [ ! -f "/tmp/ice.pid" ] ; then exit 0 ; fi - PROC_ID=$$(cat /tmp/ice.pid) - PROC_EXISTS=$$(/usr/bin/pgrep -P $${PROC_ID}) - if [ -n "$$PROC_EXISTS" ]; then - read -t 1 <>/tmp/cfout - echo "system moduleRemove topic=torrentMgr" > /tmp/cfin - fi -fi -exit 0 -endef - -define Package/ice-client-torrent/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_BUILD_DIR)/core/lib/torrentService.so.1.0.1 $(1)/usr/lib -endef - -define Package/ice-client-torrent/postinst -#!/bin/sh -if [ -z "$${IPKG_INSTROOT}" ]; then - read -t 1 <>/tmp/cfout - if [ -f /tmp/ice.pid ]; then - echo "system moduleAdd file=torrentService.so.1.0.1" package="ice-client-torrent" > /tmp/cfin - fi -fi -exit 0 -endef - -# gigaset -define Package/ice-client-gigaset - $(call Package/ice-client/Default) - TITLE:=gigaset - DEPENDS+= -endef - -define Package/ice-client-gigaset/description -gigaset module for ice-client -endef - -define Package/ice-client-gigaset/prerm -#!/bin/sh -if [ -z "$${IPKG_INSTROOT}" ]; then - if [ ! -f "/tmp/ice.pid" ] ; then exit 0 ; fi - PROC_ID=$$(cat /tmp/ice.pid) - PROC_EXISTS=$$(/usr/bin/pgrep -P $${PROC_ID}) - if [ -n "$$PROC_EXISTS" ]; then - read -t 1 <>/tmp/cfout - echo "system moduleRemove topic=gigaset" > /tmp/cfin - fi -fi -exit 0 -endef - -define Package/ice-client-gigaset/preinst -#!/bin/sh -if [ -z "$${IPKG_INSTROOT}" ]; then - if [ ! -f "/tmp/ice.pid" ] ; then exit 0 ; fi - PROC_ID=$$(cat /tmp/ice.pid) - PROC_EXISTS=$$(/usr/bin/pgrep -P $${PROC_ID}) - if [ -n "$$PROC_EXISTS" ]; then - read -t 1 <>/tmp/cfout - echo "system moduleRemove topic=gigaset" > /tmp/cfin - fi -fi -exit 0 -endef - -define Package/ice-client-gigaset/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_BUILD_DIR)/core/lib/gigasetService.so.1.0.1 $(1)/usr/lib -endef - -define Package/ice-client-gigaset/postinst -#!/bin/sh -if [ -z "$${IPKG_INSTROOT}" ]; then - read -t 1 <>/tmp/cfout - if [ -f /tmp/ice.pid ]; then - echo "system moduleAdd file=gigasetService.so.1.0.1" package="ice-client-gigaset" > /tmp/cfin - fi -fi -exit 0 -endef - # This line executes the necessary commands to compile our program. # The above define directives specify all the information needed, but this # line calls BuildPackage which in turn actually uses this information to diff --git a/layer2interface/broadcom/etc/init.d/layer2_interface_adsl b/layer2interface/broadcom/etc/init.d/layer2_interface_adsl index df786a910..28055f84d 100755 --- a/layer2interface/broadcom/etc/init.d/layer2_interface_adsl +++ b/layer2interface/broadcom/etc/init.d/layer2_interface_adsl @@ -101,7 +101,6 @@ atm_inf_conf() { xtmctl operate conn --addq 1.$vpi.$vci 0 wrr 1 xtmctl operate conn --createnetdev 1.$vpi.$vci ${ifname%%.*} xtmctl operate intf --state 1 enable - ifconfig $baseifname up brcm_virtual_interface_rules "$baseifname" "$ifname" "$bridge" fi diff --git a/layer2interface/broadcom/etc/init.d/layer2_interface_ethernet b/layer2interface/broadcom/etc/init.d/layer2_interface_ethernet index dfe2eca80..92c0cce17 100755 --- a/layer2interface/broadcom/etc/init.d/layer2_interface_ethernet +++ b/layer2interface/broadcom/etc/init.d/layer2_interface_ethernet @@ -30,7 +30,6 @@ addethernet() { config_get baseifname $1 baseifname config_get ifname $1 ifname config_get bridge $1 bridge - ifconfig $baseifname up brcm_virtual_interface_rules "$baseifname" "$ifname" "$bridge" } diff --git a/layer2interface/broadcom/etc/init.d/layer2_interface_vdsl b/layer2interface/broadcom/etc/init.d/layer2_interface_vdsl index 1c597113a..e75650f46 100755 --- a/layer2interface/broadcom/etc/init.d/layer2_interface_vdsl +++ b/layer2interface/broadcom/etc/init.d/layer2_interface_vdsl @@ -45,7 +45,6 @@ ptm_inf_conf() { xtmctl operate conn --createnetdev $dslat.$ptmprio ${ifname%%.*} xtmctl operate intf --state 1 enable xtmctl start - ifconfig $baseifname up brcm_virtual_interface_rules "$baseifname" "$ifname" "$bridge" fi } diff --git a/layer2interface/broadcom/lib/network/vlan.sh b/layer2interface/broadcom/lib/network/vlan.sh index 7a3ead813..6b7b8dfff 100755 --- a/layer2interface/broadcom/lib/network/vlan.sh +++ b/layer2interface/broadcom/lib/network/vlan.sh @@ -2,7 +2,6 @@ . /usr/share/libubox/jshn.sh . /lib/network/ebtables.sh -. /lib/brcmaliases.sh removeall_vlandevices() { @@ -126,6 +125,9 @@ brcm_virtual_interface_rules () local baseifname=$1 local ifname=$2 local bridge=$3 + + echo '1' > /proc/sys/net/ipv6/conf/$baseifname/disable_ipv6 + ifconfig $baseifname up if [ "x$bridge" = "x" ]; then bridge=0 fi diff --git a/ledmngr/src/brcmdaemon.h b/ledmngr/src/brcmdaemon.h deleted file mode 100644 index bcbd17528..000000000 --- a/ledmngr/src/brcmdaemon.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef BRCMDAEMON_H -#define BRCMDAEMON_H 1 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define DAEMON_NAME "iopsys_ledmngr" -#define PID_FILE "/var/run/iopsys_ledmngr.pid" -#endif diff --git a/ledmngr/src/log.h b/ledmngr/src/log.h deleted file mode 100644 index 7ba9d7f12..000000000 --- a/ledmngr/src/log.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef LOG_H -extern int daemonize; - -#define DEBUG_PRINT_RAW(...) if (!daemonize) fprintf( stderr, __VA_ARGS__ ); -#define DEBUG_PRINT(fmt, args...) \ - do { \ - if (!daemonize) \ - fprintf( stderr,"%-20s: " fmt , __func__, ##args); \ - } while(0) - -#endif /* LOG_H */ diff --git a/ledmngr/src/ucix.h b/ledmngr/src/ucix.h deleted file mode 100644 index ea9af2002..000000000 --- a/ledmngr/src/ucix.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (C) 2008 John Crispin - */ - -#ifndef _UCI_H__ -#define _UCI_H__ -struct uci_context* ucix_init(const char *config_file); -struct uci_context* ucix_init_path(const char *path, const char *config_file); -void ucix_cleanup(struct uci_context *ctx); -void ucix_save(struct uci_context *ctx); -void ucix_save_state(struct uci_context *ctx); -const char* ucix_get_option(struct uci_context *ctx, - const char *p, const char *s, const char *o); -int ucix_get_option_int(struct uci_context *ctx, - const char *p, const char *s, const char *o, int def); -void ucix_add_section(struct uci_context *ctx, - const char *p, const char *s, const char *t); -void ucix_add_option(struct uci_context *ctx, - const char *p, const char *s, const char *o, const char *t); -void ucix_add_option_int(struct uci_context *ctx, - const char *p, const char *s, const char *o, int t); -int ucix_commit(struct uci_context *ctx, const char *p); -void ucix_revert(struct uci_context *ctx, - const char *p, const char *s, const char *o); -void ucix_del(struct uci_context *ctx, const char *p, - const char *s, const char *o); -#endif diff --git a/luci/luci/Makefile b/luci/luci/Makefile index ebc1a32e4..f815bf27b 100644 --- a/luci/luci/Makefile +++ b/luci/luci/Makefile @@ -2,8 +2,8 @@ include $(TOPDIR)/rules.mk PKG_BRANCH:=svn-0.11 PKG_NAME:=luci -PKG_VERSION:=inteno-1.0.145 -PKG_SOURCE_VERSION:=5fcc60517dc95e128afa21d2de2a91ffa04e0d56 +PKG_VERSION:=inteno-1.0.169 +PKG_SOURCE_VERSION:=e5300da360d4ecfa050cc3fb3e3be8e962b36023 PKG_SOURCE_PROTO:=git ifeq ($(CONFIG_PACKAGE_bcmkernel),y) @@ -446,9 +446,6 @@ define Package/luci-app-voice/install $(INSTALL_DATA) $(LUCI_VOICE_DIR)/dist/etc/config/voice_client $(1)/etc/config/ $(INSTALL_DATA) $(LUCI_VOICE_DIR)/dist/etc/config/voice_codecs $(1)/etc/config/ - $(INSTALL_DIR) $(1)/etc - $(INSTALL_DATA) $(LUCI_VOICE_DIR)/dist/etc/idc_cc.cfg $(1)/etc - echo $(PKG_VERSION) > $(1)/etc/iop_luci_version.log echo $(PKG_SOURCE_VERSION) >> $(1)/etc/iop_luci_version.log @@ -583,10 +580,10 @@ $(eval $(call application,mcpd,LuCI Support for IGMP Proxy,\ +PACKAGE_luci-app-mcpd:mcpd)) $(eval $(call application,sfp,LuCI Support for SFP status,\ - +PACKAGE_luci-app-sfp:sfp)) + +PACKAGE_luci-app-sfp:sfp)) $(eval $(call application,catv,LuCI Support for CATV Module,\ - +PACKAGE_luci-app-catv:catv)) + +PACKAGE_luci-app-catv:catv)) $(eval $(call application,mount,LuCI Support for Mount Management,\ +PACKAGE_luci-app-mount)) diff --git a/peripheral_manager/Makefile b/peripheral_manager/Makefile new file mode 100644 index 000000000..087b9f9b0 --- /dev/null +++ b/peripheral_manager/Makefile @@ -0,0 +1,60 @@ +# +# Copyright (C) 2006-2010 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk + +PKG_NAME:=peripheral_manager +PKG_RELEASE:=1 + +# support parallel build +PKG_BUILD_PARALLEL:=1 + +#re create configure scripts if not present. +PKG_FIXUP:=autoreconf + +# run install target when cross compiling. basically, make install DESTDIR=$(PKG_INSTALL_DIR) +# this way we don't need to pick out the resulting files from the build dir. +PKG_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/peripheral_manager + CATEGORY:=Utilities + TITLE:=Application deamon for handling of peripheral + URL:= + DEPENDS:=+libuci +libubus +libblobmsg-json +bcmkernel +endef + +define Package/peripheral_manager/description + Application handling peripheral +endef + +TARGET_CPPFLAGS := \ + -I$(STAGING_DIR)/usr/include/bcm963xx/shared/opensource/include/bcm963xx \ + -I$(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx \ + $(TARGET_CPPFLAGS) + +# In future get the git. unpack it in src. +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ + $(CP) ./files/* $(PKG_BUILD_DIR)/ +endef + +define Package/peripheral_manager/install + + $(INSTALL_DIR) $(1)/etc/ + $(INSTALL_DIR) $(1)/etc/init.d/ + + $(INSTALL_DIR) $(1)/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/peripheral_manager $(1)/sbin/ + + $(INSTALL_BIN) $(PKG_BUILD_DIR)/etc/init.d/* $(1)/etc/init.d/ +endef + +$(eval $(call BuildPackage,peripheral_manager)) diff --git a/ledmngr/files/etc/init.d/ledmngr b/peripheral_manager/files/etc/init.d/peripheral_manager similarity index 70% rename from ledmngr/files/etc/init.d/ledmngr rename to peripheral_manager/files/etc/init.d/peripheral_manager index 3f39b12a8..60191b09c 100755 --- a/ledmngr/files/etc/init.d/ledmngr +++ b/peripheral_manager/files/etc/init.d/peripheral_manager @@ -6,11 +6,11 @@ START=19 start() { - /sbin/ledmngr + /sbin/peripheral_manager sleep 1 /bin/ubus call led.status set '{"state":"ok"}' & } stop() { - killall -9 ledmngr + killall -9 peripheral_manager } diff --git a/peripheral_manager/src/Makefile.am b/peripheral_manager/src/Makefile.am new file mode 100644 index 000000000..a2dae9fb8 --- /dev/null +++ b/peripheral_manager/src/Makefile.am @@ -0,0 +1,43 @@ +#PRG_VERSION := $(shell cd @top_srcdir@; if ! git describe --tags ;then echo version-$(PACKAGE_VERSION) ;fi ) + +AM_CFLAGS = $(OUR_CFLAGS) + +bin_PROGRAMS = peripheral_manager +dist_data_DATA = configs/hw + +peripheral_manager_SOURCES = \ + src/peripheral_manager.c \ + src/ucix.c \ + src/ucix.h \ + src/server.c \ + src/server.h \ + src/led.c \ + src/led.h \ + src/sim_led.c \ + src/button.h \ + src/button.c \ + src/sim_button.c \ + src/catv.c \ + src/catv.h \ + src/smbus.c \ + src/smbus.h \ + src/i2c.c \ + src/i2c.h \ + src/sfp.c \ + src/sfp.h + +if BRCM_BOARD +peripheral_manager_SOURCES += \ + src/gpio_led.c \ + src/gpio_led.h \ + src/gpio_button.c \ + src/gpio_button.h \ + src/gpio.c \ + src/gpio.h \ + src/touch_sx9512.c \ + src/touch_sx9512.h +endif + +peripheral_manager_LDADD = $(UCI_LIB) $(UBOX_LIB) $(UBUS_LIB) -lm + +peripheral_manager_CFLAGS = $(AM_CFLAGS) -DPRG_VERSION=\"$(PRG_VERSION)\" diff --git a/peripheral_manager/src/configs/DG301R0 b/peripheral_manager/src/configs/DG301R0 new file mode 100644 index 000000000..bc419cb79 --- /dev/null +++ b/peripheral_manager/src/configs/DG301R0 @@ -0,0 +1,307 @@ + +config board 'board' + option hardware 'DG301' + option hasAdsl '1' + option hasVdsl '1' + option hasVoice '1' + option hasDect '1' + option VoicePorts '2' + option VoiceLeds '1' + option hasWifi '1' + option ethernetPorts '5' + option ethernetPortNames 'LAN1 LAN2 LAN3 LAN4 WAN' + option ethernetPortOrder 'eth4 eth3 eth1 eth2 eth0' + option ethernetLanPorts 'eth1 eth2 eth3 eth4' + option ethernetWanPort 'eth0' + option adslWanPort 'atm0' + option vdslWanPort 'ptm0' + option wpsButtonGpio '22' + option fxsRelayGpio '8' + option hasBrcmAvs '0' + +config wifi-chip '435f' + option bands 'b' + +config wifi-chip '43a0' + option bands 'a' + option is_ac '1' + +config wifi-chip '43a2' + option bands 'a' + option is_ac '1' + +config wifi-chip '43bc' + option bands 'a' + option is_ac '1' + option radarthrs '0x6aa 0x30 0x6a8 0x30 0x69c 0x30 0x6aa 0x30 0x6aa 0x30 0x6a2 0x30' + +############################################################################### +# +# Button config, start +# + +############### gpio buttons, driver config +config gpio_button gpio_buttons + list buttons gpio_reset + list buttons gpio_dect + list buttons gpio_wps + list buttons gpio_info + list buttons gpio_eco + +config gpio_button gpio_reset + option addr 32 + option active low + +config gpio_button gpio_dect + option addr 20 + option active low + +config gpio_button gpio_wps + option addr 22 + option active low + +config gpio_button gpio_info + option addr 37 + option active low + +config gpio_button gpio_eco + option addr 36 + option active low + +############### function buttons used on board. +config button_map button_map + list buttonnames RESET + list buttonnames DECT + list buttonnames WPS + list buttonnames INFO + list buttonnames ECO + option minpress 100 + +############### mapping function button to driver button +config button_map RESET + list button gpio_reset + option minpress 5000 + option hotplug resetbutton + +config button_map DECT + list button gpio_dect + option hotplug dectbutton + +config button_map WPS + list button gpio_wps + option hotplug wpsbutton + +config button_map INFO + list button gpio_info + option hotplug infobutton + +config button_map ECO + list button gpio_eco + option hotplug ecobutton + +# +# Button config , end +# +############################################################################### + +############################################################################### +# +# Led config, start +# + +############### gpio led, driver config +config gpio_led gpio_leds + list leds Ethernet_green + list leds Wireless_green + list leds Voice_green + list leds Broadband_green + list leds Status_blue + list leds Status_green + list leds Status_red + list leds Internet_green + list leds Internet_red + list leds DECT_red + list leds DECT_green + list leds TV_green + list leds WPS_green + list leds WPS_red + list leds WAN_yellow + +config gpio_led Ethernet_green + option addr 0 + option active hi + option mode csr + +config gpio_led Wireless_green + option addr 3 + option active hi + option mode csr + +config gpio_led Voice_green + option addr 9 + option active low + option mode direct + +config gpio_led Broadband_green + option addr 6 + option active hi + option mode csr + +config gpio_led Status_blue + option addr 7 + option active hi + option mode csr + +config gpio_led Status_green + option addr 39 + option active low + option mode direct + +config gpio_led Status_red + option addr 38 + option active low + option mode direct + +config gpio_led Internet_green + option addr 5 + option active hi + option mode csr + +config gpio_led Internet_red + option addr 4 + option active hi + option mode csr + +config gpio_led DECT_red + option addr 19 + option active low + option mode direct + +config gpio_led DECT_green + option addr 15 + option active low + option mode direct + +config gpio_led TV_green + option addr 35 + option active low + option mode direct + +config gpio_led WPS_green + option addr 2 + option active hi + option mode csr + +config gpio_led WPS_red + option addr 1 + option active hi + option mode csr + +config gpio_led WAN_yellow + option addr 21 + option active hi + option mode direct + +############### mapping led function to driver led + +config led_map led_dsl + list led_action_ok Broadband_green=ON + list led_action_off Broadband_green=OFF + list led_action_notice Broadband_green=FLASH_SLOW + list led_action_alert Broadband_green=FLASH_SLOW + list led_action_error Broadband_green=FLASH_FAST + +config led_map led_wifi + list led_action_ok Wireless_green=ON + list led_action_off Wireless_green=OFF + list led_action_notice Wireless_green=FLASH_SLOW + list led_action_alert Wireless_green=FLASH_SLOW + list led_action_error Wireless_green=FLASH_FAST + +config led_map led_wps + list led_action_ok 'WPS_green = ON' + list led_action_ok 'WPS_red = OFF' + list led_action_off 'WPS_green = OFF' + list led_action_off 'WPS_red = OFF' + list led_action_notice 'WPS_green = FLASH_SLOW' + list led_action_notice 'WPS_red = OFF' + list led_action_alert 'WPS_green = OFF' + list led_action_alert 'WPS_red = FLASH_SLOW' + list led_action_error 'WPS_green = OFF' + list led_action_error 'WPS_red = FLASH_FAST' + +config led_map led_lan + list led_action_ok Ethernet_green=ON + list led_action_off Ethernet_green=OFF + list led_action_notice Ethernet_green=FLASH_SLOW + list led_action_alert Ethernet_green=FLASH_SLOW + list led_action_error Ethernet_green=FLASH_FAST + +config led_map led_status + list led_action_ok 'Status_green = ON' + list led_action_ok 'Status_red = OFF' + list led_action_ok 'Status_blue = OFF' + + list led_action_off 'Status_green = OFF' + list led_action_off 'Status_red = OFF' + list led_action_off 'Status_blue = OFF' + + list led_action_notice 'Status_green = FLASH_SLOW' + list led_action_notice 'Status_red = OFF' + list led_action_notice 'Status_blue = OFF' + + list led_action_alert 'Status_green = OFF' + list led_action_alert 'Status_red = FLASH_SLOW' + list led_action_alert 'Status_blue = OFF' + + list led_action_error 'Status_green = OFF' + list led_action_error 'Status_red = FLASH_FAST' + list led_action_error 'Status_blue = OFF' + +config led_map led_tv + list led_action_ok TV_green=ON + list led_action_off TV_green=OFF + list led_action_notice TV_green=FLASH_SLOW + list led_action_alert TV_green=FLASH_SLOW + list led_action_error TV_green=FLASH_FAST + +config led_map led_wan + list led_action_off WAN_yellow=OFF + list led_action_alert WAN_yellow=ON + +config led_map led_internet + list led_action_ok 'Internet_green = ON' + list led_action_ok 'Internet_red = OFF' + + list led_action_off 'Internet_green = OFF' + list led_action_off 'Internet_red = OFF' + + list led_action_notice 'Internet_green = FLASH_SLOW' + list led_action_notice 'Internet_red = OFF' + + list led_action_alert 'Internet_green = OFF' + list led_action_alert 'Internet_red = FLASH_SLOW' + + list led_action_error 'Internet_green = OFF' + list led_action_error 'Internet_red = ON' + +config led_map led_voice1 + list led_action_ok Voice_green=ON + list led_action_off Voice_green=OFF + list led_action_notice Voice_green=FLASH_SLOW + list led_action_alert Voice_green=FLASH_SLOW + list led_action_error Voice_green=FLASH_FAST + +config led_map led_eco + list led_action_ok Status_blue=ON + list led_action_off Status_blue=OFF + list led_action_notice Status_blue=FLASH_SLOW + list led_action_alert Status_blue=FLASH_SLOW + list led_action_error Status_blue=FLASH_FAST + +# +# Led config , end +# +############################################################################### + + diff --git a/peripheral_manager/src/configs/hw b/peripheral_manager/src/configs/hw new file mode 100644 index 000000000..31695d0f6 --- /dev/null +++ b/peripheral_manager/src/configs/hw @@ -0,0 +1,349 @@ + +config board 'board' + option hardware 'CG300' + option hasAdsl '0' + option hasVdsl '0' + option hasVoice '0' + option hasDect '1' + option VoicePorts '0' + option VoiceLeds '0' + option hasWifi '1' + option ethernetPorts '2' + option ethernetPortNames 'LAN WAN' + option ethernetPortOrder 'eth1 eth0' + option ethernetLanPorts 'eth1' + option ethernetWanPort 'eth0' + option adslWanPort '' + option vdslWanPort '' +# option lednames 'Status Internet Wireless WPS DECT WAN' + option lednames 'Status Internet Wireless WPS DECT WAN' + option buttonnames 'RESET Wireless WPS DECT TOUCH_NEAR TOUCH_FAR' + option wpsButtonGpio '0' + option fxsRelayGpio '0' + option i2cGpioCustom 'bus0=0,23,22' + +config wifi-chip '435f' + option bands 'b' + +config wifi-chip '43a0' + option bands 'a' + option is_ac '1' + +config wifi-chip '43a2' + option bands 'a' + option is_ac '1' + +config wifi-chip '43bc' + option bands 'a' + option is_ac '1' + option radarthrs '0x6ae 0x30 0x6a8 0x30 0x6a4 0x30 0x6aa 0x30 0x6aa 0x30 0x6a4 0x30' + +config buttons 'buttons' + option RESET 'gpio 32 al resetbutton Status_green' + option DECT 'i2c 3 ah dectbutton WPS_green' + option WPS 'i2c 2 ah wpsbutton Wireless_green' + option Wireless 'i2c 1 ah ecobutton Internet_green' + option TOUCH_NEAR 'i2c 8 ah touch_near Wireless_blue' + option TOUCH_FAR 'i2c 9 ah touch_far Internet_red' + +config leds 'leds' + option Status_green 'gpio 39 al' + option Status_red 'gpio 38 al' + option Internet_green 'i2c 4 ah' + option Internet_red 'i2c 5 ah' + option Wireless_green 'gpio 37 al' + option Wireless_blue 'gpio 36 al' + option WPS_green 'i2c 2 ah' + option DECT_green 'i2c 3 ah' + option WAN_green 'gpio 9 al' + option WAN_yellow 'gpio 10 al' + +# config led_map 'led_map' +# option dsl_ok '' +# option dsl_off '' +# option dsl_notice '' +# option dsl_alert '' +# option dsl_error '' +# option wifi_ok 'Wireless_green=ON Wireless_blue=OFF' +# option wifi_off 'Wireless_green=OFF Wireless_blue=OFF' +# option wifi_notice 'Wireless_green=OFF Wireless_blue=ON' +# option wifi_alert 'Wireless_green=OFF Wireless_blue=ON' +# option wifi_error 'Wireless_green=OFF Wireless_blue=BLINK_FAST' +# option wps_ok 'WPS_green=ON' +# option wps_off 'WPS_green=OFF' +# option wps_notice 'WPS_green=BLINK_SLOW' +# option wps_alert 'WPS_green=OFF' +# option wps_error 'WPS_green=OFF' +# option lan_ok '' +# option lan_off '' +# option lan_notice '' +# option lan_alert '' +# option lan_error '' +# option status_ok 'Status_green=ON Status_red=OFF' +# option status_off 'Status_green=OFF Status_red=OFF' +# option status_notice 'Status_green=BLINK_SLOW Status_red=OFF' +# option status_alert 'Status_green=OFF Status_red=BLINK_SLOW' +# option status_error 'Status_green=OFF Status_red=BLINK_FAST' +# option dect_ok 'DECT_green=ON' +# option dect_off 'DECT_green=OFF' +# option dect_notice 'DECT_green=BLINK_SLOW' +# option dect_alert 'DECT_green=OFF' +# option dect_error 'DECT_green=OFF' +# option tv_ok '' +# option tv_off '' +# option tv_notice '' +# option tv_alert '' +# option tv_error '' +# option usb_ok '' +# option usb_off '' +# option usb_notice '' +# option usb_alert '' +# option usb_error '' +# option wan_ok '' +# option wan_off 'WAN_green=OFF WAN_yellow=OFF' +# option wan_notice 'WAN_green=ON' +# option wan_alert 'WAN_yellow=ON' +# option wan_error '' +# option internet_ok 'Internet_green=ON Internet_red=OFF' +# option internet_off 'Internet_green=OFF Internet_red=OFF' +# option internet_notice 'Internet_green=BLINK_SLOW Internet_red=OFF' +# option internet_alert 'Internet_green=OFF Internet_red=BLINK_SLOW' +# option internet_error 'Internet_green=OFF Internet_red=BLINK_FAST' +# option voice1_ok '' +# option voice1_off '' +# option voice1_notice '' +# option voice1_alert '' +# option voice1_error '' +# option voice2_ok '' +# option voice2_off '' +# option voice2_notice '' +# option voice2_alert '' +# option voice2_error '' +# option eco_ok '' +# option eco_off '' +# option eco_notice '' +# option eco_alert '' +# option eco_error '' + +############################################################################### +# +# example for low level button. +# +# + +config sim_button sim_buttons + list buttons sim_button_A + list buttons sim_button_B + list buttons sim_button_c + list buttons sim_button_d + list buttons sim_button_e + +config sim_button sim_button_A + option addr 10 + option active hi + +config sim_button sim_button_B + option addr 11 + option active low + +config sim_button sim_button_c + option addr 12 + option active hi + +config sim_button sim_button_d + option addr 13 + option active hi + +config sim_button sim_button_e + option addr 14 + option active hi + +############################################################################### +# +# example for mapping system button to driver button. +# +# mapping serveral "functions" buttons to one physical can be done with the long press option +# if +# +# this is a list of all button names. perifmanger will read this list then read out the specific button config + +config button_map button_map + list buttonnames RESET + list buttonnames Wireless + list buttonnames WPS + list buttonnames DECT + list buttonnames TOUCH_NEAR + list buttonnames TOUCH_FAR + option minpress 100 # default minimum time a button nedes to be pressed. + +config button_map RESET +# list button gpio_reset + list button sim_button_A # driver that is used for this button + option minpress 5000 # don't allow button unless pressed for 5 seconds. + option hotplug resetbutton + +config button_map Wireless + list button sim_button_B # driver that is used for this button + list button sim_button_c # we support user having to press two at the same time to register a button event. + option minpress 1000 + option hotplug ecobutton + +# long press example one or the other of touch_near or touch_far will trigger not booth. + +config button_map TOUCH_NEAR + list button gpio_reset +# list button sim_button_d # driver that is used for this button + option hotplug touch_near + +config button_map TOUCH_FAR + list button sim_button_d # driver that is used for this button + option longpress 3000 # this button has a long press option. + option hotplug touch_far + + + +############################################################################### +# +# example for low level led driver. +# here we list what the led can do and any info the driver needs to know to controll the led. +# +# would proably be smarter to name the leds as the color and not just A B C. +# but this is an example to show there is no connection with the name and what it +# does. +# +config sim_led sim_leds + list leds sim_led_A + list leds sim_led_B + list leds sim_led_C + +config sim_led sim_led_A + option addr 1 + option color green + option breading no + +config sim_led sim_led_B + option addr 7 + option color red + option breading no + +config sim_led sim_led_C + option addr 3 + option color blue + option breading yes + option fadein yes + option fadeout yes + +############################################################################### +# +# gpio leds +# +config gpio_led gpio_leds + list leds Status_green + list leds Status_red + list leds Wireless_green + list leds Wireless_blue + list leds WAN_green + list leds WAN_yellow + +config gpio_led Status_green + option addr 39 + option active low + option mode direct + +config gpio_led Status_red + option addr 38 + option active low + option mode direct + +config gpio_led Wireless_green + option addr 37 + option active low + option mode direct + +config gpio_led Wireless_blue + option addr 36 + option active low + option mode direct + +config gpio_led WAN_green + option addr 9 + option active low + option mode direct + +config gpio_led WAN_yellow + option addr 10 + option active low + option mode direct + +############################################################################### +# +# gpio buttons +# + +config gpio_button gpio_buttons + list buttons gpio_reset + +config gpio_button gpio_reset + option addr 32 + option active low +# option feedback + + +############################################################################### +# +# example mapping sim leds to system leds. +# +# the led_action list can be from one entry and up. +# +# led_action, list of leds to set. +# button_action. list of button events to send out +# effect_action, list of special effects to activate. (dim display.....) +# + +config led_map led_map + + +config led_map status_ok + list led_action Status_green=ON + list led_action Status_red=OFF +config led_map status_off + list led_action Status_green=OFF + list led_action Status_red=OFF +config led_map status_notice + list led_action Status_green=FLASH_SLOW + list led_action Status_red=OFF +config led_map status_alert + list led_action Status_green= + list led_action Status_red=FLASH_SLOW +config led_map status_error + list led_action Status_green=OFF + list led_action Status_red=FLASH_FAST + + +config led_map wifi_ok + list led_action sim_led_A=ON + list led_action sim_led_C=OFF +config led_map wifi_off + list led_action sim_led_A=OFF + list led_action sim_led_C=OFF +config led_map wifi_notice + list led_action sim_led_A=OFF + list led_action sim_led_C=ON +config led_map wifi_alert + list led_action sim_led_A=OFF + list led_action sim_led_C=ON +config led_map wifi_error + list led_action sim_led_A=FLASH_SLOW + list led_action sim_led_C=FLASH_SLOW + +config led_map wps_ok + list led_action sim_led_B=ON +config led_map wps_off + list led_action sim_led_B=OFF +config led_map wps_notice + list led_action sim_led_B=ON +config led_map wps_alert + list led_action sim_led_B=ON +config led_map wps_error + list led_action sim_led_B=ON + diff --git a/peripheral_manager/src/configure.ac b/peripheral_manager/src/configure.ac new file mode 100644 index 000000000..137813b01 --- /dev/null +++ b/peripheral_manager/src/configure.ac @@ -0,0 +1,77 @@ +dnl init stuff needs to be first in file +AC_INIT([peripheral_manager], [0.1], [Kenneth Johansson ]) +AC_CONFIG_MACRO_DIR([m4]) +AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects]) +AM_SILENT_RULES([yes]) + +AC_PROG_CC +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_FILES([Makefile]) + +CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\ + -pipe \ + -Wall \ + -Wextra \ + -Wno-inline \ + -Wundef \ + "-Wformat=2 -Wformat-security -Wformat-nonliteral" \ + -Wlogical-op \ + -Wsign-compare \ + -Wmissing-include-dirs \ + -Wold-style-definition \ + -Wpointer-arith \ + -Winit-self \ + -Wdeclaration-after-statement \ + -Wfloat-equal \ + -Wsuggest-attribute=noreturn \ + -Wmissing-prototypes \ + -Wstrict-prototypes \ + -Wredundant-decls \ + -Wmissing-declarations \ + -Wmissing-noreturn \ + -Wshadow \ + -Wendif-labels \ + -Wstrict-aliasing=2 \ + -Wwrite-strings \ + -Wno-long-long \ + -Wno-overlength-strings \ + -Wno-unused-parameter \ + -Wno-missing-field-initializers \ + -Wno-unused-result \ + -Werror=overflow \ + -Wdate-time \ + -Wnested-externs \ + -ffast-math \ + -fno-common \ + -fdiagnostics-show-option \ + -fno-strict-aliasing \ + -fvisibility=hidden \ + -ffunction-sections \ + -fdata-sections \ + -fstack-protector \ + -fstack-protector-strong \ + -fPIE \ + --param=ssp-buffer-size=4]) + +AC_SUBST([OUR_CFLAGS], "$with_cflags") + +dnl check for uci , its manadatory +AC_SEARCH_LIBS([uci_load], [uci], [], [AC_MSG_ERROR([*** UCI library not found])]) + +dnl check ubox , its manadatory +AC_SEARCH_LIBS([uloop_init], [ubox], [], [AC_MSG_ERROR([*** UBOX library not found])]) + +dnl chek ubus , its manadatory +AC_SEARCH_LIBS([ubus_connect], [ubus], [], [AC_MSG_ERROR([*** UBUS library not found])]) + +dnl check for board.h file +AC_CHECK_HEADERS(board.h, AM_CONDITIONAL(BRCM_BOARD, true), AM_CONDITIONAL(BRCM_BOARD, false)) + +AC_OUTPUT + +AC_MSG_RESULT([ + $PACKAGE_NAME $VERSION + CFLAGS: ${OUR_CFLAGS} ${CFLAGS} + CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS} + LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS} +]) diff --git a/peripheral_manager/src/ledctl b/peripheral_manager/src/ledctl new file mode 100755 index 000000000..2e763b390 --- /dev/null +++ b/peripheral_manager/src/ledctl @@ -0,0 +1,32 @@ +#!/bin/sh + +name=$1 +status=$2 + + +name=$(echo $name | tr '[A-Z]' '[a-z]') +status=$(echo $status | tr '[A-Z]' '[a-z]') + +case $name in + normal) ubus call leds set '{"state":"normal"}' ;; + proximity) ubus call leds set '{"state":"proximity"}' ;; + test) ubus call leds set '{"state":"test"}' ;; + allon) ubus call leds set '{"state":"allon"}' ;; + alloff) ubus call leds set '{"state":"alloff"}' ;; + production) ubus call leds set '{"state":"production"}' ;; + broadband) db get hw.board.lednames | grep -iq broadband && name="dsl" || exit ;; + ethernet) name="lan" ;; + wireless) name="wifi" ;; + tel*|voice) name="voice1" ;; + video) name="tv" ;; + power) name="status" ;; +esac + +case $status in + on) status="ok" ;; + fail) status="error" ;; + blink) status="notice" ;; +esac + +ubus -s /tmp/ubus.s call led.$name set '{"state":"'$status'"}' & + diff --git a/peripheral_manager/src/m4/attributes.m4 b/peripheral_manager/src/m4/attributes.m4 new file mode 100644 index 000000000..ac3c6624c --- /dev/null +++ b/peripheral_manager/src/m4/attributes.m4 @@ -0,0 +1,288 @@ +dnl Macros to check the presence of generic (non-typed) symbols. +dnl Copyright (c) 2006-2008 Diego Pettenò +dnl Copyright (c) 2006-2008 xine project +dnl Copyright (c) 2012 Lucas De Marchi +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2, or (at your option) +dnl any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +dnl 02110-1301, USA. +dnl +dnl As a special exception, the copyright owners of the +dnl macro gives unlimited permission to copy, distribute and modify the +dnl configure scripts that are the output of Autoconf when processing the +dnl Macro. You need not follow the terms of the GNU General Public +dnl License when using or distributing such scripts, even though portions +dnl of the text of the Macro appear in them. The GNU General Public +dnl License (GPL) does govern all other use of the material that +dnl constitutes the Autoconf Macro. +dnl +dnl This special exception to the GPL applies to versions of the +dnl Autoconf Macro released by this project. When you make and +dnl distribute a modified version of the Autoconf Macro, you may extend +dnl this special exception to the GPL to apply to your modified version as +dnl well. + +dnl Check if FLAG in ENV-VAR is supported by compiler and append it +dnl to WHERE-TO-APPEND variable +dnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG]) + +AC_DEFUN([CC_CHECK_FLAG_APPEND], [ + AC_CACHE_CHECK([if $CC supports flag $3 in envvar $2], + AS_TR_SH([cc_cv_$2_$3]), + [eval "AS_TR_SH([cc_save_$2])='${$2}'" + eval "AS_TR_SH([$2])='-Werror $3'" + AC_LINK_IFELSE([AC_LANG_SOURCE([int main(void) { return 0; } ])], + [eval "AS_TR_SH([cc_cv_$2_$3])='yes'"], + [eval "AS_TR_SH([cc_cv_$2_$3])='no'"]) + eval "AS_TR_SH([$2])='$cc_save_$2'"]) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_$2_$3])[ = xyes], + [eval "$1='${$1} $3'"]) +]) + +dnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2]) +AC_DEFUN([CC_CHECK_FLAGS_APPEND], [ + for flag in $3; do + CC_CHECK_FLAG_APPEND($1, $2, $flag) + done +]) + +dnl Check if the flag is supported by linker (cacheable) +dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) + +AC_DEFUN([CC_CHECK_LDFLAGS], [ + AC_CACHE_CHECK([if $CC supports $1 flag], + AS_TR_SH([cc_cv_ldflags_$1]), + [ac_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $1" + AC_LINK_IFELSE([int main() { return 1; }], + [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"], + [eval "AS_TR_SH([cc_cv_ldflags_$1])="]) + LDFLAGS="$ac_save_LDFLAGS" + ]) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes], + [$2], [$3]) +]) + +dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for +dnl the current linker to avoid undefined references in a shared object. +AC_DEFUN([CC_NOUNDEFINED], [ + dnl We check $host for which systems to enable this for. + AC_REQUIRE([AC_CANONICAL_HOST]) + + case $host in + dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads + dnl are requested, as different implementations are present; to avoid problems + dnl use -Wl,-z,defs only for those platform not behaving this way. + *-freebsd* | *-openbsd*) ;; + *) + dnl First of all check for the --no-undefined variant of GNU ld. This allows + dnl for a much more readable command line, so that people can understand what + dnl it does without going to look for what the heck -z defs does. + for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do + CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"]) + break + done + ;; + esac + + AC_SUBST([LDFLAGS_NOUNDEFINED]) +]) + +dnl Check for a -Werror flag or equivalent. -Werror is the GCC +dnl and ICC flag that tells the compiler to treat all the warnings +dnl as fatal. We usually need this option to make sure that some +dnl constructs (like attributes) are not simply ignored. +dnl +dnl Other compilers don't support -Werror per se, but they support +dnl an equivalent flag: +dnl - Sun Studio compiler supports -errwarn=%all +AC_DEFUN([CC_CHECK_WERROR], [ + AC_CACHE_CHECK( + [for $CC way to treat warnings as errors], + [cc_cv_werror], + [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror], + [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])]) + ]) +]) + +AC_DEFUN([CC_CHECK_ATTRIBUTE], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))], + AS_TR_SH([cc_cv_attribute_$1]), + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])], + [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"], + [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"]) + CFLAGS="$ac_save_CFLAGS" + ]) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes], + [AC_DEFINE( + AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1, + [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))] + ) + $4], + [$5]) +]) + +AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [ + CC_CHECK_ATTRIBUTE( + [constructor],, + [void __attribute__((constructor)) ctor() { int a; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_FORMAT], [ + CC_CHECK_ATTRIBUTE( + [format], [format(printf, n, n)], + [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [ + CC_CHECK_ATTRIBUTE( + [format_arg], [format_arg(printf)], + [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [ + CC_CHECK_ATTRIBUTE( + [visibility_$1], [visibility("$1")], + [void __attribute__((visibility("$1"))) $1_function() { }], + [$2], [$3]) +]) + +AC_DEFUN([CC_ATTRIBUTE_NONNULL], [ + CC_CHECK_ATTRIBUTE( + [nonnull], [nonnull()], + [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_UNUSED], [ + CC_CHECK_ATTRIBUTE( + [unused], , + [void some_function(void *foo, __attribute__((unused)) void *bar);], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [ + CC_CHECK_ATTRIBUTE( + [sentinel], , + [void some_function(void *foo, ...) __attribute__((sentinel));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [ + CC_CHECK_ATTRIBUTE( + [deprecated], , + [void some_function(void *foo, ...) __attribute__((deprecated));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_ALIAS], [ + CC_CHECK_ATTRIBUTE( + [alias], [weak, alias], + [void other_function(void *foo) { } + void some_function(void *foo) __attribute__((weak, alias("other_function")));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_MALLOC], [ + CC_CHECK_ATTRIBUTE( + [malloc], , + [void * __attribute__((malloc)) my_alloc(int n);], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_PACKED], [ + CC_CHECK_ATTRIBUTE( + [packed], , + [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_CONST], [ + CC_CHECK_ATTRIBUTE( + [const], , + [int __attribute__((const)) twopow(int n) { return 1 << n; } ], + [$1], [$2]) +]) + +AC_DEFUN([CC_FLAG_VISIBILITY], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([if $CC supports -fvisibility=hidden], + [cc_cv_flag_visibility], + [cc_flag_visibility_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden], + cc_cv_flag_visibility='yes', + cc_cv_flag_visibility='no') + CFLAGS="$cc_flag_visibility_save_CFLAGS"]) + + AS_IF([test "x$cc_cv_flag_visibility" = "xyes"], + [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1, + [Define this if the compiler supports the -fvisibility flag]) + $1], + [$2]) +]) + +AC_DEFUN([CC_FUNC_EXPECT], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([if compiler has __builtin_expect function], + [cc_cv_func_expect], + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + AC_COMPILE_IFELSE([AC_LANG_SOURCE( + [int some_function() { + int a = 3; + return (int)__builtin_expect(a, 3); + }])], + [cc_cv_func_expect=yes], + [cc_cv_func_expect=no]) + CFLAGS="$ac_save_CFLAGS" + ]) + + AS_IF([test "x$cc_cv_func_expect" = "xyes"], + [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1, + [Define this if the compiler supports __builtin_expect() function]) + $1], + [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported], + [cc_cv_attribute_aligned], + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + for cc_attribute_align_try in 64 32 16 8 4 2; do + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + int main() { + static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0; + return c; + }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break]) + done + CFLAGS="$ac_save_CFLAGS" + ]) + + if test "x$cc_cv_attribute_aligned" != "x"; then + AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned], + [Define the highest alignment supported]) + fi +]) diff --git a/peripheral_manager/src/src/button.c b/peripheral_manager/src/src/button.c new file mode 100644 index 000000000..97a931475 --- /dev/null +++ b/peripheral_manager/src/src/button.c @@ -0,0 +1,357 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ +#include "config.h" +#include +#include +#include "log.h" +#include "button.h" +#include "led.h" +#include "touch_sx9512.h" + +/* used to map in the driver buttons to a function button */ +struct button_drv_list { + struct list_head list; + struct timespec pressed_time; + struct button_drv *drv; +}; + +/**/ +struct function_button { + struct list_head list; + char *name; + char *hotplug; + int minpress; + int longpress; /* negative value means valid if mintime < time < abs(longpress ) */ + /* positive value means valid if time > longpreass */ + /* zero value means valid if time > mintime */ + struct list_head drv_list; /* list of all driver button that is needed to activate this button function */ +}; + +/* PUT every button from drivers into a list */ +struct drv_button_list{ + struct list_head list; + struct button_drv *drv; +}; + +/* list of all driver buttons added by drivers. */ +static LIST_HEAD(drv_buttons_list); + +/* list containing all function buttons read from config file */ +static LIST_HEAD(buttons); + +static struct button_drv *get_drv_button(char *name); +//static struct function_button *get_button(char *name); + +void button_add( struct button_drv *drv) +{ + struct drv_button_list *drv_node = malloc(sizeof(struct drv_button_list)); + + DBG(1,"called with led name [%s]", drv->name); + drv_node->drv = drv; + + list_add(&drv_node->list, &drv_buttons_list); +} + +static struct button_drv *get_drv_button(char *name) +{ + struct list_head *i; + list_for_each(i, &drv_buttons_list) { + struct drv_button_list *node = list_entry(i, struct drv_button_list, list); + if (! strcmp(node->drv->name, name)) + return node->drv; + } + return NULL; +} + +#if 0 +static struct function_button *get_button(char *name) +{ + struct list_head *i; + list_for_each(i, &buttons) { + struct function_button *node = list_entry(i, struct function_button, list); + if (! strcmp(node->name, name)) + return node; + } + return NULL; +} +#endif + +static void dump_drv_list(void) +{ + struct list_head *i; + list_for_each(i, &drv_buttons_list) { + struct drv_button_list *node = list_entry(i, struct drv_button_list, list); + DBG(1,"button name = [%s]",node->drv->name); + } +} + +static void dump_buttons_list(void) +{ + struct list_head *i; + list_for_each(i, &buttons) { + struct function_button *node = list_entry(i, struct function_button, list); + DBG(1,"button name = [%s]",node->name); + { + struct list_head *j; + list_for_each(j, &node->drv_list) { + struct button_drv_list *drv_node = list_entry(j, struct button_drv_list, list); + if(drv_node->drv != NULL) + DBG(1,"%13s drv button name = [%s]","",drv_node->drv->name); + } + DBG(1,"%13s minpress = %d","",node->minpress); + DBG(1,"%13s longpress = %d","",node->longpress); + } + } +} + +static int timer_started(struct button_drv_list *button_drv) +{ + if (button_drv->pressed_time.tv_sec == 0 ) + if (button_drv->pressed_time.tv_nsec == 0 ) + return 0; + return 1; +} + +static void timer_start(struct button_drv_list *button_drv) +{ + clock_gettime(CLOCK_MONOTONIC, &button_drv->pressed_time); +} + +static void timer_stop(struct button_drv_list *button_drv) +{ + button_drv->pressed_time.tv_sec = 0; + button_drv->pressed_time.tv_nsec = 0; +} + +static int timer_valid(struct button_drv_list *button_drv, int mtimeout, int longpress) +{ + struct timespec now; + int sec; + int nsec; + + if (timer_started(button_drv)) { + clock_gettime(CLOCK_MONOTONIC, &now); + sec = now.tv_sec - button_drv->pressed_time.tv_sec; + nsec = now.tv_nsec - button_drv->pressed_time.tv_nsec; + if ( mtimeout < (sec*1000 + nsec/1000000)) { + if (longpress == 0) + return 1; + + if (longpress < 0) { + longpress = -1 * longpress; + if ( longpress > (sec*1000 + nsec/1000000)) { + return 1; + + } else { + return 0; + } + } + + if ( longpress < (sec*1000 + nsec/1000000)) { + return 1; + } + } + } + return 0; +} + +#define BUTTON_TIMEOUT 100 +static void button_handler(struct uloop_timeout *timeout); +static struct uloop_timeout button_inform_timer = { .cb = button_handler }; + +static void button_handler(struct uloop_timeout *timeout) +{ + struct list_head *i; +// DBG(1, ""); + +#ifdef HAVE_BOARD_H + + /* sx9512 driver needs to read out all buttons at once */ + /* so call it once at beginning of scanning inputs */ + sx9512_check(); +#endif + + /* clean out indicator status, set by any valid press again if we find it */ + led_pressindicator_clear(); + + list_for_each(i, &buttons) { + struct list_head *j; + struct function_button *node = list_entry(i, struct function_button, list); + + list_for_each(j, &node->drv_list) { + struct button_drv_list *drv_node = list_entry(j, struct button_drv_list, list); + if (drv_node->drv) { + button_state_t st = drv_node->drv->func->get_state(drv_node->drv); + + if (st == PRESSED ) { + if (! timer_started(drv_node)) { + timer_start(drv_node); + DBG(1, " %s pressed", drv_node->drv->name); + } + + if ( timer_valid(drv_node, node->minpress, 0)) { + led_pressindicator_set(); + } + } + + if (st == RELEASED ) { + if (timer_started(drv_node)) { + DBG(1, " %s released", drv_node->drv->name); + + if ( timer_valid(drv_node, node->minpress, node->longpress) ) { + char str[512]; + DBG(1, "send key %s [%s]to system", node->name, node->hotplug); + snprintf(str, + 512, + "ACTION=register INTERFACE=%s /sbin/hotplug-call button &", + node->hotplug); + system(str); + syslog(LOG_INFO, "%s",str); + } else { +// DBG(1, " %s not valid", drv_node->drv->name); + } + } + timer_stop(drv_node); + } +// DBG(1, " %s state = %d", drv_node->drv->name,st); + } + } + } + uloop_timeout_set(&button_inform_timer, BUTTON_TIMEOUT); +} + +/* in order to support long press there is a need to go over every function button + and find any driver button that is part of a longpress function. + if found then the longpress time for that button needs to be filled in (but negative) + on any other function button that has the same driver button. This to prevent two + function buttons to trigger on one driver button release. +*/ + +/* Find functions that use driver (drv) that has a zero longpress time and set it to time */ +static void longpress_set(int max_time,struct button_drv *drv) { + struct list_head *i; + list_for_each(i, &buttons) { + struct function_button *node = list_entry(i, struct function_button, list); + struct list_head *j; + list_for_each(j, &node->drv_list) { + struct button_drv_list *drv_node = list_entry(j, struct button_drv_list, list); + if(drv_node->drv == drv){ + if (node->longpress == 0) { + node->longpress = max_time; + } + } + } + } +} + + +/* find any use of longpress and set all other to negative longpress time to indicate min max time + for a valid press +*/ +static void longpress_find(void) { + struct list_head *i; + list_for_each(i, &buttons) { + struct function_button *node = list_entry(i, struct function_button, list); + struct list_head *j; + list_for_each(j, &node->drv_list) { + struct button_drv_list *drv_node = list_entry(j, struct button_drv_list, list); + if(drv_node->drv != NULL){ + if (node->longpress > 0) { + DBG(1,"%13s drv button name = [%s]","",drv_node->drv->name); + DBG(1,"%13s longpress = %d","",node->longpress); + longpress_set(node->longpress * -1, drv_node->drv); + } + } + } + } +} + +void button_init( struct server_ctx *s_ctx) +{ + struct ucilist *node; + LIST_HEAD(buttonnames); + int default_minpress = 0; + char *s; + + /* read out default global options */ + s = ucix_get_option(s_ctx->uci_ctx, "hw" , "button_map", "minpress"); + DBG(1, "default minpress = [%s]", s); + if (s){ + default_minpress = strtol(s,0,0); + } + + /* read function buttons from section button_map */ + ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"button_map", "buttonnames", &buttonnames); + list_for_each_entry(node, &buttonnames, list) { + struct function_button *function; + +// DBG(1, "value = [%s]",node->val); + + function = malloc(sizeof(struct function_button)); + memset(function,0,sizeof(struct function_button)); + function->name = node->val; + + /* read out minpress */ + s = ucix_get_option(s_ctx->uci_ctx, "hw" , function->name, "minpress"); + DBG(1, "minpress = [%s]", s); + if (s){ + function->minpress = strtol(s,0,0); + }else + function->minpress = default_minpress; + + /* read out long_press */ + s = ucix_get_option(s_ctx->uci_ctx, "hw" , function->name, "longpress"); + DBG(1, "longpress = [%s]", s); + if (s){ + function->longpress = strtol(s,0,0); + } + + /* read out hotplug option */ + s = ucix_get_option(s_ctx->uci_ctx, "hw" , function->name, "hotplug"); + DBG(1, "hotplug = [%s]", s); + if (s){ + function->hotplug = s; + } + + INIT_LIST_HEAD(&function->drv_list); + + { + struct ucilist *drv_node; + LIST_HEAD(head); + int num = 0; + + /* read out all driver buttons that needs to be pressed for this button function. */ + ucix_get_option_list(s_ctx->uci_ctx, "hw" ,function->name, "button", &head); + + list_for_each_entry(drv_node, &head, list) { + struct button_drv_list *new_button; + + num++; + DBG(1,"function %s -> drv button %s", function->name, drv_node->val); + + new_button = malloc(sizeof(struct button_drv_list)); + memset(new_button,0,sizeof(struct button_drv_list)); + + new_button->drv = get_drv_button(drv_node->val); + + if(new_button->drv == NULL){ + syslog(LOG_WARNING, "%s wanted drv button [%s] but it can't be found. check spelling.", + function->name, + drv_node->val); + } + + list_add( &new_button->list, &function->drv_list); + } + if (num == 0 ) + syslog(LOG_WARNING, "Function %s did not have any mapping to a driver button", function->name); + } + + list_add(&function->list, &buttons); + } + + uloop_timeout_set(&button_inform_timer, BUTTON_TIMEOUT); + + longpress_find(); + dump_drv_list(); + dump_buttons_list(); +} + diff --git a/peripheral_manager/src/src/button.h b/peripheral_manager/src/src/button.h new file mode 100644 index 000000000..7edc34fb6 --- /dev/null +++ b/peripheral_manager/src/src/button.h @@ -0,0 +1,25 @@ +#ifndef BUTTON_H +#define BUTTON_H +#include "server.h" + +typedef enum { + RELEASED, + PRESSED, +} button_state_t; + +struct button_drv; + +struct button_drv_func { + button_state_t (*get_state)(struct button_drv *); /* Get led state, on,off,flash ... */ +}; + +struct button_drv { + const char *name; /* name, set in the confg file,has to be uniq */ + void *priv; /* for use by the driver */ + struct button_drv_func *func; /* function pointers for reading the button */ +}; + +void button_add( struct button_drv *drv); +void button_init( struct server_ctx *s_ctx); + +#endif /* BUTTON_H */ diff --git a/ledmngr/src/catv.c b/peripheral_manager/src/src/catv.c similarity index 98% rename from ledmngr/src/catv.c rename to peripheral_manager/src/src/catv.c index 5d86dc0ab..cb7a48a91 100644 --- a/ledmngr/src/catv.c +++ b/peripheral_manager/src/src/catv.c @@ -36,7 +36,7 @@ static struct catv_handler *pcatv; static int catv_get_type(struct blob_buf *b) { int type; - char *s; + const char *s; type = i2c_smbus_read_byte_data(pcatv->i2c_a0,32); @@ -270,7 +270,7 @@ static int catv_get_serial_method(struct ubus_context *ubus_ctx, struct ubus_obj static int catv_get_interface(struct blob_buf *b) { int type; - char *s; + const char *s; type = i2c_smbus_read_byte_data(pcatv->i2c_a0,81); @@ -315,7 +315,7 @@ static int catv_get_interface_method(struct ubus_context *ubus_ctx, struct ubus_ static int catv_get_bandwidth(struct blob_buf *b) { int type; - char *s; + const char *s; type = i2c_smbus_read_byte_data(pcatv->i2c_a0,82); @@ -1200,7 +1200,7 @@ static int catv_save_method(struct ubus_context *ubus_ctx, struct ubus_object *o ucix_add_option(pcatv->ctx, "catv", "catv", "filter", "3"); - ucix_save(pcatv->ctx); + ucix_save(pcatv->ctx,"/etc/config"); ucix_commit(pcatv->ctx, "catv"); blobmsg_add_string(&b, "Saved", "/etc/config/catv"); @@ -1308,13 +1308,13 @@ static void catv_config_open(struct catv_handler *h) /* open config file */ again: - h->ctx = ucix_init_path("/etc/config", "catv"); + h->ctx = ucix_init_path("/etc/config", "catv", 0); if (NULL == h->ctx) { int fd; syslog(LOG_INFO,"CATV config file not found /etc/config/catv\n"); - fd = open("/etc/config/catv",O_RDWR | O_CREAT | O_TRUNC); + fd = open("/etc/config/catv",O_RDWR | O_CREAT | O_TRUNC, 0644); close(fd); if (loop++ < 10) goto again; @@ -1336,7 +1336,7 @@ again: ucix_add_section(h->ctx,"catv","catv", "service"); ucix_add_option(h->ctx,"catv", "catv", "enable","no"); ucix_add_option(h->ctx,"catv", "catv", "filter","3"); - ucix_save(h->ctx); + ucix_save(h->ctx,"/etc/config"); ucix_commit(h->ctx,"catv"); goto again; } @@ -1352,7 +1352,7 @@ again: } -struct catv_handler * catv_init(struct uci_context *uci_ctx, char *i2c_bus,int a0_addr,int a2_addr) +struct catv_handler * catv_init(struct uci_context *uci_ctx, const char *i2c_bus,int a0_addr,int a2_addr) { struct catv_handler *h; const char *p; diff --git a/ledmngr/src/catv.h b/peripheral_manager/src/src/catv.h similarity index 65% rename from ledmngr/src/catv.h rename to peripheral_manager/src/src/catv.h index 5c536beed..63ce7b617 100644 --- a/ledmngr/src/catv.h +++ b/peripheral_manager/src/src/catv.h @@ -5,7 +5,7 @@ struct catv_handler; -struct catv_handler * catv_init(struct uci_context *uci_ctx, char * i2c_bus, int i2c_addr_a0,int i2c_addr_a2); +struct catv_handler * catv_init(struct uci_context *uci_ctx, const char * i2c_bus, int i2c_addr_a0,int i2c_addr_a2); void catv_destroy(struct catv_handler *h); int catv_ubus_populate(struct catv_handler *h, struct ubus_context *ubus_ctx); diff --git a/peripheral_manager/src/src/gpio.c b/peripheral_manager/src/src/gpio.c new file mode 100644 index 000000000..cfcb10b11 --- /dev/null +++ b/peripheral_manager/src/src/gpio.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include "gpio.h" +#include "log.h" + +static int brcmboard = -1; + +void gpio_open_ioctl( void ) { + + if (brcmboard == -1){ + brcmboard = open("/dev/brcmboard", O_RDWR); + if ( brcmboard == -1 ) { + DBG(1,"failed to open: /dev/brcmboard\n"); + return; + } + DBG(1, "fd %d allocated\n", brcmboard); + } + + return; +} + +int board_ioctl(int ioctl_id, int action, int hex, char* string_buf, int string_buf_len, int offset) { + BOARD_IOCTL_PARMS IoctlParms = {0}; + + IoctlParms.string = string_buf; + IoctlParms.strLen = string_buf_len; + IoctlParms.offset = offset; + IoctlParms.action = action; + IoctlParms.buf = (char*)""; + + if ( ioctl(brcmboard, ioctl_id, &IoctlParms) < 0 ) { + syslog(LOG_INFO, "ioctl: %d failed", ioctl_id); + exit(1); + } + return IoctlParms.result; +} diff --git a/peripheral_manager/src/src/gpio.h b/peripheral_manager/src/src/gpio.h new file mode 100644 index 000000000..45b55b4d1 --- /dev/null +++ b/peripheral_manager/src/src/gpio.h @@ -0,0 +1,11 @@ +#ifndef GPIO_H +#define GPIO_H + +#include +#include +#include + +void gpio_open_ioctl(void); +int board_ioctl(int ioctl_id, int action, int hex, char* string_buf, int string_buf_len, int offset); + +#endif /* GPIO_H */ diff --git a/peripheral_manager/src/src/gpio_button.c b/peripheral_manager/src/src/gpio_button.c new file mode 100644 index 000000000..792fb95f6 --- /dev/null +++ b/peripheral_manager/src/src/gpio_button.c @@ -0,0 +1,80 @@ +#include +#include +#include "button.h" +#include "log.h" +#include "server.h" +#include "gpio.h" +#include + +void gpio_button_init(struct server_ctx *s_ctx); + +struct gpio_data { + int addr; + int active; + int state; + struct button_drv button; +}; + +static button_state_t gpio_get_state(struct button_drv *drv) +{ +// DBG(1, "state for %s", drv->name); + struct gpio_data *p = (struct gpio_data *)drv->priv; + int value; + + value = board_ioctl( BOARD_IOCTL_GET_GPIO, 0, 0, NULL, p->addr, 0); + + if(p->active) + p->state = value ? PRESSED : RELEASED; + else + p->state = value ? RELEASED : PRESSED; + + return p->state; +} + +static struct button_drv_func func = { + .get_state = gpio_get_state, +}; + +void gpio_button_init(struct server_ctx *s_ctx) { + struct ucilist *node; + LIST_HEAD(buttons); + + DBG(1, ""); + + ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"gpio_buttons", "buttons", &buttons); + list_for_each_entry(node, &buttons, list) { + struct gpio_data *data; + const char *s; + + DBG(1, "value = [%s]",node->val); + + data = malloc(sizeof(struct gpio_data)); + memset(data,0,sizeof(struct gpio_data)); + + data->button.name = node->val; + + s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->button.name, "addr"); + DBG(1, "addr = [%s]", s); + if (s){ + data->addr = strtol(s,0,0); + } + + s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->button.name, "active"); + data->active = -1; + if (s){ + if (!strncasecmp("hi",s,2)) + data->active = 1; + else if (!strncasecmp("low",s,3)) + data->active = 0; + + } + DBG(1, "active = %d", data->active); + + data->button.func = &func; + data->button.priv = data; + + button_add(&data->button); + } + + gpio_open_ioctl(); +} diff --git a/peripheral_manager/src/src/gpio_led.c b/peripheral_manager/src/src/gpio_led.c new file mode 100644 index 000000000..31d65f236 --- /dev/null +++ b/peripheral_manager/src/src/gpio_led.c @@ -0,0 +1,169 @@ +#include +#include +#include +#include +#include +#include +#include +#include "led.h" +#include "log.h" +#include "server.h" +#include "gpio.h" + + +void gpio_led_init(struct server_ctx *s_ctx); + +typedef enum { + UNKNOWN, + LOW, + HI, +} active_t; + +typedef enum { + MODE_UNKNOWN, + DIRECT, + SHIFTREG2, + SHIFTREG3, +} gpio_mode_t; + +struct gpio_data { + int addr; + active_t active; + int state; + gpio_mode_t mode; + struct led_drv led; +}; + +#define SR_MAX 16 +static int shift_register_state[SR_MAX]; + +static void shift_register3_set(int address, int bit_val) { + int i; + + if (address>=SR_MAX-1) { + DBG(1,"address index %d too large\n", address); + return; + } + + // Update internal register copy + shift_register_state[address] = bit_val; + + // pull down shift register load (load gpio 23) + board_ioctl(BOARD_IOCTL_SET_GPIO, 0, 0, NULL, 23, 0); + + // clock in bits + for (i=0 ; ipriv; + int bit_val = 0; + + if (state == OFF) { + if (p->active == HI) + bit_val = 0; + else if (p->active == LOW) + bit_val = 1; + + }else if (state == ON) { + if (p->active == HI) + bit_val = 1; + else if (p->active == LOW) + bit_val = 0; + } + + p->state = state; + + switch (p->mode) { + case DIRECT : + board_ioctl( BOARD_IOCTL_SET_GPIO, 0, 0, NULL, p->addr, bit_val); + break; + case SHIFTREG2: + board_ioctl( BOARD_IOCTL_LED_CTRL, 0, 0, NULL, p->addr, bit_val); + break; + case SHIFTREG3: + shift_register3_set(p->addr, bit_val); + break; + default: + DBG(1,"access mode not supported [%d]", p->mode); + } + + return p->state; +} + +static led_state_t gpio_get_state(struct led_drv *drv) +{ + struct gpio_data *p = (struct gpio_data *)drv->priv; + DBG(1, "state for %s", drv->name); + + return p->state; +} + +static struct led_drv_func func = { + .set_state = gpio_set_state, + .get_state = gpio_get_state, +}; + +void gpio_led_init(struct server_ctx *s_ctx) { + + LIST_HEAD(leds); + struct ucilist *node; + + DBG(1, ""); + + ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"gpio_leds", "leds", &leds); + list_for_each_entry(node,&leds,list){ + struct gpio_data *data; + const char *s; + + DBG(1, "value = [%s]",node->val); + + data = malloc(sizeof(struct gpio_data)); + memset(data,0,sizeof(struct gpio_data)); + + data->led.name = node->val; + + s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "addr"); + DBG(1, "addr = [%s]", s); + if (s) { + data->addr = strtol(s,0,0); + } + + s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "mode"); + DBG(1, "mode = [%s]", s); + if (s) { + + if (!strncasecmp("direct",s,3)) + data->mode = DIRECT; + else if (!strncasecmp("sr",s,5)) + data->mode = SHIFTREG2; + else if (!strncasecmp("csr",s,4)) + data->mode = SHIFTREG3; + } + + s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "active"); + DBG(1, "active = [%s]", s); + if (s) { + data->active = UNKNOWN; + if (!strncasecmp("hi",s,3)) + data->active = HI; + if (!strncasecmp("low",s,3)) + data->active = LOW; + } + data->led.func = &func; + data->led.priv = data; + led_add(&data->led); + } + gpio_open_ioctl(); +} diff --git a/peripheral_manager/src/src/i2c.c b/peripheral_manager/src/src/i2c.c new file mode 100644 index 000000000..600d8000b --- /dev/null +++ b/peripheral_manager/src/src/i2c.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "smbus.h" +#include +#include + +#include "i2c.h" +#include "log.h" + +void dump_i2c(int fd,int start,int stop) +{ + int i; + int res; + + for (i=start ; i < stop; i++) { + res = i2c_smbus_read_byte_data(fd,i); + if (res < 0){perror("i2c error\n");} + DBG(1,"/dev/i2c-0 READ %d = 0x%02x\n",i,(unsigned char)res); + } +} + +int i2c_open_dev (const char *bus, int addr, unsigned long needed) +{ + int fd = open(bus, O_RDWR); + if (fd < 0) { + syslog(LOG_INFO,"%s: could not open /dev/i2c-0\n",__func__); + return -1; + } + if (ioctl(fd, I2C_SLAVE, addr) < 0) { + syslog(LOG_INFO,"%s: could not set address %x for i2c chip\n", + __func__, addr); + error: + close (fd); + return -1; + } + if (needed) { + unsigned long funcs; + if (ioctl(fd, I2C_FUNCS, &funcs) < 0) { + syslog(LOG_INFO,"%s: could not get I2C_FUNCS\n",__func__); + goto error; + } + if ( (funcs & needed) != needed) { + syslog(LOG_INFO,"%s: lacking I2C capabilities, have %lx, need %lx\n", + __func__, funcs, needed); + goto error; + } + } + return fd; +} + diff --git a/ledmngr/src/i2c.h b/peripheral_manager/src/src/i2c.h similarity index 98% rename from ledmngr/src/i2c.h rename to peripheral_manager/src/src/i2c.h index 1c5abfb96..81a3c8e73 100644 --- a/ledmngr/src/i2c.h +++ b/peripheral_manager/src/src/i2c.h @@ -1,4 +1,5 @@ #ifndef I2C_H +#define I2C_H struct i2c_reg_tab { char addr; diff --git a/peripheral_manager/src/src/led.c b/peripheral_manager/src/src/led.c new file mode 100644 index 000000000..50d55714e --- /dev/null +++ b/peripheral_manager/src/src/led.c @@ -0,0 +1,568 @@ +#include +#include "log.h" +#include "led.h" + +static struct blob_buf bblob; + +typedef enum { + LED_OFF, + LED_OK, + LED_NOTICE, + LED_ALERT, + LED_ERROR, + LED_CUSTOM, + LED_ACTION_MAX, +} led_action_t; + +typedef enum { + LEDS_NORMAL, + LEDS_PROXIMITY, + LEDS_SILENT, + LEDS_INFO, + LEDS_TEST, + LEDS_PROD, + LEDS_RESET, + LEDS_ALLON, + LEDS_ALLOFF, + LEDS_MAX, +} leds_state_t; + +/* Names for led_action_t */ +static const char * const fn_actions[LED_ACTION_MAX] = +{ "off", "ok", "notice", "alert", "error", "custom"}; + +#define LED_FUNCTIONS 17 +static const char* const led_functions[LED_FUNCTIONS] = +{ "dsl", "wifi", "wps", "lan", + "status", "dect", "tv", "usb", + "wan", "internet", "voice1", "voice2", + "eco", "gbe", "ext", "wan_phy_speed", + "wan_phy_link" }; + +/* Names for led_state_t */ +static const char* const led_states[LED_STATES_MAX] = +{ "off", "on", "flash_slow", "flash_fast","breading", "fadeon", "fadeoff" }; + +/* Names for leds_state_t */ +static const char* const leds_states[LEDS_MAX] = +{ "normal", "proximity", "silent", "info", "test", "production", "reset", "allon" , "alloff"}; + +/* lowest level, contain states, timers,pointer to driver for a single physical led.*/ +struct led { + struct list_head list; + led_state_t state; /* state that this led should have, set from the config file */ + struct led_drv *drv; +}; + +/*middle layer contains lists of leds /buttons/... that should be set to a specific state */ +struct function_action { + const char *name; /* If name is set this led action is in use by the board. */ + struct list_head led_list; + struct list_head button_list; +}; + +/* main struct for the function leds.*/ +struct function_led { + const char *name; /* If name is set this led function is in use by the board. */ + led_action_t state; /* state of the function led. contain what action is currently set */ + int press_indicator; /* record if this is part of press indictor */ + struct function_action actions[LED_ACTION_MAX]; +}; + +struct function_led leds[LED_FUNCTIONS]; + +static leds_state_t global_state; /* global state for the leds,overrids individual states */ +static leds_state_t press_state; /* global state for the press indicator */ + +int get_index_by_name(const char *const*array, int max, const char *name); +struct led_drv *get_drv_led(char *name); +static void dump_drv_list(void); +static void dump_led(void); +static void all_leds_off(void); +static void all_leds_on(void); +static void all_leds(led_state_t state); + +/* we find out the index for a match in an array of char pointers containing max number of pointers */ +int get_index_by_name(const char *const*array, int max, const char *name) +{ + int i; + for (i=0; i < max ; i++ ){ + if (!strcasecmp(name, array[i])) + return i; + } + return -1; +} + +/* PUT every led from drivers into a list */ +struct drv_led_list{ + struct list_head list; + struct led_drv *drv; +}; +LIST_HEAD(drv_leds_list); + +void led_add( struct led_drv *drv) +{ + struct drv_led_list *drv_node = malloc(sizeof(struct drv_led_list)); + + DBG(1,"called with led name [%s]", drv->name); + drv_node->drv = drv; + + list_add(&drv_node->list, &drv_leds_list); +} + +static void all_leds(led_state_t state) { + struct drv_led_list *node; + DBG(1, "set to state %d",state); + + list_for_each_entry(node, &drv_leds_list, list) { + node->drv->func->set_state( node->drv, state); + } +} + +static void all_leds_off(void) { + all_leds(OFF); +} + +static void all_leds_on(void) { + all_leds(ON); +} + +#define TEST_TIMEOUT 250 +static void test_handler(struct uloop_timeout *timeout); +static struct uloop_timeout test_inform_timer = { .cb = test_handler }; + +static void test_handler(struct uloop_timeout *timeout) { + + static int cnt = 0; + static led_state_t state = OFF; + + static struct drv_led_list *led; + DBG(1,"cnt = %d state %d",cnt,state); + + /* flash all leads 2 times.*/ + if ( cnt < 4) { + cnt++; + if (state == OFF){ + all_leds_on(); + state = ON; + }else{ + all_leds_off(); + state = OFF; + } + goto done; + } + + if (global_state == LEDS_RESET){ + cnt = 0; + goto done; + } + + /* cycle through every led once */ + if (cnt == 4 ) { + cnt++; + led = list_first_entry(&drv_leds_list, struct drv_led_list, list ); + } + if (cnt == 5 ) { + if (state == OFF){ + led->drv->func->set_state(led->drv, ON); + state = ON; + }else{ + led->drv->func->set_state(led->drv, OFF); + /* was this the last led ? if so stop */ + if ( list_is_last(&led->list, &drv_leds_list) ){ + cnt = 0; + state = OFF; + goto done; + }else{ /* nope more leds in list. get next and turn it on */ + led = (struct drv_led_list *)led->list.next; + led->drv->func->set_state(led->drv, ON); + state = ON; + } + } + } +done: + + if (global_state == LEDS_TEST || global_state == LEDS_RESET) + uloop_timeout_set(&test_inform_timer, TEST_TIMEOUT); + else{ + cnt = 0; + state = OFF; + } +} + +/* go over the driver list for any led name that matches name and returna pointer to driver. */ +struct led_drv *get_drv_led(char *name) +{ + struct list_head *i; + list_for_each(i, &drv_leds_list) { + struct drv_led_list *node = list_entry(i, struct drv_led_list, list); + if (!strcmp(node->drv->name, name)) + return node->drv; + } + return NULL; +} + +static void dump_drv_list(void) +{ + struct list_head *i; + list_for_each(i, &drv_leds_list) { + struct drv_led_list *node = list_entry(i, struct drv_led_list, list); + DBG(1,"led name = [%s]",node->drv->name); + } +} + +static void dump_led(void) +{ + int i,j; + + for (i = 0; i < LED_FUNCTIONS ; i++) { + for (j = 0 ; j < LED_ACTION_MAX; j++ ) { + if ( leds[i].actions[j].name != NULL ) { + struct led *led; + list_for_each_entry(led, &leds[i].actions[j].led_list, list) { + DBG(1,"%-15s %-8s %-15s %-10s", + leds[i].name, + leds[i].actions[j].name, + led->drv->name, + led_states[led->state]); +}}}}} + +static void set_function_led(const char* fn_name, const char* action) { + int led_idx = get_index_by_name(led_functions, LED_FUNCTIONS , fn_name); + int act_idx = get_index_by_name(fn_actions , LED_ACTION_MAX, action ); + + if(led_idx == -1) { + syslog(LOG_WARNING, "called over ubus with non valid led name [%s]", fn_name); + return; + } + if(act_idx == -1) { + syslog(LOG_WARNING, "called over ubus with non valid action [%s] for led [%s]", action, fn_name); + return; + } + + leds[led_idx].state = act_idx; + + if ( leds[led_idx].actions[act_idx].name != NULL ) { + struct led *led; + list_for_each_entry(led, &leds[led_idx].actions[act_idx].led_list, list) { + if (led->drv){ + led->drv->func->set_state(led->drv, led->state); + } + } + }else + syslog(LOG_WARNING, "led set on [%s] has no valid [%s] handler registered.", fn_name, action); +} + +enum { + LED_STATE, + __LED_MAX +}; + +static const struct blobmsg_policy led_policy[] = { + [LED_STATE] = { .name = "state", .type = BLOBMSG_TYPE_STRING }, +}; + +static int led_set_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_attr *tb[__LED_MAX]; + char* state; + + blobmsg_parse(led_policy, ARRAY_SIZE(led_policy), tb, blob_data(msg), blob_len(msg)); + + if (tb[LED_STATE]) { + char *fn_name = strchr(obj->name, '.') + 1; + state = blobmsg_data(tb[LED_STATE]); + DBG(1,"set led [%s]->[%s]", fn_name, state); +// syslog(LOG_INFO, "Led %s method: %s state %s", fn_name, method, state); + set_function_led(fn_name, state); + }else + DBG(1,"(%s) not implemented",method); + return 0; +} + +static int led_status_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + char *fn_name = strchr(obj->name, '.') + 1; + int led_idx = get_index_by_name(led_functions, LED_FUNCTIONS , fn_name); + DBG(1,"for led %s",leds[led_idx].name); + + blob_buf_init (&bblob, 0); + blobmsg_add_string(&bblob, "state",fn_actions[leds[led_idx].state]); + ubus_send_reply(ubus_ctx, req, bblob.head); + + return 0; +} + +static int leds_set_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_attr *tb[__LED_MAX]; + + blobmsg_parse(led_policy, ARRAY_SIZE(led_policy), tb, blob_data(msg), blob_len(msg)); + + if (tb[LED_STATE]) { + char* state; + int state_idx; + + state = blobmsg_data(tb[LED_STATE]); + state_idx = get_index_by_name(leds_states, LEDS_MAX , state); + + if (state_idx == -1) { + syslog(LOG_WARNING, "leds_set_method: Unknown state %s.", state); + return 0; + } + + global_state = state_idx; + + if (global_state == LEDS_INFO) { + all_leds_off(); + } + + if (global_state == LEDS_PROD) { + all_leds_off(); + } + + if (global_state == LEDS_TEST || global_state == LEDS_RESET) { + all_leds_off(); + uloop_timeout_set(&test_inform_timer, TEST_TIMEOUT); + } + if (global_state == LEDS_ALLON) { + all_leds_on(); + } + if (global_state == LEDS_ALLOFF) { + all_leds_off(); + } + + DBG(1,"led global state set to [%s] wanted [%s]", leds_states[global_state], state); + }else + syslog(LOG_WARNING, "Unknown attribute [%s]", blob_data(msg)); + + return 0; +} + +static int leds_status_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + + blob_buf_init (&bblob, 0); + blobmsg_add_string(&bblob, "state", leds_states[global_state]); + DBG(1,"leds global state is [%s]",leds_states[global_state]); + ubus_send_reply(ubus_ctx, req, bblob.head); + return 0; +} + +static const struct ubus_method led_methods[] = { + UBUS_METHOD("set", led_set_method, led_policy), + { .name = "status", .handler = led_status_method }, +}; + +static struct ubus_object_type led_object_type = + UBUS_OBJECT_TYPE("led", led_methods); + + + +static const struct ubus_method leds_methods[] = { + UBUS_METHOD("set", leds_set_method, led_policy), + { .name = "status", .handler = leds_status_method }, +// { .name = "proximity", .handler = leds_proximity_method }, +}; + +static struct ubus_object_type leds_object_type = + UBUS_OBJECT_TYPE("leds", leds_methods); + +#define LED_OBJECTS (LED_FUNCTIONS + 1) +static struct ubus_object led_objects[LED_OBJECTS] = { + { .name = "leds", .type = &leds_object_type, .methods = leds_methods, .n_methods = ARRAY_SIZE(leds_methods), }, + { .name = "led.dsl", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.wifi", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.wps", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.lan", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.status", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.dect", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.tv", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.usb", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.wan", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.internet", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.voice1", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.voice2", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.eco", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.gbe", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.ext", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.wan_phy_speed", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, + { .name = "led.wan_phy_link", .type = &led_object_type, .methods = led_methods, .n_methods = ARRAY_SIZE(led_methods), }, +}; + + +#define FLASH_TIMEOUT 250 +static void flash_handler(struct uloop_timeout *timeout); +static struct uloop_timeout flash_inform_timer = { .cb = flash_handler }; + +static void flash_handler(struct uloop_timeout *timeout) +{ + static int counter = 1; /* bit 0 is fast flash bit 2 is slow flash */ + int i; + led_state_t slow=OFF,fast=OFF; + counter++; + + if (counter & 1 ) + fast = ON; + if (counter & 4 ) + slow = ON; + + if (global_state == LEDS_NORMAL || + global_state == LEDS_INFO ) { + /* BUG we should check if the driver support flash in hardware and only do this on simple on/off leds */ + for (i = 0; i < LED_FUNCTIONS ; i++) { + struct led *led; + if (leds[i].press_indicator & press_state) { +// DBG(1,"INDICATE_PRESS on %s",leds[i].name); + list_for_each_entry(led, &leds[i].actions[leds[i].state].led_list, list) { + if (led->drv) + led->drv->func->set_state(led->drv, fast); + } + + /* normal operation, flash else reset state */ + } else { + led_action_t action_state = leds[i].state; + + /* in case of info mode suppress OK state. that is if OK -> turn it into OFF */ + if (global_state == LEDS_INFO) { + if (action_state == LED_OK) + action_state = LED_OFF; + } + + list_for_each_entry(led, &leds[i].actions[action_state].led_list, list) { + if (led->state == FLASH_FAST){ + if (led->drv) + led->drv->func->set_state(led->drv, fast); + }else if (led->state == FLASH_SLOW){ + if (led->drv) + led->drv->func->set_state(led->drv, slow); + }else{ + if (led->drv) + led->drv->func->set_state(led->drv, led->state); + } + } + } + } + } + uloop_timeout_set(&flash_inform_timer, FLASH_TIMEOUT); +} + +void led_pressindicator_set(void){ + press_state = 1; +} + +void led_pressindicator_clear(void){ + press_state = 0; +} + +void led_init( struct server_ctx *s_ctx) +{ + int i,j,ret; + + dump_drv_list(); + + /* register leds with ubus */ + + for (i=0 ; iubus_ctx, &led_objects[i]); + if (ret) + DBG(1,"Failed to add object: %s", ubus_strerror(ret)); + } + + /* we create a top list of led functions */ + /* that list contains a new list of actions */ + /* every action contains led actions lists */ + /* the led states is attached to the drv_leds lists */ + +// led_names = ucix_get_option(s_ctx->uci_ctx, "hw", "board", "lednames"); + + for (i = 0; i < LED_FUNCTIONS ; i++) { + for (j = 0 ; j < LED_ACTION_MAX; j++ ) { + char led_fn_name[256]; + char led_action[256]; + + LIST_HEAD(led_action_list); + struct ucilist *node; + + snprintf(led_fn_name, 256, "led_%s", led_functions[i]); + snprintf(led_action, 256, "led_action_%s", fn_actions[j]); + ucix_get_option_list( s_ctx->uci_ctx, "hw", led_fn_name, led_action , &led_action_list); + +// DBG(2,"ken: hw %s %s",led_fn_name, led_action); + + INIT_LIST_HEAD( &leds[i].actions[j].led_list ); + + if (!list_empty(&led_action_list)) { + + /* Found led with action, init structs */ + leds[i].name = led_functions[i]; + leds[i].state = LED_OFF; + + leds[i].actions[j].name = fn_actions[j]; + + /* fill in led actions */ + DBG(2,"%-15s has led actions -> ",led_fn_name); + list_for_each_entry(node, &led_action_list, list) { + char led_name[256],led_state[256]; + struct led *led; + struct led_drv *drv; + char *s = strdup(node->val); + led_name[0]=0; + led_state[0]=0; + + /* get pointer to low level led driver.*/ + *strchr(s,'=') = ' '; + sscanf(s, "%s %s", led_name, led_state); + drv = get_drv_led(led_name); + + if (drv) { + led = malloc(sizeof(struct led)); + led->drv = drv; + led->state = get_index_by_name(led_states, LED_STATES_MAX, led_state); + list_add(&led->list, &leds[i].actions[j].led_list); + }else { + syslog(LOG_ERR,"Config specified use of led name [%s]. But it's not registerd with a led driver.", led_name); + } + DBG(2, "%-35s%s","",node->val); + free(s); + } + + /* fill in button actions */ + + /* fill in xxx actions */ + } + } + } + { + struct ucilist *node; + /* read function buttons from section button_map */ + LIST_HEAD(press_indicator); + + /* read in generic configuration. press indicator list, dimm list default params..... */ + + ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"led_map", "press_indicator", &press_indicator); + list_for_each_entry(node, &press_indicator, list) { + char *s; + int ix; + s = node->val; + s +=4; /*remove 'led_' from string */ + DBG(1,"press indicator %s [%s]",node->val, s); + ix = get_index_by_name(led_functions,LED_FUNCTIONS, s); +// DBG(1,"press indicator %s [%s]->%d",node->val, s, ix); + leds[ix].press_indicator = 1; + } + } + uloop_timeout_set(&flash_inform_timer, FLASH_TIMEOUT); + + dump_led(); + all_leds_off(); +} + diff --git a/peripheral_manager/src/src/led.h b/peripheral_manager/src/src/led.h new file mode 100644 index 000000000..387c41bc6 --- /dev/null +++ b/peripheral_manager/src/src/led.h @@ -0,0 +1,47 @@ +#ifndef LED_H +#define LED_H + +#include "server.h" + +typedef enum { + OFF, + ON, + FLASH_SLOW, + FLASH_FAST, + BREADING, + FADEON, + FADEOFF, + LED_STATES_MAX, +} led_state_t; + +typedef enum { + NONE, + RED, + GREEN, + BLUE, + YELLOW, + WHITE, +} led_color_t; + +struct led_drv; + +struct led_drv_func{ + int (*set_state)(struct led_drv *, led_state_t); /* Set led state, on,off,flash ... */ + led_state_t (*get_state)(struct led_drv *); /* Get led state, on,off,flash ... */ + int (*set_color)(struct led_drv *, led_color_t); /* Set led color */ + led_color_t (*get_color)(struct led_drv *); /* Get led color */ +}; + +struct led_drv { + const char *name; /* name, set in the confg file,has to be uniq */ + void *priv; /* for use by the driver */ + struct led_drv_func *func; /* function pointers for controlling the led */ +}; + +void led_add( struct led_drv *); +void led_init(struct server_ctx *); + +void led_pressindicator_set(void); +void led_pressindicator_clear(void); + +#endif /* LED_H */ diff --git a/peripheral_manager/src/src/log.h b/peripheral_manager/src/src/log.h new file mode 100644 index 000000000..86f1b4a16 --- /dev/null +++ b/peripheral_manager/src/src/log.h @@ -0,0 +1,14 @@ +#ifndef LOG_H +#define LOG_H +/* Use this */ + +extern int debug_level; + +#define DBG_RAW(...) fprintf( stderr, __VA_ARGS__ ); +#define DBG(level,fmt, args...) \ + do { \ + if (level <= debug_level) \ + syslog( LOG_DEBUG,"%-20s: " fmt , __func__, ##args); \ + } while(0) + +#endif /* LOG_H */ diff --git a/peripheral_manager/src/src/peripheral_manager.c b/peripheral_manager/src/src/peripheral_manager.c new file mode 100644 index 000000000..8b59e7442 --- /dev/null +++ b/peripheral_manager/src/src/peripheral_manager.c @@ -0,0 +1,175 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "log.h" +#include "ucix.h" + +#include +#include + +#include "server.h" + +int debug_level = 0; + +static const char *config_path = "/lib/db/config"; +static const char *config_file = "hw"; + +static char *ubus_socket; + +void print_usage(char *prg_name); + +void print_usage(char *prg_name) { + printf("Usage: %s -h -f\n", prg_name); + printf(" Options: \n"); + printf(" -f, --foreground\tDon't fork off as a daemon.\n"); + printf(" -d, --debug=NUM\tSet debug level. Higher = more output\n"); + printf(" -c, --config=FILE\tConfig file to use. default = %s/%s\n", config_path, config_file); + printf(" -s, --socket=FILE\tSet the unix domain socket to connect to for ubus\n"); + printf(" -h\t\tShow this help screen.\n"); + printf("\n"); +} + +int main(int argc, char **argv) +{ + int ch; + int daemonize = 1; + pid_t pid, sid; + struct uci_context *uci_ctx = NULL; + static struct ubus_context *ubus_ctx = NULL; + + while (1) { + int option_index = 0; + static struct option long_options[] = { + {"foreground", no_argument, 0, 'f'}, + {"verbose", no_argument, 0, 'v'}, + {"debug", required_argument, 0, 'd'}, + {"config",required_argument, 0, 'c'}, + {"socket",required_argument, 0, 's'}, + {"help", no_argument, 0, 'h'}, + {0, 0, 0, 0} + }; + + ch = getopt_long(argc, argv, "hvfhd:c:s:", + long_options, &option_index); + + if (ch == -1) + break; + + switch (ch) { + case 'f': + daemonize = 0; + break; + case 'd': + debug_level = strtol(optarg, 0, 0); + break; + + case 'c': + config_file = basename(optarg); + config_path = dirname(optarg); + break; + case 's': + ubus_socket = optarg; + break; + + case 'h': + default: + print_usage(argv[0]); + exit(0); + } + } + + if (optind < argc) { + printf("Extra arguments discarded: "); + while (optind < argc) + printf("%s ", argv[optind++]); + printf("\n"); + } + + + /* Setup logging */ + if (daemonize) { + setlogmask(LOG_UPTO(LOG_INFO)); + openlog(PACKAGE, LOG_CONS, LOG_USER); + + syslog(LOG_INFO, "%s daemon starting up", PACKAGE); + } else { + setlogmask(LOG_UPTO(LOG_DEBUG)); + openlog(PACKAGE, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER); + + syslog(LOG_INFO, "%s program starting up", PACKAGE); + } + + /* daemonize */ + if (daemonize) { + syslog(LOG_INFO, "starting the daemonizing process"); + + /* Fork off the parent process */ + pid = fork(); + if (pid < 0) { + exit(EXIT_FAILURE); + } + /* If we got a good PID, then + we can exit the parent process. */ + if (pid > 0) { + exit(EXIT_SUCCESS); + } + + /* Change the file mode mask */ + umask(0); + + /* Create a new SID for the child process */ + sid = setsid(); + if (sid < 0) { + /* Log the failure */ + exit(EXIT_FAILURE); + } + + /* Change the current working directory */ + if ((chdir("/")) < 0) { + /* Log the failure */ + exit(EXIT_FAILURE); + } + /* Close out the standard file descriptors */ + //close(STDIN_FILENO); + //close(STDOUT_FILENO); + //close(STDERR_FILENO); + } + + /* open configuration file */ + uci_ctx = ucix_init_path(config_path , config_file, 0 ); + if (! uci_ctx ) { + syslog(LOG_ERR,"Failed to load config file \"%s/%s\"\n", config_path, config_file); + exit(1); + } + + /* connect to ubus */ + ubus_ctx = ubus_connect(ubus_socket); + if (!ubus_ctx) { + syslog(LOG_ERR,"Failed to connect to ubus. Can't continue.\n"); + exit(EXIT_FAILURE); + } + + /* connect ubus handler to ubox evenet loop */ + if (uloop_init() != 0) { + syslog(LOG_ERR,"Could not init event loop, Can't continue.\n"); + exit(EXIT_FAILURE); + } + ubus_add_uloop(ubus_ctx); + + server_start(uci_ctx, ubus_ctx); + + ubus_free(ubus_ctx); + + DBG(1,"testing\n"); + syslog(LOG_INFO, "%s exiting", PACKAGE); + + uloop_done(); + return 0; +} diff --git a/peripheral_manager/src/src/server.c b/peripheral_manager/src/src/server.c new file mode 100644 index 000000000..caa5ccbfb --- /dev/null +++ b/peripheral_manager/src/src/server.c @@ -0,0 +1,57 @@ +#include "config.h" +#include +#include "log.h" +#include "server.h" +#include "led.h" +#include "button.h" +#include "catv.h" +#include "sfp.h" +#include "touch_sx9512.h" + +struct server_ctx server; + +void sim_led_init(struct server_ctx *); +void sim_button_init(struct server_ctx *); + +void gpio_led_init(struct server_ctx *); +void gpio_button_init(struct server_ctx *); + +struct catv_handler *catv_h; +struct sfp_handler *sfp_h; + +void server_start(struct uci_context *uci_ctx, struct ubus_context *ubus_ctx) + +{ + DBG(1, "init server context."); + server.uci_ctx = uci_ctx; + server.ubus_ctx = ubus_ctx; + + DBG(1, "run init function for all hardware drivers."); + + sim_led_init(&server); + sim_button_init(&server); + +#ifdef HAVE_BOARD_H + gpio_led_init(&server); + gpio_button_init(&server); + + sx9512_init(&server); +#endif + + DBG(1, "connect generic buttons/leds to hardware drivers."); + led_init(&server); + button_init(&server); + + sfp_h = sfp_init(uci_ctx); + if (sfp_h) { + sfp_ubus_populate(sfp_h, ubus_ctx); + } + + catv_h = catv_init(uci_ctx, "/dev/i2c-0", 0x50, 0x51); + if (catv_h){ + catv_ubus_populate(catv_h, ubus_ctx); + } + + DBG(1, "give control to uloop main loop."); + uloop_run(); +} diff --git a/peripheral_manager/src/src/server.h b/peripheral_manager/src/src/server.h new file mode 100644 index 000000000..e43cba12d --- /dev/null +++ b/peripheral_manager/src/src/server.h @@ -0,0 +1,13 @@ +#ifndef SERVER_H +#define SERVER_H +#include +#include "ucix.h" + +struct server_ctx { + struct uci_context *uci_ctx; + struct ubus_context *ubus_ctx; +}; + +void server_start( struct uci_context *uci_ctx, struct ubus_context *ubus_ctx); + +#endif /* SERVER_H */ diff --git a/peripheral_manager/src/src/sfp.c b/peripheral_manager/src/src/sfp.c new file mode 100644 index 000000000..7d8d1bccf --- /dev/null +++ b/peripheral_manager/src/src/sfp.c @@ -0,0 +1,1105 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "smbus.h" +#include +#include + +#include "libubus.h" +#include +#include +#include "ucix.h" + +#include "i2c.h" +#include "sfp.h" +#include "log.h" + +//static struct blob_buf b; + +struct i2c_sfp { + const char *bus; + int rom_addr; + int ddm_addr; + const char *name; +}; + +const struct i2c_sfp i2c_sfp_list[] = { + { .bus = "/dev/i2c-0", + .rom_addr = 0x50, + .ddm_addr = 0x51, + .name = "EG200" + }, + { .bus = "/dev/i2c-1", + .rom_addr = 0x50, + .ddm_addr = 0x51, + .name = "EG300" + }, +}; + +const struct i2c_sfp *i2c_sfp; + +static int sfp_rom_fd = -1; +static int sfp_ddm_fd = -1; + +static int sfp_rom_byte(unsigned addr) +{ + int ret; + if (!i2c_sfp) + return -1; + + if (sfp_rom_fd >= 0) { + ret = i2c_smbus_read_byte_data(sfp_rom_fd, addr); + if (ret >= 0) + return ret; + /* Close and retry */ + close (sfp_rom_fd); + goto open; + } + if (sfp_rom_fd < 0) { + open: + sfp_rom_fd = i2c_open_dev(i2c_sfp->bus, i2c_sfp->rom_addr, I2C_FUNC_SMBUS_READ_BYTE); + if (sfp_rom_fd < 0) + return -1; + } + ret = i2c_smbus_read_byte_data(sfp_rom_fd, addr); + if (ret < 0) { + DBG(1,"%s: i2c_smbus_read_byte_data failed: addr %d", __func__, addr); + } + return ret; +}; + +static int sfp_rom_bytes(unsigned addr, char *p, size_t length) +{ + int byte = sfp_rom_byte(addr); + unsigned int i; + if (byte < 0) + return 0; + p[0] = byte; + + for (i = 1; i < length; i++) { + byte = i2c_smbus_read_byte_data(sfp_rom_fd, addr + i); + if (byte < 0) + return 0; + p[i] = byte; + } + return 1; +} + +static int sfp_rom_get_type(struct blob_buf *b) +{ + int byte = sfp_rom_byte (0); + char buf[20]; + const char *value; + + if (byte < 0) + return 0; + + switch (byte) { + case 0: + value = "unspecified"; + break; + case 1: + value = "GBIC"; + break; + case 2: + value = "soldered module/connector"; + break; + case 3: + value = "SFP"; + break; + default: + snprintf(buf, sizeof(buf), "%s %d", + byte < 0x80 ? "reserved" : "vendor specific", + byte); + value = buf; + break; + } + + blobmsg_add_string(b, "type", value); + return 1; +} + +static int sfp_rom_get_type_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf )); + blob_buf_init (&b, 0); + sfp_rom_get_type(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} +static int sfp_rom_get_connector(struct blob_buf *b) +{ + int byte = sfp_rom_byte (2); + char buf[20]; + + const char *value; + + if (byte < 0) + return 0; + + switch (byte) { + case 0: + value = "Unspecified"; + break; + case 1: + value = "SC"; + break; + case 2: + value = "Fiber Channel style 1"; + break; + case 3: + value = "Fiber Channel style 2"; + break; + case 4: + value = "TNC/BNC"; + break; + case 5: + value = "Fiber Channel coaxial"; + break; + case 6: + value = "FiberJack"; + break; + case 7: + value = "LC"; + break; + case 8: + value = "MT-RJ"; + break; + case 9: + value = "MU"; + break; + case 10: + value = "SG"; + break; + case 11: + value = "Optical pigtail"; + break; + case 32: + value = "HSSDC II"; + break; + case 33: + value = "Copper pigtail"; + break; + default: + snprintf(buf, sizeof(buf), "%s %d", + byte < 0x80 ? "reserved" : "vendor specific", + byte); + value = buf; + break; + } + + blobmsg_add_string(b, "connector", value); + return 1; +} + +static int sfp_rom_get_connector_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_connector (&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_rom_get_ethernet(struct blob_buf *b) +{ + int byte = sfp_rom_byte (6); + int i; + char value[11]; + if (byte < 0) + return 0; + + i = 0; + if (byte & 8) + value[i++] = 'T'; + if (byte & 4) { + if (i) + value[i++] = ','; + strcpy(value+i, "CX"); + i += 2; + } + if (byte & 2) { + if (i) + value[i++] = ','; + strcpy(value+i, "LX"); + i += 2; + } + if (byte & 1) { + if (i) + value[i++] = ','; + strcpy(value+i, "SX"); + i += 2; + } + if (!i) + return 0; + + value[i] = '\0'; + blobmsg_add_string(b, "ethernet", value); + return 1; +} + +static int sfp_rom_get_ethernet_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_ethernet(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_rom_get_encoding(struct blob_buf *b) +{ + int byte = sfp_rom_byte (11); + char buf[20]; + const char *value; + if (byte < 0) + return 0; + + switch (byte) { + case 0: + value = "Unspecified"; + break; + case 1: + value = "8B10B"; + break; + case 2: + value = "4B5B"; + break; + case 3: + value = "NRZ"; + break; + case 4: + value = "Manchester"; + break; + default: + snprintf(buf, sizeof(buf), "%s %d", + "reserved", byte); + value = buf; + break; + } + + blobmsg_add_string(b, "encoding", value); + return 1; +} + +static int sfp_rom_get_encoding_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_encoding(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_rom_get_rate(struct blob_buf *b) +{ + int byte = sfp_rom_byte (12); + int tol; + if (byte < 0) + return 0; + + /* Read byte is in units of 100 Mbit/s, scale to Mbit/s. */ + blobmsg_add_u32(b, "rate", 100*byte); + tol = sfp_rom_byte (66); + if (tol > 0) + blobmsg_add_u32(b, "rate-max", (100 + tol)*byte); + + tol = sfp_rom_byte (67); + if (tol > 0 && tol <= 100) + blobmsg_add_u32(b, "rate-min", (100 - tol)*byte); + + return 1; +} + +static int sfp_rom_get_rate_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_rate(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_rom_get_length(struct blob_buf *b) +{ + int sm_1000; + int sm_100; + int mm50; + int mm62; + int cu; + + if ( (sm_1000 = sfp_rom_byte (14)) < 0 + || (sm_100 = sfp_rom_byte (15)) < 0 + || (mm50 = sfp_rom_byte (16)) < 0 + || (mm62 = sfp_rom_byte (17)) < 0 + || (cu = sfp_rom_byte (18)) < 0) + return 0; + + if (sm_1000 > 0) + blobmsg_add_u32(b, "single-mode", sm_1000 * 1000); + else if (sm_100 > 0) + blobmsg_add_u32(b, "single-mode", sm_100 * 100); + if (mm50 > 0) + blobmsg_add_u32(b, "multi-mode-50", mm50 * 10); + if (mm62 > 0) + blobmsg_add_u32(b, "multi-mode-62.5", mm62 * 10); + if (cu > 0) + blobmsg_add_u32(b, "copper", cu); + return 1; +} + +static int sfp_rom_get_length_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_length(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_rom_get_vendor(struct blob_buf *b) +{ + char buf[17]; + int i; + if (!sfp_rom_bytes(20, buf, 16)) + return 0; + + for (i = 16; i > 0 && buf[i-1] == ' '; i--) + ; + buf[i] = '\0'; + + blobmsg_add_string(b, "vendor", buf); + return 1; +} + +static int sfp_rom_get_vendor_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_vendor(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_rom_get_oui(struct blob_buf *b) +{ + char buf[3]; + char value[9]; + if (!sfp_rom_bytes(37, buf, 3)) + return 0; + + snprintf(value, sizeof(value), "%02x:%02x:%02x", + (unsigned char) buf[0], (unsigned char) buf[1], (unsigned char) buf[2]); + blobmsg_add_string(b, "oui", value); + return 1; +} + +static int sfp_rom_get_oui_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_oui(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_rom_get_pn(struct blob_buf *b) +{ + char buf[17]; + int i; + if (!sfp_rom_bytes(40, buf, 16)) + return 0; + + for (i = 16; i > 0 && buf[i-1] == ' '; i--) + ; + buf[i] = '\0'; + + blobmsg_add_string(b, "pn", buf); + return 1; +} + +static int sfp_rom_get_pn_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_pn(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_rom_get_rev(struct blob_buf *b) +{ + char buf[5]; + int i; + if (!sfp_rom_bytes(56, buf, 4)) + return 0; + + for (i = 4; i > 0 && buf[i-1] == ' '; i--) + ; + buf[i] = '\0'; + + blobmsg_add_string(b, "rev", buf); + return 1; +} + +static int sfp_rom_get_rev_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_rev(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_rom_get_sn(struct blob_buf *b) +{ + char buf[17]; + int i; + if (!sfp_rom_bytes(68, buf, 16)) + return 0; + + for (i = 16; i > 0 && buf[i-1] == ' '; i--) + ; + buf[i] = '\0'; + + blobmsg_add_string(b, "sn", buf); + return 1; +} +static int sfp_rom_get_sn_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_sn(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_rom_get_date(struct blob_buf *b) +{ + char buf[8]; + char value[14]; + int i; + if (!sfp_rom_bytes(84, buf, 8)) + return 0; + + value[0] = '2'; + value[1] = '0'; + value[2] = buf[0]; + value[3] = buf[1]; + value[4] = '-'; + value[5] = buf[2]; + value[6] = buf[3]; + value[7] = '-'; + value[8] = buf[4]; + value[9] = buf[5]; + for (i = 8; i > 6 && buf[i-1] == ' '; i--) + ; + memset(value+10, 0, 4); + if (i > 6) { + value[10] = ' '; + value[11] = buf[6]; + if (i > 7) + value[12] = buf[7]; + } + + blobmsg_add_string(b, "date", value); + return 1; +} + +static int sfp_rom_get_date_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_date(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_rom_get_ddm(struct blob_buf *b) +{ + int byte = sfp_rom_byte(94); + char buf[20]; + const char *value; + + if (byte < 0) + return 0; + + switch (byte) { + case 0: + value = "none"; + break; + case 1: + value = "9.3"; + break; + case 2: + value = "9.5"; + break; + case 3: + value = "10.2"; + break; + case 4: + value = "10.4"; + break; + case 5: + value = "11.0"; + break; + case 6: + value = "11.3"; + break; + default: + snprintf(buf, sizeof(buf), "%s %d", + "reserved", byte); + value = buf; + } + blobmsg_add_string(b, "ddm", value); + return 1; +}; + +static int sfp_rom_get_ddm_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_ddm(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_rom_get_all_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_rom_get_connector(&b); + sfp_rom_get_ethernet(&b); + sfp_rom_get_encoding(&b); + sfp_rom_get_rate(&b); + sfp_rom_get_length(&b); + sfp_rom_get_vendor(&b); + sfp_rom_get_oui(&b); + sfp_rom_get_pn(&b); + sfp_rom_get_rev(&b); + sfp_rom_get_sn(&b); + sfp_rom_get_date(&b); + sfp_rom_get_ddm(&b); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +struct sfp_ddm { + /* For checking when to reread calibration data. */ + time_t timestamp; + unsigned type; /* From address 92 */ + unsigned version; /* From address 94 */ + /* Calibration constants, read from addresses 56-91 if bit 4 is + set in ddm_type */ + float rx_pwr[5]; + float tx_i_slope; + float tx_i_offset; + float tx_pwr_slope; + float tx_pwr_offset; + float t_slope; + float t_offset; + float v_slope; + float v_offset; +}; +static struct sfp_ddm sfp_ddm; + +static int sfp_ddm_read_float(float *x, unsigned addr) +{ + uint8_t buf[4]; + int32_t m; + int e; + unsigned i; + + if (!i2c_sfp || sfp_ddm_fd < 0) + return 0; + /* Used only for constant data, so byte accesses should be ok. And + there should only be regular normalized numbers (or zero). + */ + for (i = 0; i < 4; i++) { + int byte = i2c_smbus_read_byte_data(sfp_ddm_fd, addr + i); + if (byte < 0) + return 0; + buf[i] = byte; + } + e = (buf[0] & 0x7f) << 1 | buf[1] >> 7; + m = (((int32_t) buf[1] & 0x7f) << 16) | ((int32_t) buf[2] << 8) | buf[3]; + if (e == 0 && m == 0) { + *x = 0.0; + return 1; + } + if (e == 0 || e == 0xff) + /* NaN or infinity */ + return 0; + m |= (1U << 23); + if (buf[0] & 0x80) + m = -m; + *x = ldexpf ((float) m, e - (127 + 23)); + + return 1; +} + +/* Plain i2c_smbus_read_word_data use little-endian byteorder. We have + msb first, so swap it. The swap should be a nop for the failure + case w == -1. */ +static int i2c_smbus_read_word_swapped(int fd, unsigned addr) +{ + int w = i2c_smbus_read_word_data(fd, addr); + return (w >> 8) | ((w & 0xff) << 8); + +} +static int sfp_ddm_read_fp(float *x, unsigned addr) +{ + int w; + if (!i2c_sfp || sfp_ddm_fd < 0) + return 0; + w = i2c_smbus_read_word_swapped(sfp_ddm_fd, addr); + if (w < 0) + return 0; + *x = (float) w / 0x100; + return 1; +} + +static int sfp_ddm_read_si(float *x, unsigned addr) +{ + int w; + + if (!i2c_sfp || sfp_ddm_fd < 0) + return 0; + w = i2c_smbus_read_word_swapped(sfp_ddm_fd, addr); + if (w < 0) + return 0; + *x = (float) (int16_t) w; + return 1; +} + +static int sfp_ddm_read_ui(float *x, unsigned addr) +{ + int w; + + if (!i2c_sfp || sfp_ddm_fd < 0) + return 0; + w = i2c_smbus_read_word_swapped(sfp_ddm_fd, addr); + if (w < 0) + return 0; + *x = (float) w; + return 1; +} + +static int ddm_prepare(void) +{ + int byte; + int reread; + time_t now = time(NULL); + + + byte = sfp_rom_byte(92); + if (byte < 0) { + fail: + if (sfp_ddm_fd >= 0) + close(sfp_ddm_fd); + sfp_ddm_fd = -1; + return 0; + } + if ( (byte & 0xc0) != 0x40) + goto fail; + + if (byte & 4) { + syslog(LOG_INFO, "sfp: ddm requires address change, not implemented."); + goto fail; + } + sfp_ddm.type = byte; + byte = sfp_rom_byte(94); + if (byte <= 0) + goto fail; + sfp_ddm.version = byte; + if (sfp_ddm_fd < 0) { + sfp_ddm_fd = i2c_open_dev(i2c_sfp->bus, i2c_sfp->ddm_addr, + I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_READ_WORD_DATA); + if (sfp_ddm_fd < 0) + return 0; + + reread = 1; + } + else if (sfp_ddm.type & 0x10) + /* External calibration */ + + /* We could check vendor, sn, etc, to try to figure out if the + SFP has been replaced, but it's less work to just reread + the calibration data. */ + reread = (now > sfp_ddm.timestamp + 120 || sfp_ddm.timestamp > now); + else + reread = 0; + + if (reread) { + if (sfp_ddm.type & 0x10) { + unsigned i; + for (i = 0; i < 5; i++) + if (!sfp_ddm_read_float(&sfp_ddm.rx_pwr[4-i], 56+4*i)) + goto fail; + if (! (sfp_ddm_read_fp(&sfp_ddm.tx_i_slope, 76) + && sfp_ddm_read_si(&sfp_ddm.tx_i_offset, 78) + && sfp_ddm_read_fp(&sfp_ddm.tx_pwr_slope, 80) + && sfp_ddm_read_si(&sfp_ddm.tx_pwr_offset, 82) + && sfp_ddm_read_fp(&sfp_ddm.t_slope, 84) + && sfp_ddm_read_si(&sfp_ddm.t_offset, 86) + && sfp_ddm_read_fp(&sfp_ddm.v_slope, 88) + && sfp_ddm_read_si(&sfp_ddm.v_offset, 89))) { + syslog(LOG_INFO, "sfp: Reading ddm calibration data failed."); + goto fail; + } + DBG(1,"Read ddm calibration data:\n" + "rx_pwr: %g %g %g %g %g\n" + "tx_i: %g %g\n" + "tx_pwr: %g %g\n" + "T: %g %g\n" + "V: %g %g\n", + sfp_ddm.rx_pwr[0], sfp_ddm.rx_pwr[1], + sfp_ddm.rx_pwr[2], sfp_ddm.rx_pwr[3], + sfp_ddm.rx_pwr[4], + sfp_ddm.tx_i_slope, sfp_ddm.tx_i_offset, + sfp_ddm.tx_pwr_slope, sfp_ddm.tx_pwr_offset, + sfp_ddm.t_slope, sfp_ddm.t_offset, + sfp_ddm.v_slope, sfp_ddm.v_offset); + + } + else { + sfp_ddm.rx_pwr[0] = sfp_ddm.rx_pwr[2] + = sfp_ddm.rx_pwr[3] = sfp_ddm.rx_pwr[4] = 0.0; + sfp_ddm.rx_pwr[1] = 1.0; + + sfp_ddm.tx_i_slope = sfp_ddm.tx_pwr_slope + = sfp_ddm.t_slope = sfp_ddm.v_slope = 1.0; + sfp_ddm.tx_i_offset = sfp_ddm.tx_pwr_offset + = sfp_ddm.t_offset = sfp_ddm.v_offset = 0.0; + } + sfp_ddm.timestamp = now; + } + return 1; +}; + +static int sfp_ddm_get_temperature(struct blob_buf *b, int raw) +{ + float x; + char buf[15]; + + if (!ddm_prepare()) + return 0; + + if (!sfp_ddm_read_si(&x, 96)) + return 0; + + x = sfp_ddm.t_slope * x + sfp_ddm.t_offset; + if (raw) { + blobmsg_add_u32(b, "raw", (uint32_t) (x+0.5)); + blobmsg_add_string(b, "unit", "1/256 °C"); + } + + snprintf(buf, sizeof(buf), "%.2f °C", x * (1.0/256)); + blobmsg_add_string(b, "temperature", buf); + return 1; +} + +static int sfp_ddm_get_temperature_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_ddm_get_temperature(&b, 1); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_ddm_get_voltage(struct blob_buf *b, int raw) +{ + float x; + char buf[10]; + if (!ddm_prepare()) + return 0; + + if (!sfp_ddm_read_ui(&x, 98)) + return 0; + + x = sfp_ddm.v_slope * x + sfp_ddm.v_offset; + if (raw) { + blobmsg_add_u32(b, "raw", (uint32_t) (x+0.5)); + blobmsg_add_string(b, "unit", "100uV"); + } + snprintf(buf, sizeof(buf), "%.4f V", x * (1.0/10000)); + blobmsg_add_string(b, "voltage", buf); + return 1; +} + +static int sfp_ddm_get_voltage_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_ddm_get_voltage(&b, 1); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_ddm_get_current(struct blob_buf *b, int raw) +{ + float x; + char buf[10]; + if (!ddm_prepare()) + return 0; + + if (!sfp_ddm_read_ui(&x, 100)) + return 0; + + x = sfp_ddm.tx_i_slope * x + sfp_ddm.tx_i_offset; + if (raw) { + blobmsg_add_u32(b, "raw", (uint32_t) (x+0.5)); + blobmsg_add_string(b, "unit", "2 uA"); + } + snprintf(buf, sizeof(buf), "%.3f mA", x * (1.0/500)); + blobmsg_add_string(b, "current", buf); + return 1; +} + +static int sfp_ddm_get_current_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_ddm_get_current(&b, 1); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static int sfp_ddm_get_tx_pwr(struct blob_buf *b, int raw) +{ + float x; + char buf[10]; + if (!ddm_prepare()) + return 0; + + if (!sfp_ddm_read_ui(&x, 102)) + return 0; + + x = sfp_ddm.tx_pwr_slope * x + sfp_ddm.tx_pwr_offset; + if (raw) { + blobmsg_add_u32(b, "raw", (uint32_t) (x+0.5)); + blobmsg_add_string(b, "unit", "0.1uW"); + } + snprintf(buf, sizeof(buf), "%.4f mW", x * (1.0/10000)); + blobmsg_add_string(b, "tx-pwr", buf); + + return 1; +} + +static int sfp_ddm_get_tx_pwr_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_ddm_get_tx_pwr(&b, 1); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + + +static int sfp_ddm_get_rx_pwr(struct blob_buf *b, int raw) +{ + unsigned i; + float x; + char buf[10]; + + if (!ddm_prepare()) + return 0; + + for (x = sfp_ddm.rx_pwr[0], i = 1; i < 5; i++) { + float v; + /* NOTE: There's only a single word to read. It's unclear how + to get several values. However, typically, rx_pwr[2,3,4] + are zero. */ + if (sfp_ddm.rx_pwr[i] != 0.0) { + if (!sfp_ddm_read_ui(&v, 104)) + return 0; + x += v*sfp_ddm.rx_pwr[i]; + } + } + if (raw) { + blobmsg_add_u32(b, "raw", (uint32_t) (x+0.5)); + blobmsg_add_string(b, "unit", "0.1uW"); + } + + snprintf(buf, sizeof(buf), "%.4f mW", x * (1.0/10000)); + blobmsg_add_string(b, "rx-pwr", buf); + blobmsg_add_string(b, "rx-pwr-type", + (sfp_ddm.type & 8) ? "average" : "OMA"); + return 1; +} + +static int sfp_ddm_get_rx_pwr_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + sfp_ddm_get_rx_pwr(&b, 1); + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} +static int sfp_ddm_get_all_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf b; + + memset(&b, 0, sizeof(struct blob_buf)); + blob_buf_init (&b, 0); + + sfp_ddm_get_temperature(&b, 0); + sfp_ddm_get_voltage(&b, 0); + sfp_ddm_get_current(&b, 0); + sfp_ddm_get_tx_pwr(&b, 0); + sfp_ddm_get_rx_pwr(&b, 0); + + ubus_send_reply(ubus_ctx, req, b.head); + return 0; +} + +static const struct ubus_method sfp_rom_methods[] = { + { .name = "get-type", .handler = sfp_rom_get_type_method }, + { .name = "get-connector", .handler = sfp_rom_get_connector_method }, + { .name = "get-ethernet", .handler = sfp_rom_get_ethernet_method }, + { .name = "get-encoding", .handler = sfp_rom_get_encoding_method }, + { .name = "get-rate", .handler = sfp_rom_get_rate_method }, + { .name = "get-length", .handler = sfp_rom_get_length_method }, + { .name = "get-vendor", .handler = sfp_rom_get_vendor_method }, + { .name = "get-oui", .handler = sfp_rom_get_oui_method }, + { .name = "get-pn", .handler = sfp_rom_get_pn_method }, + { .name = "get-rev", .handler = sfp_rom_get_rev_method }, + { .name = "get-sn", .handler = sfp_rom_get_sn_method }, + { .name = "get-date", .handler = sfp_rom_get_date_method }, + { .name = "get-ddm", .handler = sfp_rom_get_ddm_method }, + { .name = "get-all", .handler = sfp_rom_get_all_method }, +}; + +static struct ubus_object_type sfp_rom_type = + UBUS_OBJECT_TYPE("sfp.rom", sfp_rom_methods); + +static const struct ubus_method sfp_ddm_methods[] = { + { .name = "get-rx-pwr", .handler = sfp_ddm_get_rx_pwr_method }, + { .name = "get-tx-pwr", .handler = sfp_ddm_get_tx_pwr_method }, + { .name = "get-temperature", .handler = sfp_ddm_get_temperature_method }, + { .name = "get-current", .handler = sfp_ddm_get_current_method }, + { .name = "get-voltage", .handler = sfp_ddm_get_voltage_method }, + { .name = "get-all", .handler = sfp_ddm_get_all_method }, +}; + +static struct ubus_object_type sfp_ddm_type = + UBUS_OBJECT_TYPE("sfp.ddm", sfp_ddm_methods); + +static struct ubus_object sfp_objects[] = { + { .name = "sfp.rom", .type = &sfp_rom_type, + .methods = sfp_rom_methods, ARRAY_SIZE(sfp_rom_methods) }, + { .name = "sfp.ddm", .type = &sfp_ddm_type, + .methods = sfp_ddm_methods, ARRAY_SIZE(sfp_ddm_methods) }, +}; + +struct sfp_handler * sfp_init( struct uci_context *uci_ctx) +{ + const char *p; + unsigned int i; + + p = ucix_get_option(uci_ctx, "hw", "board", "hardware"); + if (p == 0){ + syslog(LOG_INFO, "%s: Missing Hardware identifier in configuration. I2C is not started",__func__); + return 0; + } + + /* Here we match the hardware name to a init table, and get the + i2c chip address */ + i2c_sfp = NULL; + for (i = 0; i < sizeof(i2c_sfp_list) / sizeof(i2c_sfp_list[0]); i++) { + DBG(1,"I2C hardware platform %s tested.", i2c_sfp_list[i].name); + if (!strcmp(i2c_sfp_list[i].name, p)) { + DBG(1,"I2C hardware platform %s found.", p); + i2c_sfp = &i2c_sfp_list[i]; + break; + } + } + if (!i2c_sfp) { + DBG(1,"No sfp I2C hardware found: %s.", p); + return 0; + } + + /* just return something not NULL */ + return (struct sfp_handler *)4; +} + +int sfp_ubus_populate( struct sfp_handler *h, struct ubus_context *ubus_ctx) +{ + unsigned int i; + int ret; + + for (i = 0; i < ARRAY_SIZE(sfp_objects); i++) { + ret = ubus_add_object (ubus_ctx, &sfp_objects[i]); + if (ret) + DBG(1,"Failed to add sfp object: %s", ubus_strerror(ret)); + } + return 0; +} diff --git a/ledmngr/src/sfp.h b/peripheral_manager/src/src/sfp.h similarity index 100% rename from ledmngr/src/sfp.h rename to peripheral_manager/src/src/sfp.h diff --git a/peripheral_manager/src/src/sim_button.c b/peripheral_manager/src/src/sim_button.c new file mode 100644 index 000000000..981eaff5c --- /dev/null +++ b/peripheral_manager/src/src/sim_button.c @@ -0,0 +1,191 @@ +#include +#include +#include "button.h" +#include "log.h" +#include "server.h" + + +void sim_button_init(struct server_ctx *s_ctx); + +struct sim_data { + int addr; + int active; + int state; + struct button_drv button; +}; + +struct drv_button_list{ + struct list_head list; + struct button_drv *drv; +}; + +static button_state_t sim_get_state(struct button_drv *drv) +{ +// DBG(1, "state for %s", drv->name); + struct sim_data *p = (struct sim_data *)drv->priv; + + return p->state; +} + +static struct button_drv_func func = { + .get_state = sim_get_state, +}; + +static LIST_HEAD(sim_buttons); + + +enum { + SIM_NAME, + SIM_STATE, + __SIM_MAX +}; + +static const struct blobmsg_policy sim_policy[] = { + [SIM_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING }, + [SIM_STATE] = { .name = "state", .type = BLOBMSG_TYPE_STRING }, +}; + +static struct button_drv *get_drv_button(char *name) +{ + struct list_head *i; + list_for_each(i, &sim_buttons) { + struct drv_button_list *node = list_entry(i, struct drv_button_list, list); + if (! strcmp(node->drv->name, name)) + return node->drv; + } + return NULL; +} + +static int sim_set_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_attr *tb[__SIM_MAX]; + DBG(1, ""); + + blobmsg_parse(sim_policy, ARRAY_SIZE(sim_policy), tb, blob_data(msg), blob_len(msg)); + + if ( tb[SIM_NAME] ) { + if ( tb[SIM_STATE] ) { + struct button_drv *bt = get_drv_button((char *)blobmsg_data(tb[SIM_NAME])); + DBG(1," name = %s",(char *)blobmsg_data(tb[SIM_NAME])); + DBG(1," state = %s",(char *)blobmsg_data(tb[SIM_STATE])); + + if (bt) { + struct sim_data *p = (struct sim_data *)bt->priv; + + if(!strcasecmp("pressed", (char *)blobmsg_data(tb[SIM_STATE]))){ + p->state = PRESSED; + } + if(!strcasecmp("released", (char *)blobmsg_data(tb[SIM_STATE]))){ + p->state = RELEASED; + } + }else + DBG(1," button = %s not found",(char *)blobmsg_data(tb[SIM_NAME])); + } + } + return 0; +} + +static int sim_status_method(struct ubus_context *ubus_ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_buf blob; + struct list_head *i; + + DBG(1, ""); + + memset(&blob,0,sizeof(struct blob_buf)); + blob_buf_init(&blob, 0); + + list_for_each(i, &sim_buttons) { + struct drv_button_list *node = list_entry(i, struct drv_button_list, list); + const char *state; + struct sim_data *p = (struct sim_data *)node->drv->priv; + + if(p->state == RELEASED) + state = "Released"; + else + state = "Pressed"; + + blobmsg_add_string(&blob, node->drv->name, state); + } + ubus_send_reply(ubus_ctx, req, blob.head); + return 0; +} + + +static const struct ubus_method sim_methods[] = { + UBUS_METHOD("set", sim_set_method, sim_policy), + { .name = "status", + .handler = sim_status_method }, +}; + +static struct ubus_object_type sim_object_type = + UBUS_OBJECT_TYPE("sim", sim_methods); + +#define SIM_OBJECTS 1 +static struct ubus_object sim_objects[SIM_OBJECTS] = { + { .name = "button", + .type = &sim_object_type, + .methods = sim_methods, + .n_methods = ARRAY_SIZE(sim_methods), + }, +}; + +void sim_button_init(struct server_ctx *s_ctx) { + int i,ret; + struct ucilist *node; + LIST_HEAD(buttons); + + DBG(1, ""); + + ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"sim_buttons", "buttons", &buttons); + list_for_each_entry(node, &buttons, list) { + struct sim_data *data; + const char *s; + + DBG(1, "value = [%s]",node->val); + + data = malloc(sizeof(struct sim_data)); + memset(data,0,sizeof(struct sim_data)); + + data->button.name = node->val; + + s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->button.name, "addr"); + DBG(1, "addr = [%s]", s); + if (s){ + data->addr = strtol(s,0,0); + } + + s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->button.name, "active"); + data->active = -1; + if (s){ + if (!strncasecmp("hi",s,2)) + data->active = 1; + else if (!strncasecmp("low",s,3)) + data->active = 0; + + } + DBG(1, "active = %d", data->active); + + data->button.func = &func; + data->button.priv = data; + + button_add(&data->button); + + { /* save button in internal list, we need this for ubus set/status */ + struct drv_button_list *bt = malloc(sizeof(struct drv_button_list)); + memset(bt, 0, sizeof(struct drv_button_list)); + bt->drv = &data->button; + list_add(&bt->list, &sim_buttons); + } + } + + for (i=0 ; iubus_ctx, &sim_objects[i]); + if (ret) + DBG(1,"Failed to add object: %s", ubus_strerror(ret)); + } +} diff --git a/peripheral_manager/src/src/sim_led.c b/peripheral_manager/src/src/sim_led.c new file mode 100644 index 000000000..f7154c7d1 --- /dev/null +++ b/peripheral_manager/src/src/sim_led.c @@ -0,0 +1,99 @@ +#include +#include +#include "led.h" +#include "log.h" +#include "server.h" + +void sim_led_init(struct server_ctx *s_ctx); + +static int sim_set_state(struct led_drv *drv, led_state_t state) +{ + DBG(1, "state %x on %s", state, drv->name); + return 0; +} + +static led_state_t sim_get_state(struct led_drv *drv) +{ + DBG(1, "state for %s", drv->name); + return 0; +} + +static int sim_set_color(struct led_drv *drv, led_color_t color) +{ + DBG(1, "color %d on %s", color, drv->name); + return 0; +} + +static led_color_t sim_get_color(struct led_drv *drv) +{ + DBG(1, "color for %s", drv->name); + return 0; +} + +static struct led_drv_func func = { + .set_state = sim_set_state, + .get_state = sim_get_state, + .set_color = sim_set_color, + .get_color = sim_get_color, +}; + +struct sim_data { + int addr; + led_color_t color; + int state; + int breading; + struct led_drv led; +}; + + +void sim_led_init(struct server_ctx *s_ctx) { + + LIST_HEAD(leds); + struct ucilist *node; + + DBG(1, ""); + + ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"sim_leds", "leds", &leds); + list_for_each_entry(node,&leds,list){ + struct sim_data *data; + const char *s; + + DBG(1, "value = [%s]",node->val); + + data = malloc(sizeof(struct sim_data)); + memset(data,0,sizeof(struct sim_data)); + + data->led.name = node->val; + + s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "addr"); + DBG(1, "addr = [%s]", s); + if (s){ + data->addr = strtol(s,0,0); + } + + s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "color"); + if (s){ + if (!strncasecmp("red",s,3)) + data->color = RED; + else if (!strncasecmp("green",s,5)) + data->color = GREEN; + else if (!strncasecmp("blue",s,4)) + data->color = BLUE; + else if (!strncasecmp("yellow",s,6)) + data->color = YELLOW; + else if (!strncasecmp("white",s,5)) + data->color = WHITE; + } + DBG(1, "color = [%s]=(%d)", s,data->color); + + s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "breading"); + DBG(1, "breading = [%s]", s); + if (s){ + if (!strncasecmp("yes",s,3)) + data->breading = 1; + } + data->led.func = &func; + data->led.priv = data; + led_add(&data->led); + } +} diff --git a/ledmngr/src/smbus.c b/peripheral_manager/src/src/smbus.c similarity index 100% rename from ledmngr/src/smbus.c rename to peripheral_manager/src/src/smbus.c diff --git a/ledmngr/src/smbus.h b/peripheral_manager/src/src/smbus.h similarity index 100% rename from ledmngr/src/smbus.h rename to peripheral_manager/src/src/smbus.h diff --git a/peripheral_manager/src/src/touch_sx9512.c b/peripheral_manager/src/src/touch_sx9512.c new file mode 100644 index 000000000..0d78576dc --- /dev/null +++ b/peripheral_manager/src/src/touch_sx9512.c @@ -0,0 +1,653 @@ +#include + +#include +#include +#include +#include +#include + +#include +#include "button.h" +#include "led.h" +#include "log.h" +#include "server.h" + +#include "smbus.h" +#include +#include +#include "ucix.h" +#include "i2c.h" + +#include "touch_sx9512.h" +#include "gpio.h" + +/* register names, from page 29, */ +#define SX9512_IRQSRC 0 +#define SX9512_TOUCHSTATUS 1 +#define SX9512_PROXSTATUS 2 +#define SX9512_LEDMAP1 0xC +#define SX9512_LEDMAP2 0xD + +#define SX9512_IRQ_RESET 1<<7 +#define SX9512_IRQ_TOUCH 1<<6 +#define SX9512_IRQ_RELEASE 1<<5 +#define SX9512_IRQ_NEAR 1<<4 +#define SX9512_IRQ_FAR 1<<3 +#define SX9512_IRQ_COM 1<<2 +#define SX9512_IRQ_CONV 1<<1 + +/* CG300 config: + + BL0: Proximity + BL1: Wireless button + BL2: WPS button, WPS LED + BL3: Dect button, Dect LED + BL4: Internet green LED + BL5: Internet red LED + BL6, BL7: Unused. +*/ + +struct i2c_reg_tab { + char addr; + char value; + char range; /* if set registers starting from addr to addr+range will be set to the same value */ +}; + +struct i2c_touch{ + int dev; + int shadow_irq; + int shadow_touch; + int shadow_proximity; + int addr; + int irq_button; + const struct i2c_reg_tab *init_tab; + int init_tab_len; + const char *name; +}; + +struct led_data { + int addr; + led_state_t state; + struct led_drv led; +}; + +struct sx9512_list{ + struct list_head list; + struct led_data *drv; +}; + +/* holds all leds that is configured to be used. needed for reset */ +static LIST_HEAD(sx9512_leds); + +static struct i2c_touch *i2c_touch_current; /* pointer to current active table */ + +static void do_init_tab( struct i2c_touch *i2c_touch); +static struct i2c_touch * i2c_init(struct uci_context *uci_ctx, const char* i2c_dev_name, struct i2c_touch* i2c_touch_list, int len); + +static int sx9512_led_set_state(struct led_drv *drv, led_state_t state); +static led_state_t sx9512_led_get_state(struct led_drv *drv); +static int sx9512_set_state(struct led_data *p, led_state_t state); + + +/*addr,value,range*/ +static const struct i2c_reg_tab i2c_init_tab_cg300[]={ + {0xFF, 0xDE, 0x00 }, /* Reset chip */ + {0xFF, 0x00, 0x00 }, /* Reset chip */ + + {0x04, 0x00, 0x00 }, /* NVM Control */ + {0x07, 0x00, 0x00 }, /* SPO2, set as interrupt */ + {0x08, 0x00, 0x00 }, /* Power key ctrl */ + {0x09, 0x78, 0x00 }, /* Irq MASK */ + {0x0C, 0x01, 0x00 }, /* LED map 1, BL0 (why?) */ + {0x0D, 0x3c, 0x00 }, /* LED map 2 BL2 -> BL5*/ + {0x0E, 0x10, 0x00 }, /* LED Pwm Frq */ + {0x0F, 0x00, 0x00 }, /* LED Mode */ + {0x10, 0xFF, 0x00 }, /* Led Idle LED on */ + {0x11, 0x00, 0x00 }, /* Led 1 off delay */ + {0x12, 0xFF, 0x00 }, /* Led 1 on */ + {0x13, 0x00, 0x00 }, /* Led 1 fade */ + {0x14, 0xFF, 0x00 }, /* Led 2 on */ + {0x15, 0x00, 0x00 }, /* Led 2 fade */ + {0x16, 0xFF, 0x00 }, /* Led Pwr Idle */ + {0x17, 0xFF, 0x00 }, /* Led Pwr On */ + {0x18, 0x00, 0x00 }, /* Led Pwr Off */ + {0x19, 0x00, 0x00 }, /* Led Pwr fade */ + {0x1A, 0x00, 0x00 }, /* Led Pwr On Pw */ + {0x1B, 0x00, 0x00 }, /* Disable BL7 as power button */ + {0x1E, 0x0F, 0x00 }, /* Cap sens enabled, bl0-bl3 */ + {0x1F, 0x43, 0x00 }, /* Cap sens BL0 */ + {0x20, 0x41, 0x07 }, /* Cap sens range 20-27 BL1->BL7 */ + {0x28, 0x02, 0x00 }, /* Cap sens thresh BL 0 */ + {0x29, 0x04, 0x07 }, /* Cap sens thresh 28-30 */ + {0x31, 0x54, 0x00 }, /* Cap sens Op */ + {0x32, 0x70, 0x00 }, /* Cap Sens Mode, filter 1-1/8, report all */ + {0x33, 0x01, 0x00 }, /* Cap Sens Debounce */ + {0x34, 0x80, 0x00 }, /* Cap Sens Neg Comp Thresh */ + {0x35, 0x80, 0x00 }, /* Cap Sens Pos Comp Thresh */ + {0x36, 0x17, 0x00 }, /* Cap Sens Pos Filt, hyst 2, debounce 4, 1-1/128 */ + {0x37, 0x15, 0x00 }, /* Cap Sens Neg Filt, hyst 2, debounce 4, 1-1/32 */ + {0x38, 0x00, 0x00 }, /* Cap Sens */ + {0x39, 0x00, 0x00 }, /* Cap Sens Frame Skip */ + {0x3A, 0x00, 0x00 }, /* Cap Sens Misc */ + {0x3B, 0x00, 0x00 }, /* Prox Comb Chan Mask */ + {0x3E, 0xFF, 0x00 }, /* SPO Chan Map */ + {0x00, 0x04, 0x00 }, /* Trigger compensation */ +}; + +/* CG301 config: + + BL0: Proximity, Status white LED + BL1: Service button, Service white LED + BL2: Service red LED + BL3: Pair button, Pair white LED + BL4: Cancel button, Cancel red LED + BL5: Communication button, Communication white LED + BL6: Communication red LED + BL7: Unused. +*/ + +static const struct i2c_reg_tab i2c_init_tab_cg301[]={ + {0xFF, 0xDE, 0x00 }, /* Reset chip */ + {0xFF, 0x00, 0x00 }, /* Reset chip */ + + {0x04, 0x00, 0x00 }, /* NVM Control */ + {0x07, 0x00, 0x00 }, /* SPO2, set as interrupt */ + {0x08, 0x00, 0x00 }, /* Power key ctrl */ + {0x09, 0x78, 0x00 }, /* Irq MASK, touch+release+near+far */ + {0x0C, 0x00, 0x00 }, /* LED map 1, none */ + {0x0D, 0x7f, 0x00 }, /* LED map 2, BL0 -> BL6 */ + {0x0E, 0x10, 0x00 }, /* LED Pwm Frq */ + {0x0F, 0x00, 0x00 }, /* LED Mode */ + {0x10, 0xFF, 0x00 }, /* Led Idle LED on */ + {0x11, 0x00, 0x00 }, /* Led 1 off delay */ + {0x12, 0xFF, 0x00 }, /* Led 1 on */ + {0x13, 0x00, 0x00 }, /* Led 1 fade */ + {0x14, 0xFF, 0x00 }, /* Led 2 on */ + {0x15, 0x00, 0x00 }, /* Led 2 fade */ + {0x16, 0xFF, 0x00 }, /* Led Pwr Idle */ + {0x17, 0xFF, 0x00 }, /* Led Pwr On */ + {0x18, 0x00, 0x00 }, /* Led Pwr Off */ + {0x19, 0x00, 0x00 }, /* Led Pwr fade */ + {0x1A, 0x00, 0x00 }, /* Led Pwr On Pw */ + {0x1B, 0x00, 0x00 }, /* Disable BL7 as power button */ + {0x1E, 0x3b, 0x00 }, /* Cap sens enabled, bl0,bl1,bl3-bl5 */ + {0x1F, 0x43, 0x00 }, /* Cap sens range BL0 */ + {0x20, 0x41, 0x07 }, /* Cap sens range BL1->BL7 [20-27] */ + {0x28, 0x02, 0x00 }, /* Cap sens thresh BL0 */ + {0x29, 0x04, 0x07 }, /* Cap sens thresh BL1->BL7 [29-30] */ + {0x31, 0x54, 0x00 }, /* Cap sens Op */ + {0x32, 0x70, 0x00 }, /* Cap Sens Mode, filter 1-1/8, report all */ + {0x33, 0x01, 0x00 }, /* Cap Sens Debounce */ + {0x34, 0x80, 0x00 }, /* Cap Sens Neg Comp Thresh */ + {0x35, 0x80, 0x00 }, /* Cap Sens Pos Comp Thresh */ + {0x36, 0x17, 0x00 }, /* Cap Sens Pos Filt, hyst 2, debounce 4, 1-1/128 */ + {0x37, 0x15, 0x00 }, /* Cap Sens Neg Filt, hyst 2, debounce 4, 1-1/32 */ + {0x38, 0x00, 0x00 }, /* Cap Sens */ + {0x39, 0x00, 0x00 }, /* Cap Sens Frame Skip */ + {0x3A, 0x00, 0x00 }, /* Cap Sens Misc */ + {0x3B, 0x00, 0x00 }, /* Prox Comb Chan Mask */ + {0x3E, 0xFF, 0x00 }, /* SPO Chan Map */ + {0x00, 0x04, 0x00 }, /* Trigger compensation */ +}; + +/* EG300 config: + + BL0: Proximity, WAN green LED + BL1: Wireless button, WAN yellow LED + BL2: WPS button, WPS LED + BL3: Dect button, Dect LED + BL4: Internet green LED + BL5: Internet red LED + BL6: Ethernet LED + BL7: Voice LED + + Only the led 1 and led2 maps differ from CG300. +*/ + +static const struct i2c_reg_tab i2c_init_tab_eg300[]={ + {0xFF, 0xDE, 0x00 }, /* Reset chip */ + {0xFF, 0x00, 0x00 }, /* Reset chip */ + + {0x04, 0x00, 0x00 }, /* NVM Control */ + {0x07, 0x00, 0x00 }, /* SPO2, set as interrupt */ + {0x08, 0x00, 0x00 }, /* Power key ctrl */ + {0x09, 0x78, 0x00 }, /* Irq MASK */ + {0x0C, 0x00, 0x00 }, /* LED map 1, none */ + {0x0D, 0xff, 0x00 }, /* LED map 2, all */ + {0x0E, 0x10, 0x00 }, /* LED Pwm Frq */ + {0x0F, 0x00, 0x00 }, /* LED Mode */ + {0x10, 0xFF, 0x00 }, /* Led Idle LED on */ + {0x11, 0x00, 0x00 }, /* Led 1 off delay */ + {0x12, 0xFF, 0x00 }, /* Led 1 on */ + {0x13, 0x00, 0x00 }, /* Led 1 fade */ + {0x14, 0xFF, 0x00 }, /* Led 2 on */ + {0x15, 0x00, 0x00 }, /* Led 2 fade */ + {0x16, 0xFF, 0x00 }, /* Led Pwr Idle */ + {0x17, 0xFF, 0x00 }, /* Led Pwr On */ + {0x18, 0x00, 0x00 }, /* Led Pwr Off */ + {0x19, 0x00, 0x00 }, /* Led Pwr fade */ + {0x1A, 0x00, 0x00 }, /* Led Pwr On Pw */ + {0x1B, 0x00, 0x00 }, /* Disable BL7 as power button */ + {0x1E, 0x0F, 0x00 }, /* Cap sens enabled, bl0-bl3 */ + {0x1F, 0x43, 0x00 }, /* Cap sens BL0 */ + {0x20, 0x43, 0x07 }, /* Cap sens range 20-27 BL1->BL7 */ + {0x28, 0x02, 0x00 }, /* Cap sens thresh BL 0 */ + {0x29, 0x04, 0x07 }, /* Cap sens thresh 28-30 */ + {0x31, 0x54, 0x00 }, /* Cap sens Op */ + {0x32, 0x70, 0x00 }, /* Cap Sens Mode, filter 1-1/8, report all */ + {0x33, 0x01, 0x00 }, /* Cap Sens Debounce */ + {0x34, 0x80, 0x00 }, /* Cap Sens Neg Comp Thresh */ + {0x35, 0x80, 0x00 }, /* Cap Sens Pos Comp Thresh */ + {0x36, 0x17, 0x00 }, /* Cap Sens Pos Filt, hyst 2, debounce 4, 1-1/128 */ + {0x37, 0x15, 0x00 }, /* Cap Sens Neg Filt, hyst 2, debounce 4, 1-1/32 */ + {0x38, 0x00, 0x00 }, /* Cap Sens */ + {0x39, 0x00, 0x00 }, /* Cap Sens Frame Skip */ + {0x3A, 0x00, 0x00 }, /* Cap Sens Misc */ + {0x3B, 0x00, 0x00 }, /* Prox Comb Chan Mask */ + {0x3E, 0xFF, 0x00 }, /* SPO Chan Map */ + {0x00, 0x04, 0x00 }, /* Trigger compensation */ +}; + +static struct i2c_touch i2c_touch_list[] = { + {.addr = 0x2b, + .name = "CG300", + .irq_button = 1, + .init_tab = i2c_init_tab_cg300, + .init_tab_len = sizeof(i2c_init_tab_cg300)/sizeof(struct i2c_reg_tab), + }, + + {.addr = 0x2b, + .name = "CG301", + .irq_button = 1, + .init_tab = i2c_init_tab_cg301, + .init_tab_len = sizeof(i2c_init_tab_cg301)/sizeof(struct i2c_reg_tab), + }, + + {.addr = 0x2b, + .name = "EG300", + .irq_button = 1, + .init_tab = i2c_init_tab_eg300, + .init_tab_len = sizeof(i2c_init_tab_eg300)/sizeof(struct i2c_reg_tab), + } +}; + +static void do_init_tab( struct i2c_touch *i2c_touch) +{ + const struct i2c_reg_tab *tab; + int i; + + tab = i2c_touch->init_tab; + + for (i = 0 ; i < i2c_touch->init_tab_len ; i++){ + int y; + int ret; + for ( y = 0 ; y <= tab[i].range; y++ ){ + DBG(3,"%s: addr %02X = %02X ",__func__,(unsigned char)tab[i].addr+y, (unsigned char)tab[i].value); + ret = i2c_smbus_write_byte_data(i2c_touch->dev, tab[i].addr+y, tab[i].value); + if (ret < 0){ + perror("write to i2c dev\n"); + } + } + } +// dump_i2c(i2c_touch->dev,0,13); +} + + +static struct i2c_touch * i2c_init(struct uci_context *uci_ctx, const char* i2c_dev_name, struct i2c_touch* touch_list, int len) +{ + const char *p; + int i; + struct i2c_touch *i2c_touch; + + p = ucix_get_option(uci_ctx, "hw", "board", "hardware"); + if (p == 0){ + syslog(LOG_INFO, "%s: Missing Hardware identifier in configuration. I2C is not started\n",__func__); + return 0; + } + + /* Here we match the hardware name to a init table, and get the + i2c chip address */ + i2c_touch = NULL; + for (i = 0; i < len; i++) { + if (!strcmp(touch_list[i].name, p)) { + DBG(1,"I2C hardware platform %s found.\n", p); + i2c_touch = &touch_list[i]; + break; + } + } + + if (!i2c_touch) { + DBG(1,"No I2C hardware found: %s.\n", p); + return 0; + } + + i2c_touch->dev = i2c_open_dev(i2c_dev_name, i2c_touch->addr, + I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE); + + if (i2c_touch->dev < 0) { + syslog(LOG_INFO,"%s: could not open i2c touch device\n",__func__); + i2c_touch->dev = 0; + return 0; + } + + DBG(1,"Opened device and selected address %x \n", i2c_touch->addr); + + do_init_tab(i2c_touch); + + return i2c_touch; +} + +extern struct uloop_timeout i2c_touch_reset_timer; + + +/* sx9512 needs a reset every 30 minutes. to recalibrate the touch detection */ +#define I2C_RESET_TIME (1000 * 60 * 30) /* 30 min in ms */ +static void sx9512_reset_handler(struct uloop_timeout *timeout); +struct uloop_timeout i2c_touch_reset_timer = { .cb = sx9512_reset_handler }; + +static void sx9512_reset_handler(struct uloop_timeout *timeout) +{ + struct list_head *i; + do_init_tab(i2c_touch_current); + + list_for_each(i, &sx9512_leds) { + struct sx9512_list *node = list_entry(i, struct sx9512_list, list); + sx9512_set_state(node->drv, node->drv->state); + } + + uloop_timeout_set(&i2c_touch_reset_timer, I2C_RESET_TIME); +} + +/* set state regardless of previous state */ +static int sx9512_set_state(struct led_data *p, led_state_t state) +{ + int ret; + int bit = 1 << p->addr; + + ret = i2c_smbus_read_byte_data(i2c_touch_current->dev, SX9512_LEDMAP2); + if (ret < 0 ) + syslog(LOG_ERR, "Could not read from i2c device, LedMap2 register\n"); + + if (state == ON) + ret = ret | bit; + else if (state == OFF) + ret = ret & ~bit; + else{ + syslog(LOG_ERR,"%s: Led %s: Set to not supported state %d\n",__func__, p->led.name, state); + return -1; + } + + p->state = state; + + ret = i2c_smbus_write_byte_data(i2c_touch_current->dev, SX9512_LEDMAP2, ret); + if (ret < 0 ) { + syslog(LOG_ERR, "Could not write to i2c device, LedMap2 register\n"); + return -1; + } + return state; +} + +/* set state if not same as current state */ +static int sx9512_led_set_state(struct led_drv *drv, led_state_t state) +{ + struct led_data *p = (struct led_data *)drv->priv; + + if (!i2c_touch_current || !i2c_touch_current->dev) + return -1; + + if (p->addr > 7){ + DBG(1,"Led %s:with address %d outside range 0-7\n",drv->name, p->addr); + return -1; + } + + if (state == p->state ) { + DBG(3,"skipping set"); + return state; + } + + return sx9512_set_state(p, state); +} + +static led_state_t sx9512_led_get_state(struct led_drv *drv) +{ + struct led_data *p = (struct led_data *)drv->priv; + DBG(1, "state for %s", drv->name); + return p->state; +} + +static struct led_drv_func led_func = { + .set_state = sx9512_led_set_state, + .get_state = sx9512_led_get_state, +}; + +struct button_data { + int addr; + int state; + struct button_drv button; +}; + +void sx9512_check(void) +{ +// DBG(1, "state for %s", drv->name); + + int got_irq = 0; + int ret; + + if (!i2c_touch_current || !i2c_touch_current->dev) + return; + + if (i2c_touch_current->irq_button) { + int button; + button = board_ioctl( BOARD_IOCTL_GET_GPIO, 0, 0, NULL, i2c_touch_current->irq_button, 0); + if (button == 0) + got_irq = 1; + } + if ( got_irq ) { + + ret = i2c_smbus_read_byte_data(i2c_touch_current->dev, SX9512_IRQSRC); + if (ret < 0 ) + syslog(LOG_ERR, "Could not read from i2c device, irq status register\n"); + i2c_touch_current->shadow_irq = ret; + + ret = i2c_smbus_read_byte_data(i2c_touch_current->dev, SX9512_TOUCHSTATUS); + if (ret < 0 ) + syslog(LOG_ERR, "Could not read from i2c device, touch register\n"); + i2c_touch_current->shadow_touch = ret; + + + ret = i2c_smbus_read_byte_data(i2c_touch_current->dev, SX9512_PROXSTATUS); + if (ret < 0 ) + syslog(LOG_ERR, "Could not read from i2c device, proximity register\n"); + i2c_touch_current->shadow_proximity = ret; + } +#if 0 + DEBUG_PRINT("%02x %02x %02x: irq ->", + i2c_touch->shadow_irq , + i2c_touch->shadow_touch, + i2c_touch->shadow_proximity); + + if (i2c_touch->shadow_irq & SX9512_IRQ_RESET ) + DEBUG_PRINT_RAW(" Reset "); + if (i2c_touch->shadow_irq & SX9512_IRQ_TOUCH ) + DEBUG_PRINT_RAW(" Touch "); + if (i2c_touch->shadow_irq & SX9512_IRQ_RELEASE ) + DEBUG_PRINT_RAW(" Release "); + if (i2c_touch->shadow_irq & SX9512_IRQ_NEAR ) + DEBUG_PRINT_RAW(" Near "); + if (i2c_touch->shadow_irq & SX9512_IRQ_FAR ) + DEBUG_PRINT_RAW(" Far "); + if (i2c_touch->shadow_irq & SX9512_IRQ_COM ) + DEBUG_PRINT_RAW(" Com "); + if (i2c_touch->shadow_irq & SX9512_IRQ_CONV ) + DEBUG_PRINT_RAW(" Conv "); + + DEBUG_PRINT_RAW("\n"); +#endif + + return ; +} +/* + button address 0- 7 maps to touch event 0-7 + button address 8 proximity BL0 NEAR + button address 9 proximity BL0 FAR + + return RELEASED = no action on this button + return PRESSED = button pressed + return -1 = error +*/ + +static button_state_t sx9512_button_get_state(struct button_drv *drv) +{ + struct button_data *p = (struct button_data *)drv->priv; + int bit = 1 << p->addr; + + if (!i2c_touch_current || !i2c_touch_current->dev) + return -1; + + if (p->addr < 8) { + if ( bit & i2c_touch_current->shadow_touch ) { + i2c_touch_current->shadow_touch = i2c_touch_current->shadow_touch & ~bit; + p->state = PRESSED; + return PRESSED; + } + + /* if the button was already pressed and we don't have a release irq report it as still pressed */ + if( p->state == PRESSED){ + if (! (i2c_touch_current->shadow_irq & SX9512_IRQ_RELEASE) ) { + return PRESSED; + } + } + p->state = RELEASED; + return RELEASED; + + /* proximity NEAR */ + }else if (p->addr == 8 ) { + bit = 1<<7; + if( i2c_touch_current->shadow_irq & SX9512_IRQ_NEAR ) { + i2c_touch_current->shadow_irq &= ~SX9512_IRQ_NEAR; + if ( bit & i2c_touch_current->shadow_proximity ) { + i2c_touch_current->shadow_proximity = i2c_touch_current->shadow_proximity & ~bit; + p->state = PRESSED; + return PRESSED; + } + } + return RELEASED; + + /* proximity FAR */ + }else if (p->addr == 9) { + if( i2c_touch_current->shadow_irq & SX9512_IRQ_FAR ) { + i2c_touch_current->shadow_irq &= ~SX9512_IRQ_FAR; + p->state = PRESSED; + return PRESSED; + } + return RELEASED; + }else { + DBG(1,"Button address out of range %d\n",p->addr); + return RELEASED; + } +} + +static struct button_drv_func button_func = { + .get_state = sx9512_button_get_state, +}; + + +static void sx9512_button_init(struct server_ctx *s_ctx) +{ + struct ucilist *node; + LIST_HEAD(buttons); + + DBG(1, ""); + + ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"9512_buttons", "buttons", &buttons); + list_for_each_entry(node, &buttons, list) { + struct button_data *data; + const char *s; + + DBG(1, "value = [%s]",node->val); + + data = malloc(sizeof(struct button_data)); + memset(data,0,sizeof(struct button_data)); + + data->button.name = node->val; + + s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->button.name, "addr"); + DBG(1, "addr = [%s]", s); + if (s){ + data->addr = strtol(s,0,0); + } + + data->button.func = &button_func; + data->button.priv = data; + + button_add(&data->button); + } +} + +static void sx9512_led_init(struct server_ctx *s_ctx) { + + LIST_HEAD(leds); + struct ucilist *node; + + DBG(1, ""); + + ucix_get_option_list(s_ctx->uci_ctx, "hw" ,"9512_leds", "leds", &leds); + list_for_each_entry(node,&leds,list){ + struct led_data *data; + const char *s; + + DBG(1, "value = [%s]",node->val); + + data = malloc(sizeof(struct led_data)); + memset(data,0,sizeof(struct led_data)); + + data->led.name = node->val; + + s = ucix_get_option(s_ctx->uci_ctx, "hw" , data->led.name, "addr"); + DBG(1, "addr = [%s]", s); + if (s) { + data->addr = strtol(s,0,0); + } + + data->led.func = &led_func; + data->led.priv = data; + led_add(&data->led); + + { /* save leds in internal list, we need this for handling reset, we need to restore state */ + struct sx9512_list *ll = malloc(sizeof(struct sx9512_list)); + memset(ll, 0, sizeof( struct sx9512_list)); + ll->drv = data; + list_add(&ll->list, &sx9512_leds); + } + + + } +} + +void sx9512_init(struct server_ctx *s_ctx) { + + struct list_head *i; + + DBG(1, ""); + + i2c_touch_current = i2c_init(s_ctx->uci_ctx, + "/dev/i2c-0", + i2c_touch_list, + sizeof(i2c_touch_list)/sizeof(i2c_touch_list[0])); + + if (i2c_touch_current != 0) { + + sx9512_button_init(s_ctx); + sx9512_led_init(s_ctx); + + /* Force set of initial state for leds. */ + list_for_each(i, &sx9512_leds) { + struct sx9512_list *node = list_entry(i, struct sx9512_list, list); + sx9512_set_state(node->drv, node->drv->state); + } + + /* start reset timer */ + uloop_timeout_set(&i2c_touch_reset_timer, I2C_RESET_TIME); + } +} + diff --git a/peripheral_manager/src/src/touch_sx9512.h b/peripheral_manager/src/src/touch_sx9512.h new file mode 100644 index 000000000..27930df4a --- /dev/null +++ b/peripheral_manager/src/src/touch_sx9512.h @@ -0,0 +1,9 @@ +#ifndef TOUCH_SX9512_H +#define TOUCH_SX9512_H + +#include "server.h" + +void sx9512_init(struct server_ctx *); +void sx9512_check(void); + +#endif /* TOUCH_SX9512_H */ diff --git a/peripheral_manager/src/src/ucix.c b/peripheral_manager/src/src/ucix.c new file mode 100644 index 000000000..b49e83680 --- /dev/null +++ b/peripheral_manager/src/src/ucix.c @@ -0,0 +1,176 @@ +/* + * ucix + * Copyright (C) 2010 John Crispin + * Copyright (C) 2010 Steven Barth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include +#include + +#include "ucix.h" + +struct uci_ptr uci_ptr; + +int ucix_get_ptr(struct uci_context *ctx, const char *p, const char *s, const char *o, const char *t) +{ + memset(&uci_ptr, 0, sizeof(uci_ptr)); + uci_ptr.package = p; + uci_ptr.section = s; + uci_ptr.option = o; + uci_ptr.value = t; + return uci_lookup_ptr(ctx, &uci_ptr, NULL, true); +} + +struct uci_context* ucix_init(const char *config_file, int state) +{ + struct uci_context *ctx = uci_alloc_context(); + uci_set_confdir(ctx, "/etc/config"); + if(state) + uci_set_savedir(ctx, "/var/state/"); + else + uci_set_savedir(ctx, "/tmp/.uci/"); + if(uci_load(ctx, config_file, NULL) != UCI_OK) + { + printf("%s/%s is missing or corrupt\n", ctx->confdir, config_file); + return NULL; + } + return ctx; +} + +struct uci_context* ucix_init_path(const char *vpath, const char *config_file, int state) +{ + struct uci_context *ctx; + char buf[256]; + if(!vpath) + return ucix_init(config_file, state); + ctx = uci_alloc_context(); + buf[255] = '\0'; + snprintf(buf, 255, "%s", vpath); + uci_set_confdir(ctx, buf); +// snprintf(buf, 255, "%s%s", vpath, (state)?("/var/state"):("/tmp/.uci")); +// uci_add_delta_path(ctx, buf); + if(uci_load(ctx, config_file, NULL) != UCI_OK) + { + printf("%s/%s is missing or corrupt\n", ctx->confdir, config_file); + return NULL; + } + return ctx; +} + +int ucix_get_option_list(struct uci_context *ctx, const char *p, + const char *s, const char *o, struct list_head *l) +{ + struct uci_element *e = NULL; + if(ucix_get_ptr(ctx, p, s, o, NULL)) + return 1; + if (!(uci_ptr.flags & UCI_LOOKUP_COMPLETE)) + return 1; + e = uci_ptr.last; + switch (e->type) + { + case UCI_TYPE_OPTION: + switch(uci_ptr.o->type) { + case UCI_TYPE_LIST: + uci_foreach_element(&uci_ptr.o->v.list, e) + { + struct ucilist *ul = malloc(sizeof(struct ucilist)); + ul->val = strdup((e->name)?(e->name):("")); + list_add_tail(&ul->list, l); + } + break; + default: + break; + } + break; + default: + return 1; + } + + return 0; +} + +char* ucix_get_option(struct uci_context *ctx, const char *p, const char *s, const char *o) +{ + struct uci_element *e = NULL; + const char *value = NULL; + if(ucix_get_ptr(ctx, p, s, o, NULL)) + return NULL; + if (!(uci_ptr.flags & UCI_LOOKUP_COMPLETE)) + return NULL; + e = uci_ptr.last; + switch (e->type) + { + case UCI_TYPE_SECTION: + value = uci_to_section(e)->type; + break; + case UCI_TYPE_OPTION: + switch(uci_ptr.o->type) { + case UCI_TYPE_STRING: + value = uci_ptr.o->v.string; + break; + default: + value = NULL; + break; + } + break; + default: + return 0; + } + + return (value) ? (strdup(value)):(NULL); +} + +void ucix_add_list(struct uci_context *ctx, const char *p, const char *s, const char *o, struct list_head *vals) +{ + struct list_head *q; + list_for_each(q, vals) + { + struct ucilist *ul = container_of(q, struct ucilist, list); + if(ucix_get_ptr(ctx, p, s, o, (ul->val)?(ul->val):(""))) + return; + uci_add_list(ctx, &uci_ptr); + } +} + +void ucix_for_each_section_type(struct uci_context *ctx, + const char *p, const char *t, + void (*cb)(const char*, void*), void *priv) +{ + struct uci_element *e; + if(ucix_get_ptr(ctx, p, NULL, NULL, NULL)) + return; + uci_foreach_element(&uci_ptr.p->sections, e) + if (!strcmp(t, uci_to_section(e)->type)) + cb(e->name, priv); +} + +void ucix_for_each_section_option(struct uci_context *ctx, + const char *p, const char *s, + void (*cb)(const char*, const char*, void*), void *priv) +{ + struct uci_element *e; + if(ucix_get_ptr(ctx, p, s, NULL, NULL)) + return; + uci_foreach_element(&uci_ptr.s->options, e) + { + struct uci_option *o = uci_to_option(e); + cb(o->e.name, o->v.string, priv); + } +} + + diff --git a/peripheral_manager/src/src/ucix.h b/peripheral_manager/src/src/ucix.h new file mode 100644 index 000000000..52e70672d --- /dev/null +++ b/peripheral_manager/src/src/ucix.h @@ -0,0 +1,140 @@ +/* + * ucix + * Copyright (C) 2010 John Crispin + * Copyright (C) 2010 Steven Barth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _UCI_H__ +#define _UCI_H__ +#include +#include +#include + +#ifndef uci_to_delta +// Support older version of uci, where this function was named +// differently +#define uci_add_delta_path uci_add_history_path +#endif + +struct ucilist { + struct list_head list; + char *val; +}; + +extern struct uci_ptr uci_ptr; + +int ucix_get_ptr(struct uci_context *ctx, const char *p, + const char *s, const char *o, const char *t); +struct uci_context* ucix_init(const char *config_file, int state); +struct uci_context* ucix_init_path(const char *vpath, const char *config_file, int state); +int ucix_save_state(struct uci_context *ctx, const char *p); +char* ucix_get_option(struct uci_context *ctx, + const char *p, const char *s, const char *o); +int ucix_get_option_list(struct uci_context *ctx, const char *p, + const char *s, const char *o, struct list_head *l); +void ucix_for_each_section_type(struct uci_context *ctx, + const char *p, const char *t, + void (*cb)(const char*, void*), void *priv); +void ucix_for_each_section_option(struct uci_context *ctx, + const char *p, const char *s, + void (*cb)(const char*, const char*, void*), void *priv); +void ucix_add_list(struct uci_context *ctx, const char *p, + const char *s, const char *o, struct list_head *vals); + +static inline void ucix_del(struct uci_context *ctx, const char *p, const char *s, const char *o) +{ + if (!ucix_get_ptr(ctx, p, s, o, NULL)) + uci_delete(ctx, &uci_ptr); +} + +static inline void ucix_revert(struct uci_context *ctx, const char *p, const char *s, const char *o) +{ + if (!ucix_get_ptr(ctx, p, s, o, NULL)) + uci_revert(ctx, &uci_ptr); +} + +static inline void ucix_add_list_single(struct uci_context *ctx, const char *p, const char *s, const char *o, const char *t) +{ + if (ucix_get_ptr(ctx, p, s, o, t)) + return; + uci_add_list(ctx, &uci_ptr); +} + +static inline void ucix_add_option(struct uci_context *ctx, const char *p, const char *s, const char *o, const char *t) +{ + if (ucix_get_ptr(ctx, p, s, o, t)) + return; + uci_set(ctx, &uci_ptr); +} + +static inline void ucix_add_section(struct uci_context *ctx, const char *p, const char *s, const char *t) +{ + if(ucix_get_ptr(ctx, p, s, NULL, t)) + return; + uci_set(ctx, &uci_ptr); +} + +static inline void ucix_add_option_int(struct uci_context *ctx, const char *p, const char *s, const char *o, int t) +{ + char tmp[64]; + snprintf(tmp, 64, "%d", t); + ucix_add_option(ctx, p, s, o, tmp); +} + +static inline void ucix_add_list_single_int(struct uci_context *ctx, const char *p, const char *s, const char *o, const int t) +{ + char tmp[64]; + snprintf(tmp, 64, "%d", t); + ucix_add_list_single(ctx, p, s, o, tmp); +} + +static inline int ucix_get_option_int(struct uci_context *ctx, const char *p, const char *s, const char *o, int def) +{ + char *tmp = ucix_get_option(ctx, p, s, o); + int ret = def; + + if (tmp) + { + ret = atoi(tmp); + free(tmp); + } + return ret; +} + +static inline int ucix_save(struct uci_context *ctx, const char *p) +{ + if(ucix_get_ptr(ctx, p, NULL, NULL, NULL)) + return 1; + uci_save(ctx, uci_ptr.p); + return 0; +} + +static inline int ucix_commit(struct uci_context *ctx, const char *p) +{ + if(ucix_get_ptr(ctx, p, NULL, NULL, NULL)) + return 1; + return uci_commit(ctx, &uci_ptr.p, false); +} + +static inline void ucix_cleanup(struct uci_context *ctx) +{ + uci_free_context(ctx); +} + + +#endif diff --git a/questd/files/etc/init.d/quest b/questd/files/etc/init.d/quest index d85ea81da..f644aba71 100755 --- a/questd/files/etc/init.d/quest +++ b/questd/files/etc/init.d/quest @@ -2,20 +2,14 @@ START=14 -USE_PROCD=1 -NAME=questd -PROG=/sbin/questd +SERVICE_DAEMONIZE=1 +SERVICE_WRITE_PID=1 -start_service() { - procd_open_instance - procd_set_param command "$PROG" - procd_close_instance +start() { + service_start /sbin/questd } stop() { service_stop /sbin/questd } -reload() { - service_reload /sbin/questd -} diff --git a/questd/src/Makefile b/questd/src/Makefile index e2f7cac0c..4584a171d 100644 --- a/questd/src/Makefile +++ b/questd/src/Makefile @@ -2,8 +2,8 @@ CC = gcc CFLAGS = -g -Wall LOCLIBS = LIBS = -luci -lubus -lubox -lpthread -OBJS = questd.o dumper.o port.o arping.o usb.o ndisc.o dslstats.o -SRCS = questd.c dumper.c port.c arping.c usb.c ndisc.c dslstats.c +OBJS = questd.o dumper.o port.o arping.o usb.o ndisc.o +SRCS = questd.c dumper.c port.c arping.c usb.c ndisc.c LIBSRCS = ISRCS = questd.h diff --git a/questd/src/arp.c b/questd/src/arping.c similarity index 84% rename from questd/src/arp.c rename to questd/src/arping.c index 6a22fc0b6..e5c7d68fa 100644 --- a/questd/src/arp.c +++ b/questd/src/arping.c @@ -1,3 +1,22 @@ +/* + * arping -- arping tool for questd + * + * Author: Alexey Kuznetsov + * Author: Sukru Senli sukru.senli@inteno.se + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; If not, see . + */ + #include #include #include @@ -149,9 +168,7 @@ arping(char *targetIP, char *device) cc = recvfrom(sock_fd, packet, sizeof(packet), 0, (struct sockaddr *) &from, &alen); } - if (cc < 0) - perror("recvfrom"); - else + if (cc >= 0) connected = recv_pack(packet, cc, &from); close(sock_fd); diff --git a/questd/src/ndisc.c b/questd/src/ndisc.c new file mode 100644 index 000000000..bbbab31aa --- /dev/null +++ b/questd/src/ndisc.c @@ -0,0 +1,507 @@ +/* + * ndisc.c - ICMPv6 neighbour discovery command line tool + * + * Author: Rémi Denis-Courmont + * questd port: Sukru Senli sukru.senli@inteno.se + * + * Copyright © 2004-2007 Rémi Denis-Courmont. + * This program is free software: you can redistribute and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, versions 2 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include /* div() */ +#include /* uint8_t */ +#include /* UINT_MAX */ +#include +#include + +#include /* EMFILE */ +#include +#include /* close() */ +#include /* clock_gettime() */ +#include /* poll() */ +#include +#include +#include + +#include /* times() fallback */ + +#include /* getaddrinfo() */ +#include /* inet_ntop() */ +#include /* if_nametoindex() */ + +#include +#include + +#ifndef IPV6_RECVHOPLIMIT +/* Using obsolete RFC 2292 instead of RFC 3542 */ +# define IPV6_RECVHOPLIMIT IPV6_HOPLIMIT +#endif + +#ifndef AI_IDN +# define AI_IDN 0 +#endif + +enum ndisc_flags +{ + NDISC_VERBOSE1=0x1, + NDISC_VERBOSE2=0x2, + NDISC_VERBOSE3=0x3, + NDISC_VERBOSE =0x3, + NDISC_NUMERIC =0x4, + NDISC_SINGLE =0x8, +}; + +#if defined (CLOCK_HIGHRES) && !defined (CLOCK_MONOTONIC) +# define CLOCK_MONOTONIC CLOCK_HIGHRES +#endif + +static inline void +mono_gettime (struct timespec *ts) +{ +#ifdef CLOCK_MONOTONIC + if (clock_gettime (CLOCK_MONOTONIC, ts)) +#endif + { + static long freq = 0; + if (freq == 0) + freq = sysconf (_SC_CLK_TCK); + + struct tms dummy; + clock_t t = times (&dummy); + ts->tv_sec = t / freq; + ts->tv_nsec = (t % freq) * (1000000000 / freq); + } +} + + +static int +getipv6byname (const char *name, const char *ifname, int numeric, struct sockaddr_in6 *addr) +{ + struct addrinfo hints, *res; + memset (&hints, 0, sizeof (hints)); + hints.ai_family = PF_INET6; + hints.ai_socktype = SOCK_DGRAM; /* dummy */ + hints.ai_flags = numeric ? AI_NUMERICHOST : 0; + + int val = getaddrinfo (name, NULL, &hints, &res); + if (val) + { + fprintf (stderr, "%s: %s\n", name, gai_strerror (val)); + return -1; + } + + memcpy (addr, res->ai_addr, sizeof (struct sockaddr_in6)); + freeaddrinfo (res); + + val = if_nametoindex (ifname); + if (val == 0) + { + perror (ifname); + return -1; + } + addr->sin6_scope_id = val; + + return 0; +} + + +static inline int +sethoplimit (int fd, int value) +{ + return (setsockopt (fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, + &value, sizeof (value)) + || setsockopt (fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, + &value, sizeof (value))) ? -1 : 0; +} + + +static char MACADDR[24]; + +void +clear_macaddr() { + memset(MACADDR, '\0', sizeof(MACADDR)); +} + +char * +get_macaddr() +{ + return MACADDR; +} + + +static void +printmacaddress (const uint8_t *ptr, size_t len) +{ + char mac[4]; + while (len > 1) + { + sprintf(mac, "%02X:", *ptr); + strcat(MACADDR, mac); + ptr++; + len--; + } + + if (len == 1) { + sprintf(mac, "%02X", *ptr); + strcat(MACADDR, mac); + } +} + + +# ifdef __linux__ +# include +# endif + +static int +getmacaddress (const char *ifname, uint8_t *addr) +{ +# ifdef SIOCGIFHWADDR + struct ifreq req; + memset (&req, 0, sizeof (req)); + + if (((unsigned)strlen (ifname)) >= (unsigned)IFNAMSIZ) + return -1; /* buffer overflow = local root */ + strcpy (req.ifr_name, ifname); + + int fd = socket (AF_INET6, SOCK_DGRAM, 0); + if (fd == -1) + return -1; + + if (ioctl (fd, SIOCGIFHWADDR, &req)) + { + perror (ifname); + close (fd); + return -1; + } + close (fd); + + memcpy (addr, req.ifr_hwaddr.sa_data, 6); + return 0; +# else + (void)ifname; + (void)addr; + return -1; +# endif +} + + +static const uint8_t nd_type_advert = ND_NEIGHBOR_ADVERT; +static const unsigned nd_delay_ms = 1000; +static const unsigned ndisc_default = NDISC_VERBOSE1 | NDISC_SINGLE; + + +typedef struct +{ + struct nd_neighbor_solicit hdr; + struct nd_opt_hdr opt; + uint8_t hw_addr[6]; +} solicit_packet; + + +static ssize_t +buildsol (solicit_packet *ns, struct sockaddr_in6 *tgt, const char *ifname) +{ + /* builds ICMPv6 Neighbor Solicitation packet */ + ns->hdr.nd_ns_type = ND_NEIGHBOR_SOLICIT; + ns->hdr.nd_ns_code = 0; + ns->hdr.nd_ns_cksum = 0; /* computed by the kernel */ + ns->hdr.nd_ns_reserved = 0; + memcpy (&ns->hdr.nd_ns_target, &tgt->sin6_addr, 16); + + /* determines actual multicast destination address */ + memcpy (tgt->sin6_addr.s6_addr, "\xff\x02\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x01\xff", 13); + + /* gets our own interface's link-layer address (MAC) */ + if (getmacaddress (ifname, ns->hw_addr)) + return sizeof (ns->hdr); + + ns->opt.nd_opt_type = ND_OPT_SOURCE_LINKADDR; + ns->opt.nd_opt_len = 1; /* 8 bytes */ + return sizeof (*ns); +} + + +static int +parseadv (const uint8_t *buf, size_t len, const struct sockaddr_in6 *tgt, bool verbose) +{ + const struct nd_neighbor_advert *na = + (const struct nd_neighbor_advert *)buf; + const uint8_t *ptr; + + /* checks if the packet is a Neighbor Advertisement, and + * if the target IPv6 address is the right one */ + if ((len < sizeof (struct nd_neighbor_advert)) + || (na->nd_na_type != ND_NEIGHBOR_ADVERT) + || (na->nd_na_code != 0) + || memcmp (&na->nd_na_target, &tgt->sin6_addr, 16)) + return -1; + + len -= sizeof (struct nd_neighbor_advert); + + /* looks for Target Link-layer address option */ + ptr = buf + sizeof (struct nd_neighbor_advert); + + while (len >= 8) + { + uint16_t optlen; + + optlen = ((uint16_t)(ptr[1])) << 3; + if (optlen == 0) + break; /* invalid length */ + + if (len < optlen) /* length > remaining bytes */ + break; + len -= optlen; + + + /* skips unrecognized option */ + if (ptr[0] != ND_OPT_TARGET_LINKADDR) + { + ptr += optlen; + continue; + } + + /* Found! displays link-layer address */ + ptr += 2; + optlen -= 2; + if (verbose) + fputs ("Target link-layer address: ", stdout); + + printmacaddress (ptr, optlen); + return 0; + } + + return -1; +} +static ssize_t +recvfromLL (int fd, void *buf, size_t len, int flags, struct sockaddr_in6 *addr) +{ + char cbuf[CMSG_SPACE (sizeof (int))]; + struct iovec iov = + { + .iov_base = buf, + .iov_len = len + }; + struct msghdr hdr = + { + .msg_name = addr, + .msg_namelen = sizeof (*addr), + .msg_iov = &iov, + .msg_iovlen = 1, + .msg_control = cbuf, + .msg_controllen = sizeof (cbuf) + }; + + ssize_t val = recvmsg (fd, &hdr, flags); + if (val == -1) + return val; + + /* ensures the hop limit is 255 */ + struct cmsghdr *cmsg; + for (cmsg = CMSG_FIRSTHDR (&hdr); + cmsg != NULL; + cmsg = CMSG_NXTHDR (&hdr, cmsg)) + { + if ((cmsg->cmsg_level == IPPROTO_IPV6) + && (cmsg->cmsg_type == IPV6_HOPLIMIT)) + { + if (255 != *(int *)CMSG_DATA (cmsg)) + { + // pretend to be a spurious wake-up + errno = EAGAIN; + return -1; + } + } + } + + return val; +} + + +static ssize_t +recvadv (int fd, const struct sockaddr_in6 *tgt, unsigned wait_ms, unsigned flags) +{ + struct timespec now, end; + unsigned responses = 0; + + /* computes deadline time */ + mono_gettime (&now); + { + div_t d; + + d = div (wait_ms, 1000); + end.tv_sec = now.tv_sec + d.quot; + end.tv_nsec = now.tv_nsec + (d.rem * 1000000); + } + + /* receive loop */ + for (;;) + { + /* waits for reply until deadline */ + ssize_t val = 0; + if (end.tv_sec >= now.tv_sec) + { + val = (end.tv_sec - now.tv_sec) * 1000 + + (int)((end.tv_nsec - now.tv_nsec) / 1000000); + if (val < 0) + val = 0; + } + + val = poll (&(struct pollfd){ .fd = fd, .events = POLLIN }, 1, val); + if (val < 0) + break; + + if (val == 0) + return responses; + + /* receives an ICMPv6 packet */ + // TODO: use interface MTU as buffer size + union + { + uint8_t b[1460]; + uint64_t align; + } buf; + struct sockaddr_in6 addr; + + val = recvfromLL (fd, &buf, sizeof (buf), MSG_DONTWAIT, &addr); + if (val == -1) + { + if (errno != EAGAIN) + perror ("Receiving ICMPv6 packet"); + continue; + } + + /* ensures the response came through the right interface */ + if (addr.sin6_scope_id + && (addr.sin6_scope_id != tgt->sin6_scope_id)) + continue; + + if (parseadv (buf.b, val, tgt, (flags & NDISC_VERBOSE) != 0) == 0) + { + if (flags & NDISC_VERBOSE) + { + char str[INET6_ADDRSTRLEN]; + + if (inet_ntop (AF_INET6, &addr.sin6_addr, str, + sizeof (str)) != NULL) + printf (" from %s\n", str); + } + + if (responses < INT_MAX) + responses++; + + if (flags & NDISC_SINGLE) + return 1 /* = responses */; + } + mono_gettime (&now); + } + + return -1; /* error */ +} + +bool +ndisc (const char *name, const char *ifname, unsigned flags, unsigned retry, unsigned wait_ms) +{ + struct sockaddr_in6 tgt; + + int fd = socket (PF_INET6, SOCK_RAW, IPPROTO_ICMPV6); + + if (fd == -1) + { + perror ("Raw IPv6 socket"); + return false; + } + + fcntl (fd, F_SETFD, FD_CLOEXEC); + + /* set ICMPv6 filter */ + { + struct icmp6_filter f; + + ICMP6_FILTER_SETBLOCKALL (&f); + ICMP6_FILTER_SETPASS (nd_type_advert, &f); + setsockopt (fd, IPPROTO_ICMPV6, ICMP6_FILTER, &f, sizeof (f)); + } + + setsockopt (fd, SOL_SOCKET, SO_DONTROUTE, &(int){ 1 }, sizeof (int)); + + /* sets Hop-by-hop limit to 255 */ + sethoplimit (fd, 255); + setsockopt (fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, + &(int){ 1 }, sizeof (int)); + + /* resolves target's IPv6 address */ + if (getipv6byname (name, ifname, (flags & NDISC_NUMERIC) ? 1 : 0, &tgt)) + goto error; + else + { + char s[INET6_ADDRSTRLEN]; + + inet_ntop (AF_INET6, &tgt.sin6_addr, s, sizeof (s)); + if (flags & NDISC_VERBOSE) + printf ("Soliciting %s (%s) on %s...\n", name, s, ifname); + } + + { + solicit_packet packet; + struct sockaddr_in6 dst; + ssize_t plen; + + memcpy (&dst, &tgt, sizeof (dst)); + plen = buildsol (&packet, &dst, ifname); + if (plen == -1) + goto error; + + while (retry > 0) + { + /* sends a Solitication */ + if (sendto (fd, &packet, plen, 0, + (const struct sockaddr *)&dst, + sizeof (dst)) != plen) + { + //perror ("Sending ICMPv6 packet"); + goto error; + } + retry--; + + /* receives an Advertisement */ + ssize_t val = recvadv (fd, &tgt, wait_ms, flags); + if (val > 0) + { + close (fd); + return true; + } + else + if (val == 0) + { + if (flags & NDISC_VERBOSE) + puts ("Timed out."); + } + else + goto error; + } + } + + close (fd); + if (flags & NDISC_VERBOSE) + puts ("No response."); + return false; + +error: + close (fd); + return false; +} + diff --git a/questd/src/questd.c b/questd/src/questd.c index a0cc88600..66bac3112 100644 --- a/questd/src/questd.c +++ b/questd/src/questd.c @@ -48,6 +48,7 @@ static Key keys; static Spec spec; static USB usb[MAX_USB]; + /* POLICIES */ enum { QUEST_NAME, @@ -346,32 +347,20 @@ handle_client(Client *clnt) } static bool -wireless_sta(Client *clnt, Detail *dtl) +wireless_sta(Client *clnt) { FILE *stainfo; char cmnd[64]; char line[128]; int i = 0; bool there = false; - char tab[16]; - int ret, tmp; for (i = 0; wireless[i].device; i++) { - sprintf(cmnd, "wlctl -i %s sta_info %s 2>/dev/null", wireless[i].vif, clnt->macaddr); + sprintf(cmnd, "wlctl -i %s sta_info %s 2>/dev/null | grep ASSOCIATED", wireless[i].vif, clnt->macaddr); if ((stainfo = popen(cmnd, "r"))) { - while(fgets(line, sizeof(line), stainfo) != NULL) - { - remove_newline(line); - if(sscanf(line, "%sstate: AUTHENTICATED ASSOCIATED AUTHORIZED", tab)) { - there = true; - strncpy(clnt->wdev, wireless[i].vif, sizeof(clnt->wdev)); - } - ret = sscanf(line, "\t idle %d seconds", &(dtl->idle)); - ret = sscanf(line, "\t in network %d seconds", &(dtl->in_network)); - ret = sscanf(line, "\t tx total bytes: %ld\n", &(dtl->tx_bytes)); - ret = sscanf(line, "\t rx data bytes: %ld", &(dtl->rx_bytes)); - ret = sscanf(line, "\t rate of last tx pkt: %d kbps - %d kbps", &tmp, &(dtl->tx_rate)); - ret = sscanf(line, "\t rate of last rx pkt: %d kbps", &(dtl->rx_rate)); + if(fgets(line, sizeof(line), stainfo) != NULL) { + there = true; + strncpy(clnt->wdev, wireless[i].vif, sizeof(clnt->wdev)); } pclose(stainfo); } @@ -393,7 +382,6 @@ populate_clients() char mask[64]; int i; bool there; - int toms = 1000; memset(clients_new, '\0', sizeof(clients)); @@ -408,10 +396,10 @@ populate_clients() clients[cno].exists = true; clients[cno].dhcp = true; handle_client(&clients[cno]); - if((clients[cno].connected = wireless_sta(&clients[cno], &details[cno]))) + if((clients[cno].connected = wireless_sta(&clients[cno]))) clients[cno].wireless = true; - else if(!(clients[cno].connected = arping(clients[cno].hostaddr, clients[cno].device, toms))) - recalc_sleep_time(true, toms); + else + clients[cno].connected = arping(clients[cno].hostaddr, clients[cno].device); cno++; } } @@ -446,10 +434,10 @@ populate_clients() if(clients[cno].local) { clients[cno].exists = true; clients[cno].dhcp = false; - if((clients[cno].connected = wireless_sta(&clients[cno], &details[cno]))) + if((clients[cno].connected = wireless_sta(&clients[cno]))) clients[cno].wireless = true; - else if(!(clients[cno].connected = arping(clients[cno].hostaddr, clients[cno].device, toms))) - recalc_sleep_time(true, toms); + else + clients[cno].connected = arping(clients[cno].hostaddr, clients[cno].device); cno++; } } @@ -496,7 +484,6 @@ populate_clients6() char line[512]; int cno = 0; int iaid, ts, id, length; - int toms = 500; if ((hosts6 = fopen("/tmp/hosts/6relayd", "r"))) { while(fgets(line, sizeof(line), hosts6) != NULL) @@ -505,11 +492,11 @@ populate_clients6() clients6[cno].exists = false; clients6[cno].wireless = false; memset(clients6[cno].hostname, '\0', 64); - if (sscanf(line, "# %s %s %x %s %d %x %d %s", clients6[cno].device, clients6[cno].duid, iaid, clients6[cno].hostname, &ts, &id, &length, clients6[cno].ip6addr)) { + if (sscanf(line, "# %s %s %d %s %d %x %d %s", clients6[cno].device, clients6[cno].duid, &iaid, clients6[cno].hostname, &ts, &id, &length, clients6[cno].ip6addr)) { clients6[cno].exists = true; clear_macaddr(); - if(!(clients6[cno].connected = ndisc (clients6[cno].hostname, clients6[cno].device, 0x8, 1, toms))) - recalc_sleep_time(true, toms); + if(!(clients6[cno].connected = ndisc (clients6[cno].hostname, clients6[cno].device, 0x8, 1, 500))) + recalc_sleep_time(true, 500000); sprintf(clients6[cno].macaddr, get_macaddr()); if(clients6[cno].connected && wireless_sta6(&clients6[cno])) clients6[cno].wireless = true; @@ -692,12 +679,6 @@ router_dump_clients(struct blob_buf *b) blobmsg_add_u8(b, "wireless", clients[i].wireless); if(clients[i].wireless) { blobmsg_add_string(b, "wdev", clients[i].wdev); - blobmsg_add_u32(b, "idle", details[i].idle); - blobmsg_add_u32(b, "in_network", details[i].in_network); - blobmsg_add_u64(b, "tx_bytes", details[i].tx_bytes); - blobmsg_add_u64(b, "rx_bytes", details[i].rx_bytes); - blobmsg_add_u32(b, "tx_rate", details[i].tx_rate); - blobmsg_add_u32(b, "rx_rate", details[i].rx_rate); } blobmsg_close_table(b, t); num++; @@ -728,12 +709,6 @@ router_dump_connected_clients(struct blob_buf *b) blobmsg_add_u8(b, "wireless", clients[i].wireless); if(clients[i].wireless) { blobmsg_add_string(b, "wdev", clients[i].wdev); - blobmsg_add_u32(b, "idle", details[i].idle); - blobmsg_add_u32(b, "in_network", details[i].in_network); - blobmsg_add_u64(b, "tx_bytes", details[i].tx_bytes); - blobmsg_add_u64(b, "rx_bytes", details[i].rx_bytes); - blobmsg_add_u32(b, "tx_rate", details[i].tx_rate); - blobmsg_add_u32(b, "rx_rate", details[i].rx_rate); } blobmsg_close_table(b, t); num++; @@ -765,12 +740,6 @@ router_dump_network_clients(struct blob_buf *b, char *net) blobmsg_add_u8(b, "wireless", clients[i].wireless); if(clients[i].wireless) { blobmsg_add_string(b, "wdev", clients[i].wdev); - blobmsg_add_u32(b, "idle", details[i].idle); - blobmsg_add_u32(b, "in_network", details[i].in_network); - blobmsg_add_u64(b, "tx_bytes", details[i].tx_bytes); - blobmsg_add_u64(b, "rx_bytes", details[i].rx_bytes); - blobmsg_add_u32(b, "tx_rate", details[i].tx_rate); - blobmsg_add_u32(b, "rx_rate", details[i].rx_rate); } blobmsg_close_table(b, t); num++; @@ -857,12 +826,6 @@ router_dump_stas(struct blob_buf *b) if(strstr(clients[i].device, "br-")) blobmsg_add_string(b, "bridge", clients[i].device); blobmsg_add_string(b, "wdev", clients[i].wdev); - blobmsg_add_u32(b, "idle", details[i].idle); - blobmsg_add_u32(b, "in_network", details[i].in_network); - blobmsg_add_u64(b, "tx_bytes", details[i].tx_bytes); - blobmsg_add_u64(b, "rx_bytes", details[i].rx_bytes); - blobmsg_add_u32(b, "tx_rate", details[i].tx_rate); - blobmsg_add_u32(b, "rx_rate", details[i].rx_rate); blobmsg_close_table(b, t); num++; } @@ -903,12 +866,6 @@ router_dump_wireless_stas(struct blob_buf *b, char *wname, bool vif) blobmsg_add_string(b, "bridge", clients[i].device); if(!vif) blobmsg_add_string(b, "wdev", clients[i].wdev); - blobmsg_add_u32(b, "idle", details[i].idle); - blobmsg_add_u32(b, "in_network", details[i].in_network); - blobmsg_add_u64(b, "tx_bytes", details[i].tx_bytes); - blobmsg_add_u64(b, "rx_bytes", details[i].rx_bytes); - blobmsg_add_u32(b, "tx_rate", details[i].tx_rate); - blobmsg_add_u32(b, "rx_rate", details[i].rx_rate); blobmsg_close_table(b, t); num++; } @@ -1420,15 +1377,14 @@ quest_reload(struct ubus_context *ctx, struct ubus_object *obj, static struct ubus_method router_object_methods[] = { UBUS_METHOD_NOARG("info", quest_router_info), UBUS_METHOD("quest", quest_router_specific, quest_policy), - UBUS_METHOD_NOARG("networks", quest_router_networks), - UBUS_METHOD_NOARG("dslstats", dslstats_rpc), + { .name = "networks", .handler = quest_router_networks }, UBUS_METHOD("client", quest_router_network_clients, network_policy), - UBUS_METHOD_NOARG("clients", quest_router_clients), - UBUS_METHOD_NOARG("clients6", quest_router_clients6), - UBUS_METHOD_NOARG("connected", quest_router_connected_clients), - UBUS_METHOD_NOARG("connected6", quest_router_connected_clients6), + { .name = "clients", .handler = quest_router_clients }, + { .name = "clients6", .handler = quest_router_clients6 }, + { .name = "connected", .handler = quest_router_connected_clients }, + { .name = "connected6", .handler = quest_router_connected_clients6 }, UBUS_METHOD("sta", quest_router_wireless_stas, wl_policy), - UBUS_METHOD_NOARG("stas", quest_router_stas), + { .name = "stas", .handler = quest_router_stas }, UBUS_METHOD("ports", quest_router_ports, network_policy), UBUS_METHOD("leases", quest_network_leases, network_policy), UBUS_METHOD("host", quest_host_status, host_policy), diff --git a/questd/src/questd.h b/questd/src/questd.h index 17b463f24..2cfbb16b6 100644 --- a/questd/src/questd.h +++ b/questd/src/questd.h @@ -12,16 +12,6 @@ #include - -#include -#include -#include -#include - -#include - -#include "dslstats.h" - #define MAX_VIF 8 #define MAX_NETWORK 16 #define MAX_CLIENT 128 @@ -35,16 +25,6 @@ typedef struct { const char *network; } Wireless; -typedef struct { - int idle; - int in_network; - long tx_bytes; - long rx_bytes; - int tx_rate; - int rx_rate; - int rssi; -} Detail; - typedef struct { bool exists; bool local;