On Thursday 22 December 2016 05:15:20 andy pugh wrote:

> On 22 December 2016 at 06:22, Gene Heskett <ghesk...@shentel.net> 
wrote:
> > This is right after the loadrt hostmot2 line.  And while it works
> > perfectly in the halrun;halcmd scene, it fails in the hal file in
> > exactly the same manner.
> >
> > loadrt hm2_rpspi config="num_pwmgens=1 num_encoders=1
> > num_stepgens=2"
>
> Try it without the "config=..." line in the HAL, see what happens.

No diff Andy, so I added a -v -d 7i90-axis.ini >debug-fail.log 2>&1
and its attached. From the non-realtime msg, I am wondering 
if /etc/init.d/realtime got started.  No it didn't. Wrong damned kernel 
as there was a - where a _ should have been in the config.txt kernel= 
line. Fixed, rebooted, verified rt kernel is running:

Linux raspberrypi 4.4.4-rt9-v7+ #7 SMP PREEMPT RT Mon Mar 7 14:53:11 UTC 
2016 armv7l GNU/Linux

Made another pass with this cmd line while 
in /home/pi/linuxcnc/configs/sheldon-lathe:

linuxcnc -v -d 7i90-axis.ini >>debug-fail.log 2>&1

it still fails and that logfile is attached. The loadrt line is complete 
with config= argument. I'll take that back out. No diff, not even in the 
logfile.

Cheers, Gene Heskett
-- 
"There are four boxes to be used in defense of liberty:
 soap, ballot, jury, and ammo. Please use in that order."
