Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: smbus в linux
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
taoga
Здраствуйте!

Имеется bq40z60evm http://www.ti.com/product/bq40z60?keyMatch...h-EN-Everything - полный менеджер батареи(батарей): зарядка, защита, контроль состояния. Для связи есть smbus.
Зарядил от нее 3S2P сборку батарей типоразмера 18650. Запитал SBC. С помощью ПО bqstudio можно контролировать,
и изменять параметры микросхемы bq40z60, они сохраняются во флэш. Здесь вопросов почти нет.

Далее мне нужно контролировать bq40z60 из Linux(ubuntu 14.04 linaro с lxde). На борде есть i2c, подсоединяю и нечего не вижу.
i2cdetect не видит адресов bq40z60. Т.е. bq40z60 отсоединено или подсоединено, вывод i2cdetect остается одним и тем же.

linaro@linaro-alip:~$ ls /dev
autofs loop7 ram13 tty12 tty4 ttymxc0
block mem ram14 tty13 tty40 ttymxc1
bus mtd0 ram15 tty14 tty41 ttymxc4
char mtd0ro ram2 tty15 tty42 ubi_ctrl
console mtd1 ram3 tty16 tty43 urandom
core mtd1ro ram4 tty17 tty44 v4l
cpu_dma_latency mtd2 ram5 tty18 tty45 vcs
disk mtd2ro ram6 tty19 tty46 vcs1
dri mtdblock0 ram7 tty2 tty47 vcs2
fb0 mtdblock1 ram8 tty20 tty48 vcs3
fb1 mtdblock2 ram9 tty21 tty49 vcs4
fd mxc_asrc random tty22 tty5 vcs5
full mxc_hdmi rfkill tty23 tty50 vcs6
fuse mxc_hdmi_cec rtc tty24 tty51 vcs7
galcore mxc_ipu rtc0 tty25 tty52 vcsa
hwrng mxc_vpu rtc1 tty26 tty53 vcsa1
i2c-0 mxs_viim sda tty27 tty54 vcsa2
i2c-1 network_latency sda1 tty28 tty55 vcsa3
i2c-2 network_throughput sdb tty29 tty56 vcsa4
input null sdb1 tty3 tty57 vcsa5
kmsg port shm tty30 tty58 vcsa6
log pps0 snd tty31 tty59 vcsa7
loop-control ptmx stderr tty32 tty6 vga_arbiter
loop0 ptp0 stdin tty33 tty60 video0
loop1 pts stdout tty34 tty61 video1
loop2 ram0 tty tty35 tty62 video16
loop3 ram1 tty0 tty36 tty63 video17
loop4 ram10 tty1 tty37 tty7 watchdog
loop5 ram11 tty10 tty38 tty8 zero
loop6 ram12 tty11 tty39 tty9

linaro@linaro-alip:~$ i2cdetect -l i2c-0 i2c
i2c-0 unknown 21a0000.i2c N/A
i2c-1 unknown 21a4000.i2c N/A
i2c-2 unknown 21a8000.i2c N/A

linaro@linaro-alip:~$ sudo i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: UU 21 -- UU -- -- -- -- -- UU -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: UU UU UU UU -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

linaro@linaro-alip:~$ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- UU -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3f
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- UU -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- --
70: -- -- -- -- -- -- -- --

linaro@linaro-alip:~$ sudo i2cdetect -y 2
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- UU -- -- -- -- -- UU -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- UU --
20: UU -- -- -- -- -- -- -- -- -- UU -- -- -- -- --
30: -- -- -- -- UU 35 -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --


От bq40z60 и Linux мне нужно несколько вещей:
1) Переходить в спящий режим (из bqstudio это команда shutdown );
2) Просыпаться из спящего режима (есть кнопка wake up на bq40z60evm);
3) Отображать индикатор состояния батареи;
4) Отображать текущий источник питания( батарея или сетевой адаптер);

Кто нибудь имел дело с smbus и с подобными микросхемами в linux?
Как настроить это в Linux, подскажите куда копать?
Jury093
Цитата(taoga @ Sep 16 2015, 12:55) *
Далее мне нужно контролировать bq40z60 из Linux(ubuntu 14.04 linaro с lxde). На борде есть i2c, подсоединяю и нечего не вижу.
i2cdetect не видит адресов bq40z60. Т.е. bq40z60 отсоединено или подсоединено, вывод i2cdetect остается одним и тем же.

вы не перепутали SDA<>SCL?
gnd подсоединили?

судя по выхлопу i2cdetect физически сами шины исправны
и если перед подключением вы не загнали чип в shutdown, то он должен детектироваться примерно по адресу 0x09, 0x0b или 0x12..

Цитата
Кто нибудь имел дело с smbus и с подобными микросхемами в linux?
Как настроить это в Linux, подскажите куда копать?

общие рекомендации:
добиваетесь того, чтобы чип продетектировался утилитой i2cdetect
утилитами i2cset/i2cget "изучаете регистры чипа и его поведение
вооружившись рефманом на чип (Technical Reference Manual (SLUUA04)), пишете драйвер для своего ядра в разделе drivers/power
taoga
Цитата(Jury093 @ Sep 17 2015, 17:39) *
вы не перепутали SDA<>SCL?
gnd подсоединили?

судя по выхлопу i2cdetect физически сами шины исправны
и если перед подключением вы не загнали чип в shutdown, то он должен детектироваться примерно по адресу 0x09, 0x0b или 0x12..


общие рекомендации:
добиваетесь того, чтобы чип продетектировался утилитой i2cdetect
утилитами i2cset/i2cget "изучаете регистры чипа и его поведение
вооружившись рефманом на чип (Technical Reference Manual (SLUUA04)), пишете драйвер для своего ядра в разделе drivers/power

Не перепутал, раза 3 проверял. И прозванивал. На обе платы(SBC и bq40z60evm) нанесена маркировка контактов. Подключал SDA, SCL, GND.
Далее начал экспериментировать с настройками bq40z60 и почти убил ее.
Сделал вот что:
Последние изменения конфигурации bq40z60:
in "SBS Configuration" - XL = 1(red), HPE=1, CPE=1, BCAST=1
Эти биты включают обмен на 400кГц и периодическую отправку информационных сообщений.
После чего Bqstudio перестало автоматически определять bq40z60evm. Использую EV2300.
Выбираю вручную bq40z60, в окне "Battery Management Studio() Supported Target"
Очень редко проходят команды: "DEVICE_NUMBER", "CHEM_ID", "RESET" ...
"CHEM_ID" - возвращает правильное значение.
Если включить в Bqstudio автоматическое чтение регистров, то иногда читаются достоверные значения регистров! Очень редко.
Т.е. линии smbus целые.

Пробовал залить сохраненный ранее srec в окне "F / W Programming" но возникают ошибки: "Program Srec: Timeout or unexpected response communicating wi
th device" или "Program Srec: Packet checksum mismatch"
Очень редко появляется индикатор прогресса "F / W Programming" но вероятно прошивка не завершается, т.к. появляется ошибка: "Execute Command: Timeout or unexpected response communicating with device".
Странно, что они не сделали сброс значений параметров с помощью внешней ножки.

В итоге bq40z60 наполовину живая. Работает по старым настройкам. Заряжает батарею, реагирует на внешний источник питания, показывает с помощью светодиодов заряд. Но начего больше с ней сделать не могу. Заказал еще несколько новых микросхем, будем чинить EVM.
Jury093
Цитата(taoga @ Sep 17 2015, 18:57) *
Не перепутал, раза 3 проверял. И прозванивал. На обе платы(SBC и bq40z60evm) нанесена маркировка контактов. Подключал SDA, SCL, GND.

а что такое SBC? плата хоста, куда цепляете bq40z60?

Цитата
in "SBS Configuration" - XL = 1(red), HPE=1, CPE=1, BCAST=1
Эти биты включают обмен на 400кГц и периодическую отправку информационных сообщений.
После чего Bqstudio перестало автоматически определять bq40z60evm. Использую EV2300.

попробуйте зайти хоть в ручном режиме и почистить на исходную XL, HPE, CPE
тут есть два варианта:
- считать память регистров и там поправить, потом обратно записать
- в расширенном режиме есть возможность посылать отдельные команды, вот там попробовать обнулить те же биты..

потом команду сброса чипа, либо через гуевую кнопку, либо через команду расширенного режима..
taoga
Цитата(Jury093 @ Sep 17 2015, 19:29) *
а что такое SBC? плата хоста, куда цепляете bq40z60?


попробуйте зайти хоть в ручном режиме и почистить на исходную XL, HPE, CPE
тут есть два варианта:
- считать память регистров и там поправить, потом обратно записать
- в расширенном режиме есть возможность посылать отдельные команды, вот там попробовать обнулить те же биты..

потом команду сброса чипа, либо через гуевую кнопку, либо через команду расширенного режима..

SBC - это Gateworks GW5400 (Ventana). Про то чтобы с помощью отдельной команды в расширенном режиме изменить значения регистра конфигурации я думал, но пока не совсем додумал.http://electronix.ru/forum/style_emoticons/default/laughing.gif. Попробую. Мне показалась, что bqStudio слишком агрессивно работает по интерфейсу, пытаясь связаться с EVM.
Еще была мысль к другой плате отладочной подсоединить, у меня есть Atmel'ая. И тоже командой поменять значения этого регистра.
Jury093
Цитата(taoga @ Sep 17 2015, 19:40) *
SBC - это Gateworks GW5400 (Ventana).

глянул в инете - хорошая машинка, на imx6, жаль памяти всего 1Г, да и число minipcie явно избыточно, а так хорошо выглядит..

Цитата
Про то чтобы с помощью отдельной команды в расширенном режиме изменить значения регистра конфигурации я думал, но пока не совсем додумал.http://electronix.ru/forum/style_emoticons/default/laughing.gif. Попробую. Мне показалась, что bqStudio слишком агрессивно работает по интерфейсу, пытаясь связаться с EVM.

в студии можно выключить активность - левая панель (дашборд), она ломится на интерфейс, вот ее и выключить..
дальше самому настойчиво исправить биты, если конечно в них дело.. ваша bq40z60 должна уметь fast-i2c, а вот за em2300 я не уверен.. еще может PEC (включенный) добавляет, причем я не удивлюсь, если писатели bqstudio не учли такой расклад..
для надежности перед сеансом пощелкайте кнопкой wakeup с поданным внешним питанием

Цитата
Еще была мысль к другой плате отладочной подсоединить, у меня есть Atmel'ая. И тоже командой поменять значения этого регистра.

я бы не стал - лучше все же использовать заведомо совместимое оборудование и софт..
taoga
Цитата(Jury093 @ Sep 17 2015, 21:39) *
глянул в инете - хорошая машинка, на imx6, жаль памяти всего 1Г, да и число minipcie явно избыточно, а так хорошо выглядит..


в студии можно выключить активность - левая панель (дашборд), она ломится на интерфейс, вот ее и выключить..
дальше самому настойчиво исправить биты, если конечно в них дело.. ваша bq40z60 должна уметь fast-i2c, а вот за em2300 я не уверен.. еще может PEC (включенный) добавляет, причем я не удивлюсь, если писатели bqstudio не учли такой расклад..
для надежности перед сеансом пощелкайте кнопкой wakeup с поданным внешним питанием


я бы не стал - лучше все же использовать заведомо совместимое оборудование и софт..

GW5404 - c 2Гб памяти.
Из-за большого количества pci-e и наличия видео она нам и нужна.
Недавно рекламу кинули: GW11036 Embedded Android Development Kit - тоже на imx6, но с 1Гб памяти.
Но почему-то в этом ките нет батареи. Я им задал вопрос. Они мне ответили, что батарея не проблема, т.к. входное напряжение от 8 до 60В.
С помощью GSC (gateworks system controller) можно переводить борду в спящий режим, просыпаться по нажатию кнопки или по таймеру, также можно получить значение входного напряжение. Скрипты для Linux в описании GSC.

По bq40z60:
Отключил активность. Попробовал послать команду (для пробы) из режима "Advanced comm SMB" - c n-ой попытки удалось. Только вот не нашел в документации кодов команд с помощью которых можно записать значение "SBS Configuration". Нашел описание для bq20z70, но там формат регистров конфигурации не такой, и скорее всего адреса отличаются. Попросил помочь с командой на форуме TI e2e.
Jury093
Цитата(taoga @ Sep 18 2015, 11:54) *
GW5404 - c 2Гб памяти.
Из-за большого количества pci-e и наличия видео она нам и нужна.
Недавно рекламу кинули: GW11036 Embedded Android Development Kit - тоже на imx6, но с 1Гб памяти.
Но почему-то в этом ките нет батареи. Я им задал вопрос. Они мне ответили, что батарея не проблема, т.к. входное напряжение от 8 до 60В.

система на imx6q, с подключенной sata и поднятой мультимедийностью прилично кушает и ваш вариант 2p3s вполне потянет такую нагрузку..
если что, то вполне можно на 3p3s перекрутить..

Цитата
По bq40z60:
Отключил активность. Попробовал послать команду (для пробы) из режима "Advanced comm SMB" - c n-ой попытки удалось. Только вот не нашел в документации кодов команд с помощью которых можно записать значение "SBS Configuration". Нашел описание для bq20z70, но там формат регистров конфигурации не такой, и скорее всего адреса отличаются. Попросил помочь с командой на форуме TI e2e.

пока Томас размышляет, попробуйте все же подолбить по алгоритму:
- ручная загрузка
- открываете вкладку "view->data memory"
- там сбрасываете биты на исходную
- и настойчиво на кнопку "Write all"
идея в том, что студия будет не все подряд перезаписывать, а только измененные значения, и шансы на запись значительно увеличатся..
если удалось перезаписать, то в правой колонке жмите кнопку "Reset"
taoga
Цитата(Jury093 @ Sep 18 2015, 12:44) *
система на imx6q, с подключенной sata и поднятой мультимедийностью прилично кушает и ваш вариант 2p3s вполне потянет такую нагрузку..
если что, то вполне можно на 3p3s перекрутить..


пока Томас размышляет, попробуйте все же подолбить по алгоритму:
- ручная загрузка
- открываете вкладку "view->data memory"
- там сбрасываете биты на исходную
- и настойчиво на кнопку "Write all"
идея в том, что студия будет не все подряд перезаписывать, а только измененные значения, и шансы на запись значительно увеличатся..
если удалось перезаписать, то в правой колонке жмите кнопку "Reset"

Пока не выполнится удачно Read All (а он не выполняется, полдня долбил) недоступны команды Write All, Import, Export. Write to data memory не выполняется по той-же причине и выдает ошибку "Operation failed because initial read of all data flash failed". Остаются только: команда из расширенного режима для записи нового значения регистра конфигурации или перепайка микросхемы.
Jury093
Цитата(taoga @ Sep 18 2015, 13:06) *
Пока не выполнится удачно Read All (а он не выполняется, полдня долбил) недоступны команды Write All, Import, Export. Write to data memory не выполняется по той-же причине и выдает ошибку "Operation failed because initial read of all data flash failed". Остаются только: команда из расширенного режима для записи нового значения регистра конфигурации или перепайка микросхемы.

ну хорошо.. а что у вас считывается старт-студии->view->data-memory->setting->sbs-configuration?
есть ли там что осмысленное?
если есть, то мышкой тыкаете прямо в значение (value) и должно появиться битовое поле, подсвеченное красными и зелеными квадратами..
попробуйте там почистить и тут же есть кнопка записи, может это поможет (при попытке записи смотрите в левый нижний угол студии, там показывают ошибки)
если пройдет, то далее Reset..
taoga
Цитата(Jury093 @ Sep 18 2015, 13:46) *
ну хорошо.. а что у вас считывается старт-студии->view->data-memory->setting->sbs-configuration?
есть ли там что осмысленное?
если есть, то мышкой тыкаете прямо в значение (value) и должно появиться битовое поле, подсвеченное красными и зелеными квадратами..
попробуйте там почистить и тут же есть кнопка записи, может это поможет (при попытке записи смотрите в левый нижний угол студии, там показывают ошибки)
если пройдет, то далее Reset..

Ничего не считывается, ячейки значений пустые. Я ж говорю не выполняется команда Read All. Когда тыкаешь во вкладку data memory программа скорее всего автоматом запускает Read All, после удачного выполнения которой появляются значения.
У меня их нет, пусто. Соответственно изменить отдельные значения регистров тоже не дает. Выдает ошибку, что сначала значения должны быть считаны. Я пробовал это делать, открывал старт-студии->view->data-memory->setting->sbs-configuration тыкал в нее, устанавливал зеленые квадраты(0) во все поля которые я менял, потом нажимал на кнопку write и появлялась ошибка, что сначала значения должны быть считаны.
Jury093
Цитата(taoga @ Sep 18 2015, 14:35) *
Ничего не считывается, ячейки значений пустые. Я ж говорю не выполняется команда Read All. Когда тыкаешь во вкладку data memory программа скорее всего автоматом запускает Read All, после удачного выполнения которой появляются значения.
У меня их нет, пусто. Соответственно изменить отдельные значения регистров тоже не дает. Выдает ошибку, что сначала значения должны быть считаны. Я пробовал это делать, открывал старт-студии->view->data-memory->setting->sbs-configuration тыкал в нее, устанавливал зеленые квадраты(0) во все поля которые я менял, потом нажимал на кнопку write и появлялась ошибка, что сначала значения должны быть считаны.

жаль..
я почитал раздел по работе через Advanced Comm SMB - там все сильно мутно и не совпадает с реалиями программы. К сожалению у Техаса это в порядке вещей. Сначала пишут софт, потом доки на чипы, потом рефейсят софт а в доках изменения не отражают. потом приходится сидеть и разгадывать шарады.

на всякий случай, проверьте чем-нить, что у вас железо не попортилось - мультиметром, а лучше осциллом, надо проверить, что уровни sda/scl больше 3в.. а то мало ли, провод переломился или контакт погнулся в разъеме.. осцилл покажет жизнедеятельность на i2c (надеюсь, что статика - не ваш случай, т.б. там все защитами обвешанно)..

и еще, покопайтесь на их форуме, мне помниться, что я видел там объяснения, как работать с закладкой Advanced (то ли на форуме, то ли в доках, точнее не скажу)
Jury093
вроде как с чтением куска флеша я чего-то получил, читаем ман:
Код
Read from DF example:
Taking the same assuming from the read DF example, to read DF,
a. Send SMBus write block with command 0x44, block = 0x00 + 0x40
b. Send SMBus read block with command 0x44
The returned block = a starting address + 32 bytes of DF data
= 0x00 + 0x40 + data1_LowByte + data1_HighByte + data2_LowByte + data2_HighByte....
data32_LowByte + data32_HighByte


сначала запись блока командой 0x44 и адрес разбитый на две байта с обратным написанием (надо 0x47c9 пишу c9 47)
потом считываю блок командой 0x44
вижу ожидаемое 0x31 - это мои бродкасты и максимальный таймаут..

