diff options
author | tzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2008-05-13 21:08:09 +0000 |
---|---|---|
committer | tzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2008-05-13 21:08:09 +0000 |
commit | d7e54a785544ac40abc4a88383df3a913ca466e8 (patch) | |
tree | abf630c8372e7c81407172ad31190fa8a617a8ed /kernel/xpp/init_card_7_29 | |
parent | 823cf303caf13cc6e4fd2c2173804f0990b29532 (diff) |
xpp r5723: Includes, among others:
* New firmware protocol version: 3.0 .
* New numbers for the device types: (e.g. in card_init* scripts)
- FXS: 1 (was: 3)
- FXO: 2 (was: 4)
- BRI: 3 (was: 6 for TE, 7 for NT)
- PRI: 4 (was: 9)
* Init scripts of FXS and FXO modules are now written in Perl as well
(be sure to have File::Basename, e.g: perl-modules in Debian).
* calibrate_slics merged into init_card_1_30 .
* Module parameter print_dbg replaced with debug . Same meaning.
* init_fxo_modes removed: content moved into init_card_2_30, verified
at build time.
* Code tested with sparse. Most warnings were fixed.
* Set ZT_SIG_DACS for the bchans in the PRI and BRI modules to not get
ignored by ztscan.
* Handle null config_desc we get from some crazy USB controllers.
* genzaptelconf: Fix reporting of empty slots in list mode.
* xpp_blink can now blink a single analog port.
* "slics" has been renamed "chipregs".
* Fixed a small typo in fpga_load(8).
* Fixed bashism in xpp_fxloader.
Merged revisions 4264 via svnmerge from
http://svn.digium.com/svn/zaptel/branches/1.2
git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.4@4266 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'kernel/xpp/init_card_7_29')
-rwxr-xr-x | kernel/xpp/init_card_7_29 | 434 |
1 files changed, 0 insertions, 434 deletions
diff --git a/kernel/xpp/init_card_7_29 b/kernel/xpp/init_card_7_29 deleted file mode 100755 index 255d50e..0000000 --- a/kernel/xpp/init_card_7_29 +++ /dev/null @@ -1,434 +0,0 @@ -#! /usr/bin/perl -w -use strict; - -# -# $Id$ -# - -# -# Written by Oron Peled <oron@actcom.co.il> -# Copyright (C) 2006, Xorcom -# -# All rights reserved. -# -# 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. -# -# See the file LICENSE in the top level of this tarball. -# - -# This script is run from the xpp kernel module upon detection -# of a new XPD. -# -# Expects the following environment variables to be set: -# XPD_BUS - bus name -# XPD_NAME - xpd name -# XPD_UNIT - xpd unit number -# XPD_SUBUNIT - xpd subunit number -# XPD_TYPE - xpd type number (from protocol reply): -# 3 - FXS -# 4 - FXO -# 6 - BRI_TE -# 7 - BRI_NT -# XPD_REVISION - xpd revision number -# -# Output data format: -# - An optional comment start with ';' or '#' until the end of line -# - Optional Blank lines are ignored -# - Fields are whitespace separated (spaces or tabs) -# -# The fields are (in command line order): -# 1. CHIP select in decimal (ignored, taken from 3 LSB's of subunit number) -# 2. Command word: -# - RD Read Direct register. -# - RS Read Sub-register. -# - WD Write Direct register. -# - WS Write Sub-register. -# 3. Register number in hexadecimal. -# 4. Subregister number in hexadecimal. (for RS and WS commands). -# 5. Data byte in hexadecimal. (for WD and WS commands only). -# - -package main; -use File::Basename; - -my $program = basename("$0"); -my $init_dir = dirname("$0"); -my $unit_id; - -sub logit { - print STDERR "$unit_id: @_\n"; -} - -# Arrange for error logging -if (-t STDERR) { - $unit_id = 'Interactive'; - logit "Interactive startup\n"; -} else { - $unit_id = "$ENV{XPD_BUS}/$ENV{XPD_NAME}"; - open (STDERR, "| logger -t $program -p kern.info") || die; - logit "Non Interactive startup\n"; -} - -package BRI; - -sub gen { - my $fmt = shift; - $| = 1; - printf "$fmt\n", @_; -} - -package BRI::Port; - -sub new { - my $pack = shift; - my $port = { @_ }; - bless $port, $pack; -} - -# zap_xhfc_su.c:995 -sub init_su { - my $port = shift; - my $portnum = $port->{PORT_NUM}; - my $port_mode_up = $port->{PORT_MODE_UP}; - my $port_mode_exch = $port->{PORT_MODE_EXCH}; - my $bri_nt = $port->{BRI_NT}; - #logit "init_su(portnum=$portnum, port_mode_up=$port_mode_up, bri_nt=$bri_nt)"; - - # Setting PLL - # R_PLL_CTRL = 0 (V_PLL_M = 0, Reset PLL, Disable PLL_ - # R_CLK_CFG = 05 (PLL clock as system clock, output it to CLK_OUT pin) - # R_PLL_P = 1 - # R_PLL_N = 6 - # R_PLL_S = 1 - # R_PLL_CTRL = 1 (V_PLL_M) - - BRI::gen "#--------------------------- init_su($portnum, $bri_nt, $port_mode_up, $port_mode_exch)"; - BRI::gen "0 WD 02 04"; - BRI::gen "0 WD 50 00"; # disable PLL - BRI::gen "0 WD 51 02"; - BRI::gen "0 WD 52 06"; - BRI::gen "0 WD 53 04"; - BRI::gen "0 WD 50 01"; # Enable PLL - BRI::gen "0 WD 02 05"; # Enable PLL - - su_sel($portnum); # select port - if ("$port_mode_up" == 1) { - $port->{CTRL3} = 0x01; # A_ST_CTRL3: V_ST_SEL = 1 - $port->{CTRL0} = 0x10; # A_SU_CTRL0: V_ST_SQ_EN = 1 - BRI::gen "0 WD 34 0F"; # A_MS_TX: - # (multiframe/superframe transmit register) - } else { - $port->{CTRL3} = 0x00; # A_ST_CTRL3: V_ST_SEL = 0 - $port->{CTRL0} = 0x00; # A_SU_CTRL0: V_ST_SQ_EN = 0 - } - if ("$bri_nt" == 1) { - $port->{CTRL0} |= 0x04; # V_SU_MD - } - # ((V_SU_EXCH)?0x80:00) (change polarity) - if($port_mode_exch) { - $port->{CTRL2} = 0x80; - } else { - $port->{CTRL2} = 0x00; - } - BRI::gen "0 WD 35 %02X", $port->{CTRL3}; # A_ST_CTRL3 - BRI::gen "0 WD 31 %02X", $port->{CTRL0}; # A_SU_CTRL0 - BRI::gen "0 WD 35 F8"; # A_ST_CTRL3 = set end of pulse control to 0xF8 - BRI::gen "0 WD 32 08"; # A_SU_CTRL1 = Ignore E-channel data - BRI::gen "0 WD 33 %02X", $port->{CTRL2}; # A_SU_CTRL2 - - # zap_xhfc_su.c:1030 in init_su() - # A_SU_CLK_DLY - my $clk_dly; - if ("$bri_nt" == 1) { - $clk_dly = 0x6C; - } else { - $clk_dly = 0x0E; - } - #logit "clk_dly=$clk_dly"; - BRI::gen "0 WD 37 %02X", "$clk_dly"; -} - -sub su_sel { - if (@_ != 1 ) { - main::logit "ERROR: su_sel() called with " . scalar(@_) . " parameters"; - exit 1; - } - my $portnum = shift; - BRI::gen "0 WD 16 %02X", $portnum; # R_SU_SEL -} - -# zap_xhfc_su.c:281 -sub xhfc_selfifo { - if (@_ != 1 ) { - main::logit "ERROR: xhfc_selfifo() called with " . scalar(@_) . " parameters"; - exit 1; - } - my $fifonum = shift; - #logit "xhfc_selfifo($fifonum)"; - BRI::gen "0 WD 0F %02X", $fifonum; - # --> WAIT UNTIL (R_STATUS & M_BUSY) == 0 -} - -# zap_xhfc_su.c:295 -sub xhfc_resetfifo() { - #logit "xhfc_resetfifo()"; - # A_INC_RES_FIFO = M_RES_FIFO | M_RES_FIFO_ERR - BRI::gen "0 WD 0E 0A"; - # --> WAIT UNTIL (R_STATUS & M_BUSY) == 0 -} - -# zap_xhfc_su.c:1040 -# Initialize fifo (called for each portnum, channel, direction) -sub setup_fifo { - my $port = shift; - my $chan = shift; - my $direction = shift; - my $conhdlc = shift; - my $subcfg = shift; - my $fifoctrl = shift; - - my $portnum = $port->{PORT_NUM}; - my $port_mode_up = $port->{PORT_MODE_UP}; - my $port_mode_exch = $port->{PORT_MODE_EXCH}; - my $bri_nt = $port->{BRI_NT}; - - BRI::gen "#--------------------------- setup_fifo($portnum, $chan, $direction)"; - # my $fifonum = 0x80 | ($portnum << 3) | ($chan << 1) | ($direction); # # MSB first - my $fifonum = ($portnum << 3) | ($chan << 1) | ($direction); # # MSB first - my $r_slot = ($portnum << 3) | ($chan << 1) | ($direction); - - # channel order workaround, swap odd and even portnums in $r_slot for PCM (chan 0, 1) only - if ("$chan" == 0 || "$chan" == 1) { - $r_slot = $r_slot ^ 0x08; - } - - my $short_portnum = $portnum & 0x03; - my $a_sl_cfg = (0x80 | ($short_portnum << 3) | ($chan << 1) | ($direction)); # receive data from STIO2, transmit to STIO1 - - #logit "setup_fifo($fifonum)"; - xhfc_selfifo $fifonum; - # A_CON_HDLC: transparent mode selection - BRI::gen "0 WD FA %02X", $conhdlc; - # A_SUBCH_CFG: subchnl params - BRI::gen "0 WD FB %02X", $subcfg; - # A_FIFO_CTRL: FIFO Control Register - BRI::gen "0 WD FF %02X", $fifoctrl; - xhfc_resetfifo; - xhfc_selfifo $fifonum; # wait for busy is builtin in this command - BRI::gen "0 WD 10 %02X", $r_slot; # R_SLOT - BRI::gen "0 WD D0 %02X", $a_sl_cfg; # A_SL_CFG - - #system("/bin/echo \"----=====NT\" \"short_portnum=\"$short_portnum \"portnum=\" $portnum \"chan=\" $chan\"======----\n\" >>/root/xortel/test_init"); -} - -# zap_xhfc_su.c:1071 -sub setup_su { - my $port = shift; - my $bchan = shift; - my $portnum = $port->{PORT_NUM}; - my $port_mode_exch = $port->{PORT_MODE_EXCH}; - my $bri_nt = $port->{BRI_NT}; - - BRI::gen "#--------------------------- setup_su($portnum, $bchan)"; - #logit "setup_su(portnum=$portnum, bchan=$bchan, port_mode_exch=$port_mode_exch, bri_nt=$bri_nt)"; - $port->{CTRL0} |= (1 << $bchan) | $bri_nt; - $port->{CTRL2} |= ($port_mode_exch << 7) | (1 << $bchan); - su_sel($portnum); # Select port - BRI::gen "0 WD 31 %02X", $port->{CTRL0}; # A_SU_CTRL0: V_B1_TX_EN | V_SU_MD | (NT/TE) - BRI::gen "0 WD 33 %02X", $port->{CTRL2}; # A_SU_CTRL2: V_B1_RX_EN -} - -sub xhfc_ph_command { - my $port = shift; - my $cmd = shift; - my $portnum = $port->{PORT_NUM}; - #logit "xhfc_ph_command(portnum=$portnum)"; - if ("$cmd" eq "HFC_L1_ACTIVATE_TE") { - su_sel($portnum); # Select port - BRI::gen "0 WD 30 60"; # A_SU_WR_STA = (M_SU_ACT & 0x03) - # (set activation) - } elsif ("$cmd" eq "HFC_L1_FORCE_DEACTIVATE_TE") { - su_sel($portnum); # Select port - BRI::gen "0 WD 30 40"; # A_SU_WR_STA = (M_SU_ACT & 0x02) - # (set deactivation) - } elsif ("$cmd" eq "HFC_L1_ACTIVATE_NT") { - su_sel($portnum); # Select port - BRI::gen "0 WD 30 E0"; # A_SU_WR_STA = (M_SU_ACT & 0x03) | 0x80 - # (set activation + NT) - } elsif ("$cmd" eq "HFC_L1_DEACTIVATE_NT") { - su_sel($portnum); # Select port - BRI::gen "0 WD 30 40"; # A_SU_WR_STA = (M_SU_ACT & 0x02) - # (set deactivation) - } -} - - -sub zthfc_startup { - my $port = shift; - my $portnum = $port->{PORT_NUM}; - my $port_mode_exch = $port->{PORT_MODE_EXCH}; - my $bri_nt = $port->{BRI_NT}; - #logit "zthfc_startup(portnum=$portnum, port_mode_exch=$port_mode_exch, bri_nt=$bri_nt)"; - - # PCM <-> ST/Up Configuration - foreach my $chan ( 0, 1 ) { - $port->setup_fifo($chan, 0, 0xFE, 0, 0);# Transparent mode, FIFO EN, ST->PCM - $port->setup_fifo($chan, 1, 0xFE, 0, 0);# Transparent mode, FIFO EN, ST->PCM - $port->setup_su($chan); # zap_xhfc_su.c:194 - } - - # Zaptel chan 2 used as HDLC D-Channel - $port->setup_fifo(2, 0, 0x05, 2, 0); # D-TX: zap_xhfc_su.c:205 - $port->setup_fifo(2, 1, 0x05, 2, 0); # D-RX: zap_xhfc_su.c:206 - # E-chan, Echo channel is ignored - - - # enable this port's state machine - su_sel($portnum); # Select port - # A_SU_WR_STA: reset port state machine - BRI::gen "0 WD 30 00"; - if ("$bri_nt" == 0) { - $port->xhfc_ph_command("HFC_L1_ACTIVATE_TE"); - } else { - $port->xhfc_ph_command("HFC_L1_ACTIVATE_NT"); - } -} - - -package main; -use Getopt::Std; - -my %opts; -getopts('o:', \%opts); - -$ENV{XPP_BASE} = '/proc/xpp'; -my $cmd = "$ENV{XPP_BASE}/$ENV{XPD_BUS}/command"; -my $output; -if ($opts{o}) { - $output = $opts{o}; -} else { - $ENV{XPD_BUS} || die "Missing XPD_BUS environment variable\n"; - $ENV{XPD_NAME} || die "Missing XPD_NAME environment variable\n"; - $ENV{XPD_TYPE} || die "Missing XPD_TYPE environment variable\n"; - $ENV{XPD_REVISION} || die "Missing XPD_REVISION environment variable\n"; - $output = "$ENV{XPP_BASE}/$ENV{XPD_BUS}/$ENV{XPD_NAME}/slics"; -} - -open(REG, ">$output") || die "Failed to open '$output': $!\n"; -select REG; - -logit "Starting '$0'"; - -#------------------------------------------- Instance detection - -# zap_xhfc_su.c:895 -sub init_xhfc() { - #logit "init_xhfc()"; - BRI::gen "#--------------------------- init_xhfc"; - BRI::gen "0 WD 0D 00"; # r_FIFO_MD: 16 fifos, - # 64 bytes for TX and RX each (FIFO mode config) - - # software reset to enable R_FIFO_MD setting - BRI::gen "0 WD 00 08"; # R_CIRM = M_SRES (soft reset) - # --> WAIT 5u - BRI::gen "0 WD 00 00"; # R_CIRM = 0 (zero it to deactivate reset) - - # amplitude - BRI::gen "0 WD 46 80"; # R_PWM_MD: (PWM output mode register) - # PWM push to zero only - BRI::gen "0 WD 39 18"; # R_PWM1: (modulator register for PWM1) - # set duty cycle - - BRI::gen "0 WD 0C 11"; # R_FIFO_THRES: (FIFO fill lvl control register) - # RX/TX threshold = 16 bytes - - # --> Wait until (R_STATUS & (M_BUSY | M_PCM_INIT)) - # M_BUSY status will be checked after fifo selection - BRI::gen "0 WD 0F 80"; - # set PCM !master mode - BRI::gen "0 WD 14 08"; # R_PCM_MD0 = PCM slave mode, F0IO duration is 2 HFC_PCLK's - - # (C4IO, F0IO are inputs) - - # set pll adjust - # WD 14 90 # R_PCM_MD0: Index value to select - # the register at address 15 - # WD 15 2C # R_PCM_MD1: V_PLL_ADJ (DPLL adjust speed), C4IO is 16.384MHz(128 time slots) - # in the last slot of PCM frame - BRI::gen "0 WS 14 98 20"; # R_PCM_MD1: V_PLL_ADJ - # (DPLL adjust speed) in the - # last slot of PCM frame - - BRI::gen "0 WD 4C 03"; # GPIOGPIO function (not PWM) on GPIO0 and GPIO1 pins - BRI::gen "0 WD 4A 03"; # Output enable for GPIO0 and GPIO1 pins -} - -my %port_type = ( - 6 => { 'BRI_NT' => 0 }, - 7 => { 'BRI_NT' => 1 } - ); - -# zap_xhfc_su.c:175 -sub main() { - #logit "main(): XPD_TYPE=$ENV{XPD_TYPE}"; - - $ENV{XPD_TYPE} || die "Missing XPD_TYPE environment variable\n"; - my $type = $port_type{$ENV{XPD_TYPE}}; - die "Bad XPD_TYPE=$ENV{XPD_TYPE}\n" unless $type; - die "Missing XPD_SUBUNIT information\n" unless defined($ENV{XPD_SUBUNIT}); - - # We must first turn off packet reception. - # - # Otherwise we mess with registers while the FPGA firmware tries to - # send us packets. - BRI::gen "0 Wm"; - - # Common initialization - if(($ENV{XPD_SUBUNIT} % 4) eq '0') { - # Turn off multi-byte packet reception before initialization started - my $chipnum = ($ENV{XPD_SUBUNIT} & 0x04) << 3; # Max 2 XHFC chips - for my $subunit (0 .. 3) { # 4 subunits per XHFC chip - my $addr = $chipnum | ($subunit << 3); - my $str = sprintf("0A 00 0F %02X C0 00 00 00 00 00\n", $addr); - open(CMD, ">$cmd") || die "Failed to open '$cmd': $!\n"; - print CMD $str; - close CMD; - } - init_xhfc; # zap_xhfc_su.c:1173 in setup_instance() - } - - # Port initialization - my $p = BRI::Port->new( - 'PORT_NUM' => $ENV{XPD_SUBUNIT}, - 'BRI_NT' => $type->{BRI_NT}, - 'PORT_MODE_UP' => 0, - 'PORT_MODE_EXCH' => 0 - ); - # zap_XHfc_su.c:1186 in setup_instance() - $p->init_su; - - $p->zthfc_startup; - - if(($ENV{XPD_SUBUNIT} % 4) eq 3) { - # Turn on multi-byte packet reception when ports initialization finished - my $chipnum = ($ENV{XPD_SUBUNIT} & 0x04) << 3; # Max 2 XHFC chips - for my $subunit (0 .. 3) { # 4 subunits per XHFC chip - my $addr = $chipnum | ($subunit << 3); - my $str = sprintf("0A 00 0F %02X 80 00 00 00 00 00\n", $addr); - open(CMD, ">$cmd") || die "Failed to open '$cmd': $!\n"; - print CMD $str; - close CMD; - } - } -} - -main; - -logit "Ending '$0'"; - -close REG; -close STDERR; -exit 0; |