-Ed Howdershelt (Author)
Genes Web page <http://geneslinuxbox.net:6309/gene>
Debug mode on
+ getopts dvlhkr opt
+ shift 2
+ case "" in
+ '[' -z ']'
+ tty -s
+ trap ErrorCheck EXIT
+ '[' '!' -z 7i90-axis.ini ']'
+ case "$1" in
++ pwd
+ INIFILE=/home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
+ shift
+ EXTRA_ARGS=
+ RUN_IN_PLACE=no
+ echo RUN_IN_PLACE=no
RUN_IN_PLACE=no
+ LINUXCNCVERSION=2.8.0-pre1-2771-gdc2ff49
+ export LINUXCNCVERSION
+ INIVAR=inivar
+ HALCMD='halcmd '
+ PICKCONFIG='/usr/bin/wish8.6 /usr/lib/tcltk/linuxcnc/bin/pickconfig.tcl'
+ LINUXCNC_EMCSH=/usr/bin/wish8.6
+ echo LINUXCNC_DIR=
LINUXCNC_DIR=
+ echo LINUXCNC_BIN_DIR=/usr/bin
LINUXCNC_BIN_DIR=/usr/bin
+ echo LINUXCNC_TCL_DIR=/usr/lib/tcltk/linuxcnc
LINUXCNC_TCL_DIR=/usr/lib/tcltk/linuxcnc
+ echo LINUXCNC_SCRIPT_DIR=
LINUXCNC_SCRIPT_DIR=
+ echo LINUXCNC_RTLIB_DIR=/usr/lib/linuxcnc/modules
LINUXCNC_RTLIB_DIR=/usr/lib/linuxcnc/modules
+ echo LINUXCNC_CONFIG_DIR=
LINUXCNC_CONFIG_DIR=
+ echo LINUXCNC_LANG_DIR=/usr/share/linuxcnc/tcl/msgs
LINUXCNC_LANG_DIR=/usr/share/linuxcnc/tcl/msgs
+ echo INIVAR=inivar
INIVAR=inivar
+ echo HALCMD=halcmd
HALCMD=halcmd
+ echo LINUXCNC_EMCSH=/usr/bin/wish8.6
LINUXCNC_EMCSH=/usr/bin/wish8.6
+ export LINUXCNC_TCL_DIR
+ export LINUXCNC_EMCSH
+ export LINUXCNC_HELP_DIR
+ export LINUXCNC_LANG_DIR
+ export REALTIME
+ export HALCMD
+ export LINUXCNC_NCFILES_DIR
+ '[' -z ']'
+ echo 'LINUXCNC - 2.8.0-pre1-2771-gdc2ff49'
LINUXCNC - 2.8.0-pre1-2771-gdc2ff49
+ '[' '!' -z '' ']'
+ '[' '!' -n /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini ']'
+ '[' '!' -n /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini ']'
++ handle_includes /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
++ hdr='# handle_includes():'
++ inifile=/home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
+++ dirname /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
++ cd /home/pi/linuxcnc/configs/sheldon-lathe
++ grep '^#INCLUDE' /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
++ status=1
++ '[' 1 -ne 0 ']'
++ echo /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
++ return 0
+ INIFILE=/home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
+ INI_NAME=7i90-axis.ini
+ INI_DIR=/home/pi/linuxcnc/configs/sheldon-lathe
+ CONFIG_DIR=/home/pi/linuxcnc/configs/sheldon-lathe
+ export CONFIG_DIR
+ export PATH=/home/pi/linuxcnc/configs/sheldon-lathe/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
+ PATH=/home/pi/linuxcnc/configs/sheldon-lathe/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
+ '[' -z ']'
+ echo 'Machine configuration directory is '\''/home/pi/linuxcnc/configs/sheldon-lathe'\'''
Machine configuration directory is '/home/pi/linuxcnc/configs/sheldon-lathe'
+ echo 'Machine configuration file is '\''7i90-axis.ini'\'''
Machine configuration file is '7i90-axis.ini'
+ '[' '!' -f /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini ']'
+ echo INIFILE=/home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
INIFILE=/home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
+ retval=
+ GetFromIni VERSION EMC
+ name=VERSION
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var VERSION -sec EMC
+ retval=1.0
+ '[' '!' -n VERSION ']'
+ echo VERSION=1.0
VERSION=1.0
+ '[' 1.0 '!=' 1.0 ']'
+ /usr/bin/tclsh8.6 /usr/share/linuxcnc/hallib/check_config.tcl /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
+ exitval=0
+ case "$exitval" in
+ GetFromIni PARAMETER_FILE RS274NGC
+ name=PARAMETER_FILE
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var PARAMETER_FILE -sec RS274NGC
+ retval=hm2-stepper.var
+ '[' '!' -n PARAMETER_FILE ']'
+ echo PARAMETER_FILE=hm2-stepper.var
PARAMETER_FILE=hm2-stepper.var
+ RS274NGC_PARAMFILE=hm2-stepper.var
+ GetFromIniEx MOT MOT EMCMOT EMCMOT motmod
+ original_var='[MOT]MOT'
+ '[' 5 -ge 2 ']'
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var MOT -sec MOT
+ retval=
+ shift 2
+ '[' 3 -ge 2 ']'
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var EMCMOT -sec EMCMOT
+ retval=motmod
+ return
+ EMCMOT=motmod.so
+ GetFromIniEx IO IO EMCIO EMCIO io
+ original_var='[IO]IO'
+ '[' 5 -ge 2 ']'
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var IO -sec IO
+ retval=
+ shift 2
+ '[' 3 -ge 2 ']'
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var EMCIO -sec EMCIO
+ retval=io
+ return
+ EMCIO=io
+ GetFromIni TASK TASK
+ name=TASK
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var TASK -sec TASK
+ retval=milltask
+ '[' '!' -n TASK ']'
+ echo TASK=milltask
TASK=milltask
+ EMCTASK=milltask
+ '[' milltask = emctask ']'
+ EMCSERVER=linuxcncsvr
+ GetFromIniQuiet HALUI HAL
+ name=HALUI
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var HALUI -sec HAL
+ retval=
+ '[' '!' -n HALUI ']'
+ echo HALUI=
HALUI=
+ HALUI=
+ GetFromIni DISPLAY DISPLAY
+ name=DISPLAY
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var DISPLAY -sec DISPLAY
+ retval=axis
+ '[' '!' -n DISPLAY ']'
+ echo DISPLAY=axis
DISPLAY=axis
++ set -- axis
++ echo axis
+ EMCDISPLAY=axis
++ set -- axis
++ shift
++ echo
+ EMCDISPLAYARGS=
+ case $EMCDISPLAY in
+ GetFromIniEx NML_FILE LINUXCNC NML_FILE EMC /usr/share/linuxcnc/linuxcnc.nml
+ original_var='[LINUXCNC]NML_FILE'
+ '[' 5 -ge 2 ']'
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var NML_FILE -sec LINUXCNC
+ retval=
+ shift 2
+ '[' 3 -ge 2 ']'
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var NML_FILE -sec EMC
+ retval=
+ shift 2
+ '[' 1 -ge 2 ']'
+ '[' 1 -eq 0 ']'
+ retval=/usr/share/linuxcnc/linuxcnc.nml
+ NMLFILE=/usr/share/linuxcnc/linuxcnc.nml
+ export NMLFILE
+ GetFromIni COORDINATES TRAJ
+ name=COORDINATES
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var COORDINATES -sec TRAJ
+ retval='X Z'
+ '[' '!' -n COORDINATES ']'
+ echo 'COORDINATES=X Z'
COORDINATES=X Z
+ TRAJ_COORDINATES='X Z'
+ export TRAJ_COORDINATES
+ GetFromIni KINEMATICS KINS
+ name=KINEMATICS
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var KINEMATICS -sec KINS
+ retval='trivkins coordinates=XZ'
+ '[' '!' -n KINEMATICS ']'
+ echo 'KINEMATICS=trivkins coordinates=XZ'
KINEMATICS=trivkins coordinates=XZ
+ KINS_KINEMATICS='trivkins coordinates=XZ'
+ export KINS_KINEMATICS
+ KILL_TASK=
+ KILL_TIMEOUT=20
+ LOCKFILE=/tmp/linuxcnc.lock
+ '[' -f /tmp/linuxcnc.lock ']'
+ echo Starting LinuxCNC...
Starting LinuxCNC...
+ trap 'Cleanup ; exit 0' SIGINT SIGTERM
+ cd /home/pi/linuxcnc/configs/sheldon-lathe
+ touch /tmp/linuxcnc.lock
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var INTRO_GRAPHIC -sec DISPLAY
+ img=linuxcnc.gif
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var INTRO_TIME -sec DISPLAY
+ imgtime=4
+ '[' 4 = '' ']'
+ '[' linuxcnc.gif '!=' '' ']'
+ '[' -e linuxcnc.gif ']'
+ '[' -e /home/pi/linuxcnc/configs/sheldon-lathe/linuxcnc.gif ']'
+ '[' -e /usr/share/linuxcnc/linuxcnc.gif ']'
+ img=/usr/share/linuxcnc/linuxcnc.gif
+ '[' /usr/share/linuxcnc/linuxcnc.gif '!=' '' ']'
+ '[' -x /usr/lib/tcltk/linuxcnc/bin/popimage ']'
+ echo 'Starting LinuxCNC server program: linuxcncsvr'
+ /usr/lib/tcltk/linuxcnc/bin/popimage /usr/share/linuxcnc/linuxcnc.gif 4
Starting LinuxCNC server program: linuxcncsvr
+ program_available linuxcncsvr
+ type -path linuxcncsvr
+ export INI_FILE_NAME=/home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
+ INI_FILE_NAME=/home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
+ linuxcncsvr -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
+ echo 'Loading Real Time OS, RTAPI, and HAL_LIB modules'
Loading Real Time OS, RTAPI, and HAL_LIB modules
+ /etc/init.d/realtime start
+ export HAL_RTMOD_DIR=/usr/lib/linuxcnc/modules
+ HAL_RTMOD_DIR=/usr/lib/linuxcnc/modules
+ '[' io '!=' '' ']'
+ echo 'Starting LinuxCNC IO program: io'
Starting LinuxCNC IO program: io
+ program_available io
+ type -path io
+ halcmd loadusr -Wn iocontrol io -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini
+ '[' -n '' ']'
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var TWOPASS -sec HAL -num 1
+ TWOPASS=
+ '[' -n '' ']'
+ NUM=1
++ inivar -tildeexpand -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var HALFILE -sec HAL -num 1
+ CFGFILE=hm2-7i90-stepper.hal
+ '[' -n hm2-7i90-stepper.hal ']'
+ IFS='\ '
+ read CFGFILE CFGFILE_ARGS
+ foundmsg=
+ saveIFS=' 	
'
+ IFS=:
+ explicit_file_in_hallib=hm2-7i90-stepper.hal
+ '[' -z hm2-7i90-stepper.hal ']'
+ '[' hm2-7i90-stepper.hal '!=' hm2-7i90-stepper.hal ']'
+ '[' h = / ']'
+ for pathdir in '$HALLIB_PATH'
+ foundfile=./hm2-7i90-stepper.hal
+ '[' -r ./hm2-7i90-stepper.hal ']'
+ '[' . = . ']'
+ foundmsg='Found file(REL): ./hm2-7i90-stepper.hal'
+ break
+ '[' -d ./hm2-7i90-stepper.hal ']'
+ IFS=' 	
'
+ '[' -z 'Found file(REL): ./hm2-7i90-stepper.hal' ']'
+ echo 'Found file(REL): ./hm2-7i90-stepper.hal'
Found file(REL): ./hm2-7i90-stepper.hal
+ CFGFILE=./hm2-7i90-stepper.hal
+ case $CFGFILE in
+ halcmd -i /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -f ./hm2-7i90-stepper.hal
Note: Using POSIX realtime
Unknown board: HOST????
hm2_rpspi: rtapi_app_main: Operation not permitted (-1)
./hm2-7i90-stepper.hal:38: waitpid failed /usr/bin/rtapi_app hm2_rpspi
./hm2-7i90-stepper.hal:38: /usr/bin/rtapi_app exited without becoming ready
./hm2-7i90-stepper.hal:38: insmod for hm2_rpspi failed, returned -1
+ '[' '' = '' ']'
+ Cleanup
+ echo 'Shutting down and cleaning up LinuxCNC...'
Shutting down and cleaning up LinuxCNC...
+ for KILL_TASK in linuxcncpanel iosh linuxcncsh linuxcncrsh linuxcnctop mdi debuglevel
+ /bin/pidof -x linuxcncpanel
+ for KILL_TASK in linuxcncpanel iosh linuxcncsh linuxcncrsh linuxcnctop mdi debuglevel
+ /bin/pidof -x iosh
+ for KILL_TASK in linuxcncpanel iosh linuxcncsh linuxcncrsh linuxcnctop mdi debuglevel
+ /bin/pidof -x linuxcncsh
+ for KILL_TASK in linuxcncpanel iosh linuxcncsh linuxcncrsh linuxcnctop mdi debuglevel
+ /bin/pidof -x linuxcncrsh
+ for KILL_TASK in linuxcncpanel iosh linuxcncsh linuxcncrsh linuxcnctop mdi debuglevel
+ /bin/pidof -x linuxcnctop
+ for KILL_TASK in linuxcncpanel iosh linuxcncsh linuxcncrsh linuxcnctop mdi debuglevel
+ /bin/pidof -x mdi
+ for KILL_TASK in linuxcncpanel iosh linuxcncsh linuxcncrsh linuxcnctop mdi debuglevel
+ /bin/pidof -x debuglevel
+ program_available axis-remote
+ type -path axis-remote
+ '[' '!' -z localhost:10.0 ']'
+ axis-remote --ping
+ '[' '' = other ']'
++ inivar -ini /home/pi/linuxcnc/configs/sheldon-lathe/7i90-axis.ini -var SHUTDOWN -sec HAL
+ SHUTDOWN=
+ '[' -n '' ']'
+ for KILL_TASK in linuxcncsvr milltask
+ /bin/pidof -x linuxcncsvr
1210
+ KillTaskWithTimeout
+ '[' '!' -n '' ']'
++ /bin/pidof -x linuxcncsvr
+ KILL_PIDS=1210
+ '[' '!' -n 1210 ']'
+ for KILL_PID in '$KILL_PIDS'
+ echo 'Killing task linuxcncsvr, PID=1210'
Killing task linuxcncsvr, PID=1210
+ /bin/kill 1210
+ WAIT=20
+ '[' 20 -gt 1 ']'
+ /bin/ps 1210
  PID TTY      STAT   TIME COMMAND
+ WAIT=0
+ '[' 0 -gt 1 ']'
+ '[' 0 -gt 0 ']'
+ '[' 0 -gt 0 ']'
+ KILL_PIDS=
+ KILL_TASK=
+ for KILL_TASK in linuxcncsvr milltask
+ /bin/pidof -x milltask
+ echo 'Stopping realtime threads'
Stopping realtime threads
+ halcmd stop
+ echo 'Unloading hal components'
Unloading hal components
+ halcmd unload all
hm2_rpspi: not loaded
<commandline>:0: exit value: 255
<commandline>:0: rmmod failed, returned -1
hm2: loading Mesa HostMot2 driver version 0.15
hm2: unloading
<commandline>:0: unloadrt failed
++ seq 10
+ for i in '`seq 10`'
++ halcmd list comp
++ wc -w
+ '[' 3 = 1 ']'
+ sleep .2
+ for i in '`seq 10`'
++ halcmd list comp
++ wc -w
+ '[' 3 = 1 ']'
+ sleep .2
+ for i in '`seq 10`'
++ halcmd list comp
++ wc -w
+ '[' 1 = 1 ']'
+ break
+ echo 'Removing HAL_LIB, RTAPI, and Real Time OS modules'
Removing HAL_LIB, RTAPI, and Real Time OS modules
+ /etc/init.d/realtime stop
Note: Using POSIX realtime
+ echo 'Removing NML shared memory segments'
Removing NML shared memory segments
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ ipcrm -M 1001
+ read b x t x x x x x x m x
+ case $b$t in
+ ipcrm -M 1002
+ read b x t x x x x x x m x
+ case $b$t in
+ ipcrm -M 1003
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ ipcrm -M 1004
+ read b x t x x x x x x m x
+ case $b$t in
+ ipcrm -M 1005
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ case $b$t in
+ read b x t x x x x x x m x
+ '[' -f /tmp/linuxcnc.lock ']'
+ rm /tmp/linuxcnc.lock
+ exit -1
+ ErrorCheck
+ result=255
+ '[' '!' -z localhost:10.0 ']'
+ echo 'catch {send -async popimage destroy .}; destroy .'
+ /usr/bin/wish8.6
+ '[' 255 -ne 0 ']'
+ tty -s
+ '[' -f /dev/fd/2 ']'
+ cp /dev/fd/2 /home/pi/linuxcnc_debug.txt
+ '[' -f /dev/fd/1 ']'
+ cp /dev/fd/1 /home/pi/linuxcnc_print.txt
+ echo 'LinuxCNC terminated with an error.  You can find more information in the log:
    /home/pi/linuxcnc_debug.txt
and
    /home/pi/linuxcnc_print.txt
as well as in the output of the shell command '\''dmesg'\'' and in the terminal'
LinuxCNC terminated with an error.  You can find more information in the log:
    /home/pi/linuxcnc_debug.txt
and
    /home/pi/linuxcnc_print.txt
as well as in the output of the shell command 'dmesg' and in the terminal
+ rm -f /dev/fd/2 /dev/fd/1
+ exit 255
------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today.http://sdm.link/intel
_______________________________________________
Emc-users mailing list
Emc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/emc-users

Reply via email to