- memset(fd, 0, sizeof(*fd));
- DB(fd->fd._type = KFT_FLASH);
-
- // Set up flash programming functions.
- fd->fd.reopen = flash_at91_reopen;
- fd->fd.close = flash_at91_close;
- fd->fd.write = flash_at91_write;
- fd->fd.read = flash_at91_read;
- fd->fd.seek = flash_at91_seek;
- fd->fd.error = flash_at91_getStatus;
- fd->fd.flush = flash_at91_kfileFlush;
-
- flash_at91_open(fd);
-
- uint32_t fmcn;
- uint32_t fws = 0;
-
-
- /*
- * Compute values to insert into mode register.
- */
-
- /* main clocks in 1.5uS */
- fmcn = (CPU_FREQ/1000000ul) + (CPU_FREQ/2000000ul) + 1;
-
- /* hard overclocking */
- if (fmcn > 0xFF)
- fmcn = 0xFF;
-
- /* Only allow fmcn=0 if clock period is > 30 us = 33kHz. */
- if (CPU_FREQ <= 33333ul)
- fmcn = 0;
-
- /* Only allow fws=0 if clock frequency is < 30 MHz. */
- if (CPU_FREQ > 30000000ul)
- {
- fws = 1;
- }
-
- // Set wait states and number of MCK cycles in 1.5 usecs
- MC_FMR = fmcn << 16 | fws << 8;
-