Hi Martin,
I tried rebuilding the bsp and psp libraries, and then the SPI applications, but no joy.
Here's some code inside io_fopen. dev_ptr is set to (pointer)&kernel_data->IO_DEVICES.NEXT, and then presumably IO_DEVICES.NEXT is supposed to change when _lwsem_post((LWSEM_STRUCT_PTR)&kernel_data->IO_LWSEM) is called, but it doesn't, so io_fopen returns null.
_lwsem_wait((LWSEM_STRUCT_PTR)&kernel_data->IO_LWSEM);
dev_ptr = (IO_DEVICE_STRUCT_PTR)((pointer)kernel_data->IO_DEVICES.NEXT);
while (dev_ptr != (pointer)&kernel_data->IO_DEVICES.NEXT) {
dev_name_ptr = dev_ptr->IDENTIFIER;
tmp_ptr = (char _PTR_)open_type_ptr;
while (*tmp_ptr && *dev_name_ptr &&
(*tmp_ptr == *dev_name_ptr))
{
++tmp_ptr;
++dev_name_ptr;
} /* Endwhile */
if (*dev_name_ptr == '\0') {
/* Match */
break;
} /* Endif */
dev_ptr = (IO_DEVICE_STRUCT_PTR)((pointer)dev_ptr->QUEUE_ELEMENT.NEXT);
} /* Endwhile */
_lwsem_post((LWSEM_STRUCT_PTR)&kernel_data->IO_LWSEM);
if (dev_ptr == (pointer)&kernel_data->IO_DEVICES.NEXT) {
return(NULL);
} /* Endif */
Inside lwsem, there's some code that would change IO_DEVICES.NEXT, but the if statement isn't true, so that code there doesn't execute.
if ((sem_ptr->VALUE >= 0) && (_QUEUE_GET_SIZE(&sem_ptr->TD_QUEUE)))
{
_QUEUE_DEQUEUE(&sem_ptr->TD_QUEUE, td_ptr);
_BACKUP_POINTER(td_ptr, TD_STRUCT, AUX_QUEUE);
_TIME_DEQUEUE(td_ptr, kernel_data);
td_ptr->INFO = 0; /* Signal that post is activating the task */
_TASK_READY(td_ptr, kernel_data);
_CHECK_RUN_SCHEDULER(); /* Let higher priority task run */
}