void init_hw2(void){ int i; int ram = (&_estack - &_sdata)/1024; int id = DBGMCU->IDCODE & 0xFFF; unsigned short *fl=0; unsigned long *uid=0; switch( id ){ case 0x416: // cat.1 case 0x429: // cat.2 fl = R_FLASHKB_C1; uid = R_UNIQUE_C1; break; default: // cat.3,4,5,6 fl = R_FLASHKB_CX; uid = R_UNIQUE_CX; break; } bootmsg("bootflags = 0x%x, cpuid %x/%x, %dk flash, %dk RAM\n", bootflags, SCB->CPUID, id, *fl, ram); bootmsg("clocks: sys %dMHz\n", freq_sys/1000000); bootmsg("uid %x-%x-%x\n", uid[0], uid[1], uid[2]); }
int fatfs_init(MountEntry *me) { struct stat s; if( nfs >= MAXDISK ) { PANIC("too many FATFS"); } struct FatFS *f = & fsinfo[nfs]; f->me = me; f->n = nfs; me->fsdat = f; fstat(me->fdev, &s); f->size = s.size; f_mount( nfs, & f->ff ); char buff[13]; DWORD sno; if( f_getlabel("", buff, &sno)==FR_OK ) { bootmsg("%s fatfs volume '%s' s/n %x\n", me->name, buff, sno); } nfs ++; return 0; }
static int dkpart_init(struct Device_Conf *cf, const char *pfx, int dkno, int partno, offset_t start, offset_t len, FILE *cont, const char *fstype, const char *mntpt){ struct DiskPart *dkp = alloc(sizeof(struct DiskPart)); // name this if( mntpt ){ snprintf(dkp->name, sizeof(dkp->name), "%s", mntpt); }else{ snprintf(dkp->name, sizeof(dkp->name), "%s%d%c:", pfx, dkno, partno + 'a'); } dkp->flags = cf->flags; dkp->fdev = cont; dkp->part_offset = start * DISK_BLOCK_SIZE; dkp->part_len = len * DISK_BLOCK_SIZE; finit( & dkp->file ); dkp->file.d = (void*)dkp; dkp->file.fs = &dkpart_fs; fmount( & dkp->file, dkp->name, 0); if( fstype ) fmount( & dkp->file, dkp->name, fstype ); bootmsg( "%s unit %d/%d %qd blocks mounted on %s type %s\n", cf->name, dkno, partno, len, dkp->name, fstype ); return 0; }
void init_pressure(void) { char i; for(i=0; i<10; i++) { // init i2c_xfer(I2CUNIT, ELEMENTSIN(seninit), seninit, 1000000); // try to read i2c_xfer(I2CUNIT, ELEMENTSIN(senprobe), senprobe, 100000); if( probesen[0] == LPS25HB_WHO_I_AM ) break; } bootmsg(" lps25hb"); }
void init_compass(void){ char i; for(i=0; i<10; i++){ // init i2c_xfer(I2CUNIT, ELEMENTSIN(seninit), seninit, 1000000); // try to read i2c_xfer(I2CUNIT, ELEMENTSIN(senprobe), senprobe, 100000); if( probesen[0] ) break; } bootmsg(" lis3mdl"); }
void init_imu(void){ char i; for(i=0; i<10; i++){ // init i2c_xfer(I2CUNIT, ELEMENTSIN(imuinit), imuinit, 1000000); // try to read i2c_xfer(I2CUNIT, ELEMENTSIN(imuprobe), imuprobe, 100000); if( probeimu[0] ) break; } bootmsg(" lsm6ds3"); }
void touch_init(void){ char i; // init i2c_xfer(I2CUNIT, ELEMENTSIN(touchinit), touchinit, 1000000); // try to read i2c_xfer(I2CUNIT, ELEMENTSIN(touchprobe), touchprobe, 1000000); if( capbuf[0] == CAP1298_PRODUCT_ID ){ bootmsg("cap1298 on i2c%d rev. %d\n", I2CUNIT, capbuf[2]); } }
int romdisk_init(struct Device_Conf *dev){ int port = dev->port; char info[32]; int c = dev->unit; finit( & romdsk[c].file ); romdsk[c].file.d = (void*)& romdsk[c]; romdsk[c].file.fs = & romdsk_fs; bootmsg( "%s %d bytes\n", dev->name, ROMDISK_SIZE); // set flags=1 to not automount if( ! dev->flags ){ snprintf(info, sizeof(info), "%s:", dev->name); fmount( & romdsk[c].file, info, "fatfs" ); bootmsg( "%s mounted on %s type %s\n", dev->name, info, "fatfs" ); } return (int)& romdsk[c].file; }
int udsk_init(struct Device_Conf *dev){ int port = dev->port; int c = dev->unit; finit( & udsk[c].file ); udsk[c].no = c; udsk[c].fd = open(DISKFILE, 2); udsk[c].file.d = (void*)& udsk[c]; udsk[c].file.fs = & udsk_fs; bootmsg( "%s %qd bytes @ UNIX %s\n", dev->name, DISKSIZE, DISKFILE); dkpart_learn( dev, "ud", c, &udsk[c].file, DISKSIZE / 512 ); return 0; }
/* initialize the serial ports */ int serial_init(struct Device_Conf *dev){ int i = dev->unit; USART_TypeDef *addr; int irq; int b; int altpins = dev->flags & CFFLAGS_ALTPINS; finit( & com[i].file ); com[i].file.fs = &serial_port_fs; com[i].file.codepage = CODEPAGE_UTF8; com[i].head = com[i].tail = com[i].len = 0; com[i].status = 0; com[i].portno = i; com[i].file.d = (void*)&com[i]; // enable gpio clock, usart clock, configure pins serial_pins_init( i, altpins ); switch(i){ case 0: addr = USART1; com[i].baudclock = apb2_clock_freq(); irq = (int) IRQ_USART1; break; case 1: addr = USART2; com[i].baudclock = apb1_clock_freq(); irq = (int) IRQ_USART2; break; case 2: addr = USART3; com[i].baudclock = apb1_clock_freq(); irq = (int) IRQ_USART3_4; break; default: PANIC("invalid serial"); break; } com[i].addr = addr; if( dev->baud ) serial_setbaud(i, b=dev->baud); else serial_setbaud(i, b=9600); addr->CR1 = 0x0C // enable rx/tx, no parity, 8 bit, ... | 0x20 // enable RX irq | 1; // enable // enable ints nvic_enable( irq, IPL_TTY ); if( !serial0_port ){ serial0_port = &com[i].file; } bootmsg("%s at io 0x%x irq %d %d baud\n", dev->name, addr, irq, b); return (int) &com[i].file; }