Management of non-intelligent RTM

Hi,

For our project, we would like to manage a non-intelligent RTM. How do we go about this?
Can we use the pin groups assigned to AMC slot 8 to manage the hotswap controller of the non-intelligent RTM?

Best regards,

Fatih

Hello Fatih,

the XML scheme currently only supports intelligent RTMs (like AMCs). However, the PigeonPoint software framework also provides support for non-intelligent RTMs, but we have not yet used this feature. We do however also have a module being designed now where we are planning to use a non-intelligent RTM.

You can indeed use the signals from AMC slot 8 for the hot-swap controller. However, the non-intelligent RTM needs some additional signals, since the IPMC now must take over some of the functions that are handled by the MMC on an intelligent RTM. These are the following:

  • Handle switch on the RTM
  • Blue LED enable
  • Other FRU LEDs (if required)
  • Reset signal to the RTM (if required)
  • An I2C EEPROM on the RTM for the FRU information. It may be possible to use the EEPROM on the main blade for this, but we would have to double check this if it is of interest.

You can use any of the USR or IPM I/O signals for the additional signals. Let us know if you have any questions.

cheers,
Stefan

Hi Stefan,

Just to clarify things regarding the non-intelligent RTM, we can therefore use the AMC slot 8 signals to manage the Hot-Swap controller. My question is, are we able to use IPMB-L signals from the AMC slot 8 to read/write EEPROM on the non-intelligent RTM, and how do we proceed to define this non-intelligent RTM in the IPMC code?

Thanks,

Fatih

Hello Faith,

yes, you can use the hot-swap signals from AMC port 8 for the non-intelligent RTM, have a look in the hardware guide here on page 6:

https://cernbox.cern.ch/pdf-viewer/eos/project/c/cern-ipmc-support/public/CERN-IPMC%20-%20hardware%20guide.pdf

Also connect IPMB-L to the RTM through a. hot-swappable I2C buffer as shown there. On the RTM you should connect the EEPROM and any I2C sensor devices you may have to this bus. And you also need the addition signals I mentioned in my previous message (handle switch, blue LED, etc).

As I said previously, the XML scheme does not yet include the settings for non-intelligent RTMs, this still needs to be added. However, enabling support for these in the Pigeon Point software framework only requires some #define statements. If you need a working IPMC firmware urgently, we can work with you to tailor these to your needs until the XML support is ready.

Having said this, I am currently on vacation (until end of July), however I’m sure Markus or Ralf can assist you if needed.

cheers,

Stefan

Hello Markus and Ralf,

The answer regarding the IPMB-L is not clear to us. So let me rephrase my question.

Knowing that we will have a non-intelligent RTM, therefore without MMC, the IPMB-L bus is not used in this case.
Our question is: can we connect IPMB-L directly to the RTM’s EEPROM and does the Pigeon Point software framework support this?

Otherwise, we’ve also thought of putting a second EEPROM on the Blade dedicated to the non-intelligent RTM. This EEPROM would be connected to the Mgt I2C bus, what do you think?

Cheers,

Fatih

Dear Fatih,

I am afraid that I am not knowledgeable enough to answer your question. I propose to wait until Stefan comes back.

Cheers,
Ralf.

Hello Fatih,

Knowing that we will have a non-intelligent RTM, therefore without MMC, the IPMB-L bus is not used in this case.

So you don’t have any I2C sensor devices on the RTM either? A non-intelligent RTM can have these, but they are handled by the IPMC instead of an MMC.

Our question is: can we connect IPMB-L directly to the RTM’s EEPROM and does the Pigeon Point software framework support this?

If there is no need for an I2C bus to the RTM, the this should work.

Otherwise, we’ve also thought of putting a second EEPROM on the Blade dedicated to the non-intelligent RTM. This EEPROM would be connected to the Mgt I2C bus, what do you think?

I believe this should also work, but we would like to confirm this with PigeonPoint support first. As I said before, you are the first user of a non-intelligent RTM.

cheers,

Stefan

Hello Fatih,

we confirmed with PigeonPoint: the EEPROM with the RTM FRU information can also reside on the front blade. It can be attached to any of the local I2C busses of the IPMC. If you already have an EEPROM on the board with enough space, this can even be shared with the RTM FRU information by using an address offset.

BTW, I am available to look at the IPMC part of the hardware design once it is done.

Best regards,

Stefan

Hello Stefan,

Thanks for the clarification. We have decided to add a second EEPROM to our board.

Cheers,

Fatih

Dear Support Team,

I wish you a happy new year 2025.

I’m coming back to you because we are about to start production of our non-intelligent RTM boards.

Have you had time to include the settings for non-intelligent RTMs in the XML schema?

If not, could you describe us how to set the necessary #define statements?

Cheers,

Fatih

Dear Support Team,

I’m coming back to you again, have you made any progress on this topic?

Cheers,

Fatih

Hello Fatih,

I am working on this, however I need to know which IPMC pins are connected to the RTM to finalize it. Are the schematics of the main blade and the RTM available?

cheers,

Stefan

Dear Stefan,

As the CERN-IPMC DevKit cannot access I/O above pin number 35 (didn’t known this limit before), can you please give us the configuration needed to simulate our passive-RTM code on AMC slot 0, 2 or 4 that should suit this limit ?

Best regards,
Sylvain

Hello Sylvain,

sorry for the late reply. The general purpose IPMC I/O are split into USR (35 pins) and IPM (16 pins). Both can be controlled and read using the IPMC DevKit. This can be done using the GETIO and SETIO functions of the DevKit python library here:

https://gitlab.cern.ch/ep-ese-be-xtca/ipmc-devkit

Alternatively you can use the devkit_ctrl utility. The numbering of the I/O pins is as follows:

0-34 : USR_IO pins
35-50: IPM_IO pins

There is a multiplexer in the CPLD which is used to control the AMC I/O pins, so all AMC slots should be equivalent in this respect. Therefore I’m not sure why using a dfferent AMC slot in the non-intelligent RTP confiuration would help.

Let me know if you have any further questions.

cheers,

Stefan

Hello Stefan,

Thank you for your answer.
I use devkit_ctrl, and precisely cannot read IO pin above 35:

$ for i in `seq 1 56`; do echo -n "$i: "; devkit_ctrl -a get_user_io -i  $i;done
1: Result(s):
==========

	status: success
	state: vcc
2: Result(s):
==========

	status: success
	state: vcc
3: Result(s):
==========

	status: success
	state: vcc
4: Result(s):
==========

	status: success
	state: vcc
5: Result(s):
==========

	status: success
	state: vcc
6: Result(s):
==========

	status: success
	state: vcc
7: Result(s):
==========

	status: success
	state: vcc
8: Result(s):
==========

	status: success
	state: vcc
9: Result(s):
==========

	status: success
	state: vcc
10: Result(s):
==========

	status: success
	state: vcc
11: Result(s):
==========

	status: success
	state: vcc
12: Result(s):
==========

	status: success
	state: vcc
13: Result(s):
==========

	status: success
	state: vcc
14: Result(s):
==========

	status: success
	state: vcc
15: Result(s):
==========

	status: success
	state: vcc
16: Result(s):
==========

	status: success
	state: vcc
17: Result(s):
==========

	status: success
	state: vcc
18: Result(s):
==========

	status: success
	state: vcc
19: Result(s):
==========

	status: success
	state: vcc
20: Result(s):
==========

	status: success
	state: vcc
21: Result(s):
==========

	status: success
	state: vcc
22: Result(s):
==========

	status: success
	state: vcc
23: Result(s):
==========

	status: success
	state: vcc
24: Result(s):
==========

	status: success
	state: vcc
25: Result(s):
==========

	status: success
	state: vcc
26: Result(s):
==========

	status: success
	state: vcc
27: Result(s):
==========

	status: success
	state: vcc
28: Result(s):
==========

	status: success
	state: vcc
29: Result(s):
==========

	status: success
	state: vcc
30: Result(s):
==========

	status: success
	state: vcc
31: Result(s):
==========

	status: success
	state: vcc
32: Result(s):
==========

	status: success
	state: vcc
33: Result(s):
==========

	status: success
	state: vcc
34: Result(s):
==========

	status: success
	state: gnd
35: Result(s):
==========

	status: success
	state: vcc
36: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
37: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
38: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
39: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
40: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
41: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
42: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
43: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
44: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
45: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
46: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
47: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
48: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
49: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
50: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
51: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
52: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
53: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
54: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
55: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35
56: Result(s):
==========

	status: failed
	error: IO id shall be lower than 35

Best regards,
Sylvain

Hello Sylvain,

I assume you have an old version of the the IPMC devkit software. You will need to get the updated version here:

https://gitlab.cern.ch/ep-ese-be-xtca/ipmc-tester

devkit_ctrl is in fact simply calling the following python script:

https://gitlab.cern.ch/ep-ese-be-xtca/ipmc-tester/-/blob/master/ipmc-tester/DevKITControl.py

See below:

‘’’
ipmc@ipmc-tester14:~ $ cat /usr/bin/devkit_ctrl
export PYTHONPATH=/home/ipmc/work/ipmc-tester/ipmc-devkit
python3 /home/ipmc/work/ipmc-tester/ipmc-tester/DevKITControl.py “$@”
‘’’

You will need to adjust the path to point to whereever you checked out the latest version of the ipmc-tester repository.

Let me know if you have any problems.

cheers,

Stefan

Thank you Stefan,

I carefully followed your instructions, but the script know bugs:

$ pwd
/home/pi/SylvainL
$ git clone https://gitlab.cern.ch/ep-ese-be-xtca/ipmc-tester.git
$ cat /usr/bin/devkit_ctrl
### Original: ###
#python3 /ipmc/ipmc-tester/ipmc-tester/DevKITControl.py "$@"

### As of 2025.04.09 following https://cern-ipmc-forum.web.cern.ch/t/management-of-non-intelligent-rtm/319/15
export PYTHONPATH=/home/pi/SylvainL/ipmc-tester/ipmc-devkit
python3 /home/pi/SylvainL/ipmc-tester/ipmc-tester/DevKITControl.py "$@"

$ devkit_ctrl 
Usage: devkit_ctrl -a <ACTION> [--json] 
 
Where action can be: 
==================== 
 
	Development kit functions: 
		get_power: get power status 
		select_i2cout: select I2C OUT portv 
	ATCA functions: 
		set_atca_ha: set ATCA hardware address 
		get_atca_ha: get ATCA hardware address 
		set_atca_hs: set ATCA Handle Switch position 
		get_atca_blueled: get ATCA blue led status 
		get_atca_led1: get ATCA FRU_LED1 status 
		get_atca_led2: get ATCA FRU_LED2 status 
		get_atca_led3: get ATCA FRU_LED3 status 
		get_atca_12ven: get ATCA 12V Enable signal 
		set_atca_pgooda: set power good A signal 
		set_atca_pgoodb: set power good B signal 
 
	I/O functions: 
		set_user_io: set user I/O signal 
		get_user_io: get user I/O signal 
	AMC functions: 
		set_amc_ga: set AMC geographical address 
		sel_amc_port: select AMC port on IPMC connector 
		set_amc_state: set AMC state - inserted or extracted 
		set_amc_hs: set AMC Handle Switch position 
		get_amc_mpen: get AMC MP Enable signal 
		get_amc_ppen: get AMC PP Enable signal 
		set_amc_mpgood: set AMC MP good signal 
		set_amc_ppgood: set AMC PP good signal 

$ devkit_ctrl -a get_power
Traceback (most recent call last):
  File "/home/pi/SylvainL/ipmc-tester/ipmc-tester/DevKITControl.py", line 581, in <module>
    IPMCDevObject = IPMCDevCom.IPMCDevCom(umgt_port = umgt_port)
TypeError: __init__() got an unexpected keyword argument 'umgt_port'

$ # in case of right-access related problem, checking as root
$ sudo su -
# devkit_ctrl -a get_power
Traceback (most recent call last):
  File "/home/pi/SylvainL/ipmc-tester/ipmc-tester/DevKITControl.py", line 8, in <module>
    from IPMCDevLib import IPMCDevCom as IPMCDevCom
ModuleNotFoundError: No module named 'IPMCDevLib'

By the way, how should I retrieve the current version I’ve got installed on my DevKit ?

Best regards,
Sylvain

Hello Sylvain,

ipmc-devkit is a git submodule, so unless you updated it manually afterwards, you need to do:
git clone --recurse-submodules [https://gitlab.cern.ch/ep-ese-be-xtca/ipmc-tester.git](https://gitlab.cern.ch/ep-ese-be-xtca/ipmc-tester.git)

Hi,

Looks like I don’t have sufficient permission on those repos ?

$ git submodule update
Cloning into '/home/pi/SylvainL/ipmc-tester/ipmc-firmware/tester-firmware'...
Username for 'https://gitlab.cern.ch': slafrass
Password for 'https://slafrass@gitlab.cern.ch': 
remote: The project you were looking for could not be found or you don't have permission to view it.
fatal: repository 'https://gitlab.cern.ch/ep-ese-be-xtca/ipmc-tester-firmware.git/' not found
fatal: clone of 'https://gitlab.cern.ch/ep-ese-be-xtca/ipmc-tester-firmware' into submodule path '/home/pi/SylvainL/ipmc-tester/ipmc-firmware/tester-firmware' failed
Failed to clone 'ipmc-firmware/tester-firmware'. Retry scheduled
Cloning into '/home/pi/SylvainL/ipmc-tester/ipmc-firmware/user-firmware'...
Username for 'https://gitlab.cern.ch': slafrass
Password for 'https://slafrass@gitlab.cern.ch': 
remote: The project you were looking for could not be found or you don't have permission to view it.
fatal: repository 'https://gitlab.cern.ch/ep-ese-be-xtca/ipmc-user-firmware.git/' not found
fatal: clone of 'https://gitlab.cern.ch/ep-ese-be-xtca/ipmc-user-firmware' into submodule path '/home/pi/SylvainL/ipmc-tester/ipmc-firmware/user-firmware' failed
Failed to clone 'ipmc-firmware/user-firmware'. Retry scheduled
Cloning into '/home/pi/SylvainL/ipmc-tester/ipmc-firmware/tester-firmware'...
Username for 'https://gitlab.cern.ch': slafrass
Password for 'https://slafrass@gitlab.cern.ch': 
remote: The project you were looking for could not be found or you don't have permission to view it.
fatal: repository 'https://gitlab.cern.ch/ep-ese-be-xtca/ipmc-tester-firmware.git/' not found
fatal: clone of 'https://gitlab.cern.ch/ep-ese-be-xtca/ipmc-tester-firmware' into submodule path '/home/pi/SylvainL/ipmc-tester/ipmc-firmware/tester-firmware' failed
Failed to clone 'ipmc-firmware/tester-firmware' a second time, aborting

Hello Sylvain,

sorry about that. I changed the permission on these sub-modules, even though they are not strictly needed for what you want. Can you please try again?

cheers,

Stefan