📄 pcmcia-pxa.h
字号:
/* MECR: Expansion Memory Configuration Register * (SA-1100 Developers Manual, p.10-13; SA-1110 Developers Manual, p.10-24) * * MECR layout is: * * FAST1 BSM1<4:0> BSA1<4:0> BSIO1<4:0> FAST0 BSM0<4:0> BSA0<4:0> BSIO0<4:0> * * (This layout is actually true only for the SA-1110; the FASTn bits are * reserved on the SA-1100.) */#define MCXX_SETUP_MASK (0x7f)#define MCXX_ASST_MASK (0x1f)#define MCXX_HOLD_MASK (0x3f)#define MCXX_SETUP_SHIFT (0)#define MCXX_ASST_SHIFT (7)#define MCXX_HOLD_SHIFT (14)#define MECR_SET(mecr, sock, shift, mask, bs) \((mecr)=((mecr)&~(((mask)<<(shift))<<\ ((sock)==0?MECR_SOCKET_0_SHIFT:MECR_SOCKET_1_SHIFT)))|\ (((bs)<<(shift))<<((sock)==0?MECR_SOCKET_0_SHIFT:MECR_SOCKET_1_SHIFT)))#define MECR_GET(mecr, sock, shift, mask) \((((mecr)>>(((sock)==0)?MECR_SOCKET_0_SHIFT:MECR_SOCKET_1_SHIFT))>>\ (shift))&(mask))#define MECR_BSIO_SET(mecr, sock, bs) \MECR_SET((mecr), (sock), MECR_BSIO_SHIFT, MECR_BS_MASK, (bs))#define MECR_BSIO_GET(mecr, sock) \MECR_GET((mecr), (sock), MECR_BSIO_SHIFT, MECR_BS_MASK)#define MECR_BSA_SET(mecr, sock, bs) \MECR_SET((mecr), (sock), MECR_BSA_SHIFT, MECR_BS_MASK, (bs))#define MECR_BSA_GET(mecr, sock) \MECR_GET((mecr), (sock), MECR_BSA_SHIFT, MECR_BS_MASK)#define MECR_BSM_SET(mecr, sock, bs) \MECR_SET((mecr), (sock), MECR_BSM_SHIFT, MECR_BS_MASK, (bs))#define MECR_BSM_GET(mecr, sock) \MECR_GET((mecr), (sock), MECR_BSM_SHIFT, MECR_BS_MASK)#define MECR_FAST_SET(mecr, sock, fast) \MECR_SET((mecr), (sock), MECR_FAST_SHIFT, MECR_FAST_MODE_MASK, (fast))#define MECR_FAST_GET(mecr, sock) \MECR_GET((mecr), (sock), MECR_FAST_SHIFT, MECR_FAST_MODE_MASK)/* This function implements the BS value calculation for setting the MECR * using integer arithmetic: */static inline unsigned int pxa_pcmcia_mecr_bs(unsigned int pcmcia_cycle_ns, unsigned int cpu_clock_khz){ unsigned int t = ((pcmcia_cycle_ns * cpu_clock_khz) / 6) - 1000000; return (t / 1000000) + (((t % 1000000) == 0) ? 0 : 1);}static inline unsigned int pxa_mcxx_hold(unsigned int pcmcia_cycle_ns, unsigned int mem_clk_10khz){ unsigned int code = pcmcia_cycle_ns * mem_clk_10khz; return (code / 300000) + ((code % 300000) ? 1 : 0) - 1;}static inline unsigned int pxa_mcxx_asst(unsigned int pcmcia_cycle_ns, unsigned int mem_clk_10khz){ unsigned int code = pcmcia_cycle_ns * mem_clk_10khz; return (code / 300000) + ((code % 300000) ? 1 : 0) - 1;}static inline unsigned int pxa_mcxx_setup(unsigned int pcmcia_cycle_ns, unsigned int mem_clk_10khz) { unsigned int code = pcmcia_cycle_ns * mem_clk_10khz; return (code / 100000) + ((code % 100000) ? 1 : 0) - 1;}/* This function returns the (approxmiate) command assertion period, in * nanoseconds, for a given CPU clock frequency and MCXX_ASST value: */static inline unsigned int pxa_pcmcia_cmd_time(unsigned int mem_clk_10khz, unsigned int pcmcia_mcxx_asst) { return (300000 * (pcmcia_mcxx_asst + 1) / mem_clk_10khz);}#define PXA_PCMCIA_IO_ACCESS (165)#define PXA_PCMCIA_5V_MEM_ACCESS (150)#define PXA_PCMCIA_3V_MEM_ACCESS (300)/* Crystal clock */#define BASE_CLK 3686400/* * Return the current lclk requency in units of 10kHz */unsigned int get_lclk_frequency_10khz(void) { /* Crystal Frequency to Memory Frequency Multiplier (L) */ unsigned char L_clk_mult[32] = { 0, 27, 32, 36, 40, 45, 0 }; return L_clk_mult[(CCCR >> 0) & 0x1f] * BASE_CLK / 10000;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -