Hi all,
I am practicing PRU skills through some TI examples. I am playing with PRU_ADC_onChip example and ran into a few questions. I wonder if you can help me with.
The nice thing about this example is it has a README.txt with all the procedures. The idea is to use rpmsg to communicate between arm and pru module and read out ADC value.
I am using a Beaglebone Black wireless.
Here is the basic procedures.
FILE STRUCTURE
PRU_ADC
–pru_adc_firmware.c firmware loaded into PRU0
–pru_adc_userspace
–pru_adc_userspace.c userspace code that interacts with PRU0
BUILD FIRMWARE & USERSPACE CODE
$ cd <PATH_TO_PRU_SW_SUPPORT_PACKAGE>/examples/am335x/PRU_ADC_onChip/
$ make clean
$ make
$ cd pru_adc_userspace/
$ make clean
$ make
My BBB wireless can compile pru code successfully because I installed PRU_CGT compiler. But it is unable to compile ARM code. I think that is because ARM_CCT cross-compiler toochain environment is missing, in another word, I need to install processor-sdk-am335x
My first questions is can I install processor-sdk-am335x into Debian system I currently have (Linux beaglebone 4.19.94-ti-r62 ) ? I am a little confused about the relationship between this SDK and Debian system. Why is the tutorial asking me to compile pru_adc_userspace.c in the Beaglebone. I thought it is supposed to be executed in a cross-compilation environment.
I ended up installing processor-sdk-am335x on my linux desktop and compiled successfully. Then I copied the generated file back to BBB wireless. But when I tried to run the program, it shows the following error.
Reading voltage at ADC Channel: 5
/dev/rpmsg_pru30 could not be opened.
Trying to initialize PRU using sysfs interface.
ERROR: Could not open /dev/rpmsg_pru30
Attached is the excerpt where the problem happened. Could anyone help me with some hints of what is going on here? Much appreciated.
struct shared_struct message;
/* use character device /dev/rpmsg_pru30 */
char outputFilename = “/dev/rpmsg_pru30”;
/* test that /dev/rpmsg_pru30 exists */
FILE *ofp;
uint16_t returnedVoltage;
ofp = fopen(outputFilename, “r”);
if (ofp == NULL) {
printf(“/dev/rpmsg_pru30 could not be opened. \n”);
printf(“Trying to initialize PRU using sysfs interface.\n”);
FILE *sysfs_node;
char firmware = “/sys/class/remoteproc/remoteproc1/firmware”;
char firmwareName = “PRU_ADC_onChip.out”;
sysfs_node = fopen(firmware, “r+”);
if (sysfs_node == NULL) {
printf(“cannot open firmware sysfs_node”);
return EXIT_FAILURE;
}
fwrite(&firmwareName, sizeof(uint8_t), sizeof(firmwareName),
sysfs_node);
fclose(sysfs_node);
char pruState = “/sys/class/remoteproc/remoteproc1/state”;
char start = “start”;
sysfs_node = fopen(pruState, “r+”);
if (sysfs_node == NULL) {
printf(“cannot open state sysfs_node”);
return EXIT_FAILURE;
}
fwrite(&start, sizeof(uint8_t), sizeof(start), sysfs_node);
fclose(sysfs_node);
/* give RPMSG time to initialize */
sleep(3);
ofp = fopen(outputFilename, “r”);
if (ofp == NULL) {
printf(“ERROR: Could not open /dev/rpmsg_pru30\n”);
exit(EXIT_FAILURE);
}
}