Author: stepan
Date: 2008-03-28 15:25:16 +0100 (Fri, 28 Mar 2008)
New Revision: 45
Modified:
trunk/filo-0.5/drivers/usb/scsi_cmds.c
trunk/filo-0.5/drivers/usb/scsi_cmds.h
trunk/filo-0.5/drivers/usb/usb.c
trunk/filo-0.5/drivers/usb/usb_scsi_low.c
trunk/filo-0.5/drivers/usb/usb_scsi_low.h
trunk/filo-0.5/fs/fsys_iso9660.c
trunk/filo-0.5/fs/iso9660.h
trunk/filo-0.5/i386/ldscript
trunk/filo-0.5/i386/segment.c
trunk/filo-0.5/main/malloc.c
Log:
Some fixes for USB.
Thanks to Fridel Fainshtain for the malloc/alignment hints.
Modified: trunk/filo-0.5/drivers/usb/scsi_cmds.c
===================================================================
--- trunk/filo-0.5/drivers/usb/scsi_cmds.c 2008-03-13 02:25:53 UTC (rev 44)
+++ trunk/filo-0.5/drivers/usb/scsi_cmds.c 2008-03-28 14:25:16 UTC (rev 45)
@@ -228,11 +228,11 @@
uchar control;
} __attribute__ ((packed)) ReadBlockCMD_t ;
-int ll_read_block(devhandle sgd, char *buffer, int blocknum, int count)
+int ll_read_block(devhandle sgd, unsigned char *buffer, int blocknum, int count)
{
int ret;
ReadBlockCMD_t rb;
- char sensedat[32];
+ unsigned char sensedat[32];
memset(&rb,0,sizeof(rb));
rb.cmd = READ_10;
@@ -250,11 +250,11 @@
}
-int ll_write_block(devhandle sgd, char *buffer, int blocknum, int count)
+int ll_write_block(devhandle sgd, unsigned char *buffer, int blocknum, int count)
{
int ret;
ReadBlockCMD_t rb;
- char sensedat[32];
+ unsigned char sensedat[32];
memset(&rb,0,sizeof(rb));
rb.cmd = WRITE_10;
@@ -281,11 +281,11 @@
uchar control;
} __attribute__ ((packed)) ReadLongCMD_t ;
-int ll_read_long(devhandle sgd, char *buffer, int blocknum, int size)
+int ll_read_long(devhandle sgd, unsigned char *buffer, int blocknum, int size)
{
int ret;
ReadLongCMD_t rb;
- char sensedat[32];
+ unsigned char sensedat[32];
memset(&rb,0,sizeof(rb));
rb.cmd = READ_LONG;
@@ -307,7 +307,7 @@
{
int ret;
struct ReadCapacityResponse response;
- char sensedat[32];
+ unsigned char sensedat[32];
ret = scsi_command(sgd, ReadCapacityCMD, sizeof(ReadCapacityCMD), SG_DXFER_FROM_DEV, (uint8_t *)&response, sizeof(response), sensedat, sizeof(sensedat) );
if(ret<0) {
@@ -328,7 +328,7 @@
int query(devhandle sgd, query_response_t *qr)
{
int ret;
- char sensedat[32];
+ unsigned char sensedat[32];
ret = scsi_command(sgd, InquiryCMD, sizeof(InquiryCMD), SG_DXFER_FROM_DEV, (uint8_t *)qr, sizeof(query_response_t), sensedat, sizeof(sensedat) );
@@ -351,7 +351,7 @@
int ReportLUNS(devhandle sgd, lun_list_t *list)
{
int ret;
- char sensedat[32];
+ unsigned char sensedat[32];
memset (list, 0, sizeof(lun_list_t));
ret = scsi_command(sgd, ReportLunsCMD, sizeof(ReportLunsCMD), SG_DXFER_FROM_DEV, (uint8_t *)list, sizeof(lun_list_t), sensedat, sizeof(sensedat) );
@@ -399,7 +399,7 @@
int ReportOpCodes(devhandle sgd, report_opcode_result_t *list)
{
int ret;
- char sensedat[32];
+ unsigned char sensedat[32];
ReportOpcodesCMD_t ReportOpcodesCMD;
memset (list, 0, sizeof(report_opcode_result_t));
Modified: trunk/filo-0.5/drivers/usb/scsi_cmds.h
===================================================================
--- trunk/filo-0.5/drivers/usb/scsi_cmds.h 2008-03-13 02:25:53 UTC (rev 44)
+++ trunk/filo-0.5/drivers/usb/scsi_cmds.h 2008-03-28 14:25:16 UTC (rev 45)
@@ -7,7 +7,7 @@
#define ushort uint16_t
void PrintSense(uchar *sense, int len);
-int ll_read_block(devhandle sgd, char *buffer, int blocknum, int count);
+int ll_read_block(devhandle sgd, unsigned char *buffer, int blocknum, int count);
int get_capacity(devhandle sgd, unsigned long *block_count, unsigned int *blk_len);
int UnitReady(uchar sgd);
Modified: trunk/filo-0.5/drivers/usb/usb.c
===================================================================
--- trunk/filo-0.5/drivers/usb/usb.c 2008-03-13 02:25:53 UTC (rev 44)
+++ trunk/filo-0.5/drivers/usb/usb.c 2008-03-28 14:25:16 UTC (rev 45)
@@ -155,7 +155,7 @@
ushort lang;
if(!string) {
- strcpy(buffer, "unknown");
+ strcpy((char *)buffer, "unknown");
return(0);
}
@@ -191,7 +191,7 @@
real_len = len;
if(real_len<=4) {
- strcpy(buffer, "USB");
+ strcpy((char *)buffer, "USB");
real_len = 3;
buffer[real_len] = 0;
} else {
Modified: trunk/filo-0.5/drivers/usb/usb_scsi_low.c
===================================================================
--- trunk/filo-0.5/drivers/usb/usb_scsi_low.c 2008-03-13 02:25:53 UTC (rev 44)
+++ trunk/filo-0.5/drivers/usb/usb_scsi_low.c 2008-03-28 14:25:16 UTC (rev 45)
@@ -70,7 +70,7 @@
} __attribute__ ((packed)) usb_csw_t;
-int scsi_command( uchar device, unsigned char *cmd, int cmd_len, int direction, unsigned char *data, int data_len, char *sense_data, int sense_len)
+int scsi_command( uchar device, unsigned char *cmd, int cmd_len, int direction, unsigned char *data, int data_len, unsigned char *sense_data, int sense_len)
{
usb_cbw_t cbw;
usb_csw_t csw;
@@ -131,7 +131,7 @@
return(data_len - csw.residue);
}
-int request_sense( uchar device, char *sense_data, int len)
+int request_sense( uchar device, unsigned char *sense_data, int len)
{
usb_cbw_t cbw;
usb_csw_t csw;
Modified: trunk/filo-0.5/drivers/usb/usb_scsi_low.h
===================================================================
--- trunk/filo-0.5/drivers/usb/usb_scsi_low.h 2008-03-13 02:25:53 UTC (rev 44)
+++ trunk/filo-0.5/drivers/usb/usb_scsi_low.h 2008-03-28 14:25:16 UTC (rev 45)
@@ -4,7 +4,7 @@
#define SG_DXFER_FROM_DEV -3
#define SG_DXFER_TO_DEV -2
-int scsi_command( unsigned char device, unsigned char *cmd, int cmd_len, int direction, unsigned char *data, int data_len, char *sense_data, int sense_len);
-int request_sense( unsigned char device, char *sense_data, int len);
+int scsi_command( unsigned char device, unsigned char *cmd, int cmd_len, int direction, unsigned char *data, int data_len, unsigned char *sense_data, int sense_len);
+int request_sense( unsigned char device, unsigned char *sense_data, int len);
#endif
Modified: trunk/filo-0.5/fs/fsys_iso9660.c
===================================================================
--- trunk/filo-0.5/fs/fsys_iso9660.c 2008-03-13 02:25:53 UTC (rev 44)
+++ trunk/filo-0.5/fs/fsys_iso9660.c 2008-03-28 14:25:16 UTC (rev 45)
@@ -151,7 +151,7 @@
for (; idr->length.l > 0;
idr = (struct iso_directory_record *)((char *)idr + idr->length.l) )
{
- const char *name = idr->name;
+ const unsigned char *name = idr->name;
unsigned int name_len = idr->name_len.l;
file_type = (idr->flags.l & 2) ? ISO_DIRECTORY : ISO_REGULAR;
@@ -236,7 +236,7 @@
}
rr_ptr.ptr = RRCONT_BUF + ce_ptr->u.ce.offset.l;
rr_len = ce_ptr->u.ce.size.l;
- if (!iso9660_devread(ce_ptr->u.ce.extent.l, 0, ISO_SECTOR_SIZE, RRCONT_BUF))
+ if (!iso9660_devread(ce_ptr->u.ce.extent.l, 0, ISO_SECTOR_SIZE, (char *)RRCONT_BUF))
{
errnum = 0; /* this is not fatal. */
break;
Modified: trunk/filo-0.5/fs/iso9660.h
===================================================================
--- trunk/filo-0.5/fs/iso9660.h 2008-03-13 02:25:53 UTC (rev 44)
+++ trunk/filo-0.5/fs/iso9660.h 2008-03-28 14:25:16 UTC (rev 45)
@@ -152,7 +152,7 @@
typedef union RR_ptr {
struct rock_ridge *rr;
- char *ptr;
+ unsigned char *ptr;
int i;
} RR_ptr_t;
Modified: trunk/filo-0.5/i386/ldscript
===================================================================
--- trunk/filo-0.5/i386/ldscript 2008-03-13 02:25:53 UTC (rev 44)
+++ trunk/filo-0.5/i386/ldscript 2008-03-28 14:25:16 UTC (rev 45)
@@ -8,8 +8,8 @@
*/
BASE_ADDR = 0x100000;
-/* 16KB heap and stack */
-HEAP_SIZE = 16384;
+/* 32KB heap and 16k stack */
+HEAP_SIZE = 32768;
STACK_SIZE = 16384;
SECTIONS
Modified: trunk/filo-0.5/i386/segment.c
===================================================================
--- trunk/filo-0.5/i386/segment.c 2008-03-13 02:25:53 UTC (rev 44)
+++ trunk/filo-0.5/i386/segment.c 2008-03-28 14:25:16 UTC (rev 45)
@@ -48,7 +48,7 @@
unsigned long new_offset;
unsigned d0, d1, d2;
struct gdtarg gdtarg;
-#define ALIGNMENT 16
+#define ALIGNMENT 0x1000
prog_addr = virt_to_phys(&_start);
prog_size = virt_to_phys(&_end) - virt_to_phys(&_start);
Modified: trunk/filo-0.5/main/malloc.c
===================================================================
--- trunk/filo-0.5/main/malloc.c 2008-03-13 02:25:53 UTC (rev 44)
+++ trunk/filo-0.5/main/malloc.c 2008-03-28 14:25:16 UTC (rev 45)
@@ -186,20 +186,24 @@
// very dumb allot2 implementation to get
-// usb stack working quickly. This should be
-// redone later..
-//
-// note: this will fail if alignment is smaller than sizeof(unsigned long)
+// usb stack working quickly.
+
void *allot2(size_t size, unsigned int alignment)
{
void *addr;
unsigned long addrval;
- addr=malloc(2*size);
+ if(((alignment + 1) & alignment) != 0) {
+ debug("alignment not power of 2");
+ return (void *)0;
+ }
+
+ addr=malloc(size + alignment + sizeof(unsigned long));
+
addrval=(unsigned long)addr;
addrval+=alignment+1; // 0x12345600 + 0xff + 1
addrval&=~alignment; // 0x12345700
- *(void * *)(addrval-sizeof(unsigned long))=addr;
+ *(unsigned long *)(addrval-sizeof(unsigned long))=addr;
return (void *)addrval;
}
@@ -208,11 +212,9 @@
unsigned long addr=(unsigned long)mem;
addr-=sizeof(unsigned long);
- free((void *)(*(unsigned long *)addr));
+ free((void *)addr);
}
-// end of ugly code.
-
void malloc_diag(void)
{
debug("alloc: %lu bytes (%u blocks), free: %lu bytes (%u blocks)\n",