Author: marcus Date: Thu Feb 26 12:06:57 2009 GMT Module: SOURCES Tag: HEAD ---- Log message: - init script and example config for mISDN
---- Files affected: SOURCES: mISDN.init (NONE -> 1.1) (NEW), misdn-init.conf (NONE -> 1.1) (NEW) ---- Diffs: ================================================================ Index: SOURCES/mISDN.init diff -u /dev/null SOURCES/mISDN.init:1.1 --- /dev/null Thu Feb 26 13:06:57 2009 +++ SOURCES/mISDN.init Thu Feb 26 13:06:51 2009 @@ -0,0 +1,692 @@ +#!/bin/bash + +################################################################################ +# +# misdn-init init script +# +# Copyright (C) 2005, Nadi Sarrar +# +# Nadi Sarrar <[email protected]> +# +# This program is free software, distributed under the terms of +# the GNU General Public License +# + +# +# USAGE: +# +# /usr/sbin/misdn-init start|stop|restart|config|scan|help +# + +# chkconfig: 2345 35 60 +# description: mISDN Kernel Modules + +# +# CONFIGURATION: +# +# Path to your misdn-init.conf: +# +misdn_init_conf="/etc/misdn-init.conf" +# +################################################################################ + +# +# change this to modify the user/group settings of /dev/mISDN +# +USER=asterisk +GROUP=asterisk + +# HFC 8/4 (S0) Options +master_clock=17 + +# HFC-E1 Options +optical=17 +los=19 +ais=20 +slip=21 +nocrc4=24 + +# Card Settings +ulaw=9 +dtmf=10 +pcm_slave=12 +ignore_pcm_frameclock=13 + +rxclock=14 +crystalclock=19 + +watchdog=20 + + +#dsp defaults +dsp_options=0 + +poll_option= + +dsp_poll_option= + +dtmftreshold_option= + +function check_cmd { + if ! which "${1}" > /dev/null; then + if [ "$(id -u)" != "0" ]; then + echo "[!!] FATAL: $1 not in path, please install and/or be root." + else + echo "[!!] FATAL: $1 not in path, please install." + fi + if [ "${2}" != "notfatal" ] ; then + exit 1 + fi + else + var=$(echo ${1} | tr a-z A-Z) + eval "$var=`which ${1}`" + fi +} + +check_cmd modprobe +check_cmd rmmod +check_cmd insmod +check_cmd lspci +check_cmd lsusb notfatal +check_cmd mknod +check_cmd bc + +function check_asterisk { + if ps ax | grep -v grep | grep asterisk > /dev/null ; then asterisk -rx "stop now" ; fi +} + +function load_card_modules { + + if [ ! -z "$1" ] ; then + echo "Loading only $1" + fi + + IFS=$'\n' + + for line in $(sed -n -e '/^[^#]/p' ${misdn_init_conf}); + do + var=`echo "${line}" | sed -e "s/^\(.*\)=.*/\1/"` + val=`echo "${line}" | sed -e "s/^.*=\(.*\)/\1/"` + + case "${var}" in + card) + nr=`echo "${val}" | sed -e "s/^\([0-9]*\),.*/\1/"` + mod=`echo "${val}" | sed -e "s/^[^,]*,\([^,]*\).*/\1/"` + if [ ${#val} -gt $(echo "obase=10;${#nr}+${#mod}+1" | ${BC}) ]; then + opns=`echo "${val}" | sed -e "s/^[^,]*,[^,]*,\(.*\)/\1/"` + else + opns="" + fi + case "${mod}" in + 0x*) + hfcmulti[${nr}]=$(echo ${mod} | sed -e "s/^0x\([0-9]*\)/\1/") + let "hfcports = ${hfcports} + ${hfcmulti[${nr}]}" + IFS=$',' + for li in ${opns}; do + hfcmulti[${nr}]=$(echo "obase=10;2^(${!li}-1)+${hfcmulti[${nr}]}" | ${BC}) + done + IFS=$'\n' + ;; + *) + other_card[${nr}]=${mod} + ;; + esac + ;; + te_ptp) + IFS=$',' + for li in ${val}; do + layermask[${li}]="0xf" + protocol[${li}]=34 # 0x22 == 34 + done + IFS=$'\n' + ;; + te_ptmp) + IFS=$',' + for li in ${val}; do + layermask[${li}]="0xf" + protocol[${li}]=2 # 0x2 == 2 + done + IFS=$'\n' + ;; + nt_*) + IFS=$',' + for li in ${val}; do + layermask[${li}]="0x3" + protocol[${li}]=18 # 0x12 == 18 + done + IFS=$'\n' + ;; + te_capi_ptp) + IFS=$',' + for li in ${val}; do + layermask[${li}]="0x0" + protocol[${li}]=34 # 0x22 == 34 + done + IFS=$'\n' + + export addcapi=1 + ;; + te_capi_ptmp) + IFS=$',' + for li in ${val}; do + layermask[${li}]="0x0" + protocol[${li}]=2 # 0x2 == 2 + done + IFS=$'\n' + + export addcapi=1 + ;; + + option) + port=`echo "${val}" | sed -e "s/^\([0-9]*\),.*/\1/"` + opt=`echo "${val}" | sed -e "s/^[0-9]*,\(.*\)/\1/"` + + if [ -z ${protocol[${port}]} ]; then + protocol[${port}]="0" + fi + + IFS=$',' + for li in ${opt}; do + protocol[${port}]=$(echo "obase=10;2^(${!li}-1)+${protocol[${port}]}" | ${BC}) + done + IFS=$'\n' + ;; + poll) + poll=${val} + poll_option=poll=${val} + ;; + dsp_poll) + dsp_poll_option=poll=${val} + ;; + pcm) + pcm=${val} + ;; + dsp_options) + export dsp_options=${val} + ;; + dtmftreshold) + export dtmftreshold_option="dtmftreshold=${val}" + ;; + debug) + debug=${val} + ;; + *) + echo "unknown variable: ${var}" + ;; + esac + + done + + echo "-----------------------------------------" + echo " Loading module(s) for your misdn-cards:" + echo "-----------------------------------------" + + card_index=1 + port_index=1 + while [ ! -z ${hfcmulti[${card_index}]} ] || [ ! -z ${other_card[${card_index}]} ]; + do + if [ ! -z ${hfcmulti[${card_index}]} ]; then + # MODPROBE COMMAND FOR hfcmulti CARD + hfcmulti_type="type=" + hfcmulti_prot="protocol=" + hfcmulti_layer="layermask=" + while [ ! -z ${hfcmulti[${card_index}]} ]; + do + hfcmulti_type="${hfcmulti_type}$(echo "obase=16;\"0x\";${hfcmulti[${card_index}]}" | ${BC} )," + let "card_index = ${card_index} + 1" + done + while [ ${hfcports} -gt 0 ]; + do + if [ ! -z ${protocol[${port_index}]} ]; then + hfcmulti_prot="${hfcmulti_prot}$(echo "obase=16;\"0x\";${protocol[${port_index}]}" | ${BC})," + else + hfcmulti_prot="${hfcmulti_prot}0x2," + fi + if [ ! -z ${layermask[${port_index}]} ]; then + hfcmulti_layer="${hfcmulti_layer}${layermask[${port_index}]}," + else + hfcmulti_layer="${hfcmulti_layer}0xf," + fi + let "port_index = ${port_index} + 1" + let "hfcports = ${hfcports} - 1" + done + hfcmulti_type="$(echo ${hfcmulti_type} | sed -e 's/^\(.*\),$/\1/')" + hfcmulti_prot="$(echo ${hfcmulti_prot} | sed -e 's/^\(.*\),$/\1/')" + hfcmulti_layer="$(echo ${hfcmulti_layer} | sed -e 's/^\(.*\),$/\1/')" + hfcmulti_cmd="modprobe --ignore-install hfcmulti ${hfcmulti_type} ${hfcmulti_prot} ${hfcmulti_layer}" + if [ ! -z ${poll} ]; then + hfcmulti_cmd="${hfcmulti_cmd} poll=${poll}" + fi + if [ ! -z ${pcm} ]; then + hfcmulti_cmd="${hfcmulti_cmd} pcm=${pcm}" + fi + if [ ! -z ${debug} ]; then + hfcmulti_cmd="${hfcmulti_cmd} debug=${debug}" + fi + + + if [ -z "$1" ] ; then + echo ${hfcmulti_cmd} + eval ${hfcmulti_cmd} + else + if [ "$1" = "hfcmulti" ] ; then + echo ${hfcmulti_cmd} + eval ${hfcmulti_cmd} + fi + fi + else + # MODPROBE COMMAND FOR _NON_ hfcmulti CARD + other_mod="${other_card[${card_index}]}" + other_cmd="$MODPROBE --ignore-install ${other_mod}" + if [ ! -z ${protocol[${port_index}]} ]; then + other_prot="protocol=$(echo "obase=16;\"0x\";${protocol[${port_index}]}" | ${BC})," + else + other_prot="protocol=0x2," + fi + if [ ! -z ${layermask[${port_index}]} ]; then + other_layer="layermask=${layermask[${port_index}]}," + else + other_layer="layermask=0xf," + fi + other_extra="" + modinfo $other_mod | egrep -q 'parm: *poll' && other_extra="$other_extra ${poll_option}" + + let "prev = ${card_index}" + let "card_index = ${card_index} + 1" + let "port_index = ${port_index} + 1" + while [ "${other_card[${card_index}]}" == "${other_card[${prev}]}" ]; + do + if [ ! -z ${protocol[${port_index}]} ]; then + other_prot="${other_prot}$(echo "obase=16;\"0x\";${protocol[${port_index}]}" | ${BC})," + else + other_prot="${other_prot}0x2," + fi + if [ ! -z ${layermask[${port_index}]} ]; then + other_layer="${other_layer}${layermask[${port_index}]}," + else + other_layer="${other_layer}0xf," + fi + let "prev = ${card_index}" + let "card_index = ${card_index} + 1" + let "port_index = ${port_index} + 1" + done + + other_prot="$(echo ${other_prot} | sed -e 's/^\(.*\),$/\1/')" + other_layer="$(echo ${other_layer} | sed -e 's/^\(.*\),$/\1/')" + other_cmd="${other_cmd} ${other_prot} ${other_layer} ${other_extra}" + + if [ -z "$1" ] ; then + echo "${other_cmd}" + eval ${other_cmd} + else + if [ "$1" = "${other_card[${prev}]}" ] ; then + echo ${other_cmd} + eval ${other_cmd} + fi + fi + + + fi + done +} + +function unload_card_modules { + + IFS=$'\n' + + for line in $(sed -ne '/^[^#]/p' ${misdn_init_conf}); + do + var=`echo "${line}" | sed -e "s/^\(.*\)=.*/\1/"` + val=`echo "${line}" | sed -e "s/^.*=\(.*\)/\1/"` + + case "${var}" in + card) + nr=`echo "${val}" | sed -e "s/^\([0-9]*\),.*/\1/"` + mod=`echo "${val}" | sed -e "s/^[^,]*,\([^,]*\).*/\1/"` + case "${mod}" in + 0x*) + modulelist[${nr}]=hfcmulti + ;; + *) + modulelist[${nr}]=${mod} + ;; + esac + ;; + esac + + done + + echo "-------------------------------------------" + echo " Unloading module(s) for your misdn-cards:" + echo "-------------------------------------------" + + rmmod_cmd="${RMMOD} ${modulelist[1]}" + echo "${rmmod_cmd}" + eval ${rmmod_cmd} + + index=2 + prev=1 + while [ ! -z ${modulelist[${index}]} ]; + do + if [ ${modulelist[${index}]} != ${modulelist[${prev}]} ]; then + rmmod_cmd="${RMMOD} ${modulelist[${index}]}" + echo "${rmmod_cmd}" + eval ${rmmod_cmd} + fi + let "prev = ${index}" + let "index = ${index} + 1" + done +} + +function create_misdn_init_conf { + + cardcount=1 + cardconf="" + IFS=$'\n' + NL=" +" + + function die { + echo "[!!] ${1}" + exit 1 + } + + function addcard { + cardline="${cardline}card=${cardcount},${1}${NL}" + let "cardcount = ${cardcount} + 1" + } + + function addport { + let "portcount = ${portcount} + ${1}" + } + + portcount=0 + + for line in $(${LSPCI} -n -d 0xd161:b410); do + addcard "0x4" + addport 4 + done + + for line in $(${LSPCI} -n | sed -n 's/^\(0000:\|\)\([0-9a-f]\{2\}:[0-9a-f]\{2\}.[0-9a-f]\{1\}\)\( Class \| \)[0-9a-f]\{4\}: 1397:\([0-9a-f]\{4\}\).*$/\4 \2/p'); do + case "${line}" in + 30b1*) + addcard "0x1" + addport 1 + ;; + 16b8*) + addcard "0x8" + addport 8 + ;; + 08b4*) + if ${LSPCI} -n -v -s "${line:5}" | grep "Subsystem" | grep "1397:b566\|1397:b569" > /dev/null ; then + addcard "0x2" + addport 2 + else + addcard "0x4" + addport 4 + fi + ;; + esac + done + for line in $(${LSPCI} -n | grep "1397:\(2bd\(0\|6\|7\|8\|9\|a\|b\|c\)\|b100\)\|1043:0675\|0871:ffa\(1\|2\)\|1051:0100\|15b0:2bd0\|114f:007\(0\|1\|2\|3\)\|13d1:2bd1\|182d:3069"); do + addcard "hfcpci" + addport 1 + done + for line in $(${LSPCI} -n | grep "1244:\(0a00\|0e00\)"); do + addcard "avmfritz" + addport 1 + done + for line in $(${LSPCI} -n -d 1050:6692); do + addcard "w6692pci" + addport 1 + done + + if [ -e $LSUSB ]; then + for line in $(${LSUSB} | grep "0959:2bd0\|0675:1688\|07b0:0007\|0742:200\(7\|8\|9\|A\)\|08e3:0301\|07fa:084\(7\|8\)\|07ba:0006"); do + addcard "hfcsusb" + addport 1 + done + fi + + if [ "${1}" == "scan" ]; then + echo "[OK] found the following devices:" + echo "${cardline}[ii] run \"/usr/sbin/misdn-init config\" to store this information to ${misdn_init_conf}" + else + + index=1 + portline="te_ptmp=" + while [ ${index} -le ${portcount} ]; do + portline="${portline}${index}," + let "index = ${index} + 1" + done + portline="$(echo ${portline} | sed -e 's/^\(.*\),$/\1/')" + + misdn_cfg_pt1="# +# Configuration file for your misdn hardware +# +# Usage: /usr/sbin/misdn-init start|stop|restart|config|scan|help +# + +# +# Card Settings +# +# Syntax: card=<number>,<type>[,<option>...] +# +# <number> count your cards beginning with 1 +# <type> either 0x1,0x4 or 0x8 for your hfcmulti hardware, +# or the name of your card driver module. +# <option> ulaw - uLaw (instead of aLaw) +# dtmf - enable DTMF detection on all B-channels +# +# pcm_slave - set PCM bus into slave mode +# If you have a set of cards, all wired via PCM. Set +# all cards into pcm_slave mode and leave one out. +# The left card will automatically be Master. +# +# ignore_pcm_frameclock - this can be set in conjunction with +# pcm_slave. If this card has a +# PCI Bus Position before the Position +# of the Master, then this port cannot +# yet receive a frameclock, so it must +# ignore the pcm frameclock. +# +# rxclock - use clocking for pcm from ST Port +# crystalclock - use clocking for pcm from PLL (genrated on board) +# watchdog - This dual E1 Board has a Watchdog for +# transparent mode +# +#" + misdn_cfg_pt2="# +# Port settings +# +# Syntax: <port_type>=<port_number>[,<port_number>...] +# +# <port_type> te_ptp - TE-Mode, PTP +# te_ptmp - TE-Mode, PTMP +# te_capi_ptp - TE-Mode (capi), PTP +# te_capi_ptmp - TE-Mode (capi), PTMP +# nt_ptp - NT-Mode, PTP +# nt_ptmp - NT-Mode, PTMP +# <port_number> port that should be considered +#" + misdn_cfg_pt3="# +# Port Options +# +# Syntax: option=<port_number>,<option>[,<option>...] +# +# <option> master_clock - use master clock for this S/T interface +# (only once per chip, only for HFC 8/4) +# optical - optical (only HFC-E1) +# los - report LOS (only HFC-E1) +# ais - report AIS (only HFC-E1) +# slip - report SLIP (only HFC-E1) +# nocrc4 - turn off crc4 mode use double frame instead +# (only HFC-E1) +# +#option=1,master_clock +#option=2,ais,nocrc4 +#option=3,optical,los,ais,slip + + +# +# General Options for your hfcmulti hardware +# +# poll=<number> +# +# Only one poll value must be given for all cards. +# Give the number of samples for each fifo process. +# By default 128 is used. Decrease to reduce delay, increase to +# reduce cpu load. If unsure, don't mess with it!!! +# Valid is 32, 64, 128, 256. +# +# dsp_poll=<number> +# This is the poll option which is used by mISDN_dsp, this might +# differ from the one given by poll= for the hfc based cards, since +# they can only use multiples of 32, the dsp_poll is dependant on +# the kernel timer setting which can be found in the CPU section +# in the kernel config. Defaults are there either 100Hz, 250Hz +# or 1000Hz. If your setting is either 1000 or 250 it is compatible +# with the poll option for the hfc chips, if you have 100 it is +# different and you need here a multiple of 80. +# The default is to have no dsp_poll option, then the dsp itself +# finds out which option is the best to use by itself +# +# pcm=<number> +# +# Give the id of the PCM bus. All PCM busses with the same ID +# are expected to be connected and have equal slots. +# Only one chip of the PCM bus must be master, the others slave. +# +# debug=<number> +# +# Enable debugging (see hfc_multi.h for debug options). +# +# dsp_options=<number> +# +# set this to 2 and you'll have software bridging instead of +# hardware bridging. +# +# +# dtmftreshold=<milliseconds> +# +# Here you can tune the sensitivity of the dtmf tone recognizer. +# +poll=128 +#dsp_poll=128 +dsp_options=0 +dtmftreshold=100 +debug=0" + + if [ -f ${misdn_init_conf} ]; then + cp "${misdn_init_conf}" "${misdn_init_conf}.save" || die "could not backup your existing ${misdn_init_conf}!" + echo "[OK] ${misdn_init_conf} already present. backing it up to ${misdn_init_conf}.save" + fi + echo "${misdn_cfg_pt1}${NL}${cardline}${NL}${misdn_cfg_pt2}${NL}${portline}${NL}${NL}${misdn_cfg_pt3}" > ${misdn_init_conf} || die "could not write to /etc/misdn-init.conf!" +#echo "${misdn_cfg_pt1}${NL}${cardline}${NL}${misdn_cfg_pt2}${NL}${portline}${NL}${NL}${misdn_cfg_pt3}" > testconf || die "could not write to /etc/misdn-init.conf!" + + echo "[OK] ${misdn_init_conf} created. It's now safe to run \"/usr/sbin/misdn-init start\"" + if [ ${portcount} -gt 1 ]; then + echo "[ii] make your ports (1-${portcount}) available in asterisk by editing \"/etc/asterisk/misdn.conf\"" + elif [ ${portcount} -eq 1 ]; then + echo "[ii] make your port (1) available in asterisk by editing \"/etc/asterisk/misdn.conf\"" <<Diff was trimmed, longer than 597 lines>> _______________________________________________ pld-cvs-commit mailing list [email protected] http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit
