embedded-php/ext-i2c

Getting "undefined symbol: i2c_smbus_write_byte" inside the .so binary

Opened this issue · 6 comments

I am working on a project on a Raspberry Pi 3 that combines a MCP2221 chip with a ST7789V2 LCD panel. The first of these connects to the Pi via USB, and connects to the LCD via a Grove/Stemma wire. I'd like to be able to write graphics primitives to the panel from USB.

I have installed PHP 8.2 on the latest Raspberry Pi OS via the additional "Sury" repo, this seems fine.

I then went through the ext-i2c build steps and I can see i2c in my php -m.

I am using this resource to understand what bytes to send to the LCD panel. I think I need to communicate in raw I2C, but I have very little idea of what I am doing!

I know the LCD device has a default wire address of 0x3e.

For the 0x04 command (get firmware version) I believe I need to send one byte and get back four. I am trying to do it with this code (typed by hand, I don't have a GUI on the Pi):

<?php

$projectRoot = __DIR__;
require_once $projectRoot . '/vendor/autoload.php';

use I2C\Bus as I2CBus;

$busId = 2;
$i2cAddress = 0x3e;

$bus = new I2CBus($busId, $i2cAddress);
echo "Set up bus class\n";

$bus->write(0x04);
$byte0 = $bus->read();
$byte1 = $bus->read();
$byte2 = $bus->read();
$byte3 = $bus->read();
echo "Attempted to read 4 bytes from device\n";

When I run this I get a low-level error:

php: symbol lookup error: /usr/lib/php/20220829/i2c.so: undefined symbol: i2c_smbus_write_byte

Should I try PHP 8.1? Might my ext-i2c build have been defective?

Ah, so it's not PHP 8.2 - I have just reset to PHP 8.1, and I get the same error (with of course the modified Zend year/version number in the directory).

From a bit of research, it looks like there is a class of I2C functions that have been removed from Linux modules, so would guess I would need to link to an earlier version.

More information here: hallard/ArduiPi_OLED#15 (comment)

Hi @halfer , sorry for the radio silence, days have been a bit busy on this end.
The error is indeed a difference between the kernel version against which you compiled the extension and the kernel version you are running it on.
Would you please let me know each version so I can take a look at the changes?

No worries, thank you. As it happens I was trying to solve a problem the wrong way anyway - it turns out that I need to talk to the MCP2221 via USB, which will issue I2C commands on my behalf!

Let me get the information I think you need. First the kernel:

uname --all
Linux raspberrypi 6.1.23-v8+ #1642 SMP PREEMPT Mon Apr  3 17:42:16 BST 2023 aarch64 GNU/Linux

I have done the build and the run on the same Raspberry Pi 3B.

I wonder if you need information about libi2c, but I can't find it - I thought it would be available via lsmod. Do let me know what you need, and how I can get it.

Ah, just looking at modinfo i2c_dev - vermagic gives me 6.1.28-v8+, though I note this is slightly different to the uname line above.

it turns out that I need to talk to the MCP2221 via USB, which will issue I2C commands on my behalf!

Indeed that's the case! Sorry that I did not mention that before, the error got my full attention and I left that behind.

as to kernel and module version, I'll do some research here