а вот как записать, пока идей нет - будем на вашем чипе тренироваться sm.gif
может надо скопипастить весь блок, поправить нужные параметры и записать, а может как-то по другому..
taoga
Цитата(Jury093 @ Sep 18 2015, 16:28) *
вроде как с чтением куска флеша я чего-то получил, читаем ман:
Код
Read from DF example:
Taking the same assuming from the read DF example, to read DF,
a. Send SMBus write block with command 0x44, block = 0x00 + 0x40
b. Send SMBus read block with command 0x44
The returned block = a starting address + 32 bytes of DF data
= 0x00 + 0x40 + data1_LowByte + data1_HighByte + data2_LowByte + data2_HighByte....
data32_LowByte + data32_HighByte


сначала запись блока командой 0x44 и адрес разбитый на две байта с обратным написанием (надо 0x47c9 пишу c9 47)
потом считываю блок командой 0x44
вижу ожидаемое 0x31 - это мои бродкасты и максимальный таймаут..

а вот как записать, пока идей нет - будем на вашем чипе тренироваться sm.gif
может надо скопипастить весь блок, поправить нужные параметры и записать, а может как-то по другому..


Спасибо, мне и Том ответил. В понедельник попробую.
taoga
Цитата(taoga @ Sep 18 2015, 21:40) *
Спасибо, мне и Том ответил. В понедельник попробую.

Помогло. Сначала пытался считать. Но безрезультатно.
Потом до победного слал команду запись блока 44 c данными C9 47 20.
После того как команда прошла, передернул питание evm(включая батарею).
Bqstudio стала снова автоматически определять bq40z60.
Также мне стало понятно где найти адреса регистров конфигурации.
Нажно открыть окно Preferences (Меню Window->Preferences).
Затем установить флаг "Show Advanced Views" в ветке "All Global Settings".
После чего в в окне "Data Memory" появились адреса регистров flash.

Спасибо.
Jury093
Цитата(taoga @ Sep 21 2015, 09:14) *
Помогло. Сначала пытался считать. Но безрезультатно.
Потом до победного слал команду запись блока 44 c данными C9 47 20.

о! спасибо за информацию о технологии записи..
имхо, при работе с флешом, с моей т.з., самое неприятное случайно накатить в область пароля, сменив дефолтные установки, а потом засилить (запаролить). и если нет логов работы, то вывести такой чип в рабочее состояние нереально - только в помойку..

Цитата
После того как команда прошла, передернул питание evm(включая батарею).

достаточно было программной кнопкой Reset сбросить чип..

Цитата
Спасибо.

угу
Tarbal
Цитата(taoga @ Sep 16 2015, 13:55) *
Далее мне нужно контролировать bq40z60 из Linux(ubuntu 14.04 linaro с lxde). На борде есть i2c, подсоединяю и нечего не вижу.
i2cdetect не видит адресов bq40z60. Т.е. bq40z60 отсоединено или подсоединено, вывод i2cdetect остается одним и тем же.



Кто нибудь имел дело с smbus и с подобными микросхемами в linux?
Как настроить это в Linux, подскажите куда копать?


Прежде чем подключать надо ответить i2c на пару вопросов.
Назовем ваш борд для простоты S (slave), а компьютер M (master).

1. Подключен ли чип к которомы вы собираетесь подключится к другому мастеру внутри S? Если да, то найти способ как избежать конфликтов или обрабатывать их, используя технику разрешения приоритетов i2c.
2. Соответствует ли напряжение логического уровня сигналов на i2c у M и S? Это легко проверить у M, измерив напряжение на одном из сигналов i2c. Лучше измерять осциллографом.
Напряжение может быть 1,8; 3,3; 5 Вольт. Если пулапы установлены в S, то и в S можно просто измерить напряжение. Если нет, то измеряйте напряжение питания микросхемы и читайте справочные данные о ней. В любом случае измерьте напряжение на одном из сигналов i2c в S. 9 из 10, что пулапы стоят. Если измеренное на S напряжение близко к одному из вышеперечисленных, то вы нашли его.

Если напряжения лoгической единицы сигналов i2c M не равны напряжениям лoгической единицы сигналов i2c S, то вам надо ставить преобразователи уровня.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.