Main Oscillator/es

From Qi-Hardware
Jump to: navigation, search

Contents

[edit] Descripcion General

A manera ilustrativa, se presenta el circuito que acompaña al oscilador principal junto a sus conexiones internas (los bloques azules representan los bloques internos del procesador).
Clock Generation Block Diagram

Identificando el funcionamiento principal del circuito exterior, el oscilador de cristal se encarga de generar un tren de pulsos a una frecuencia estable y precisa ( 12MHz ); la cual pasa a ser modulada por el circuito externo del PLL, compuesto en nuestro caso por C y R, encargados basicamente de filtrar la señal para generar a su salida, la señal cuadrada de entrada al generador de reloj .

[edit] Generador de señales

La figura anterior presenta la señal EXCLK, como la señal de entrada al generador de frecuencias de trabajo, llamado PLL; el cual, se encarga de generar el reloj del sistema CLKOUT. La siguiente figura muestra el diagrama de Bloques de este periférico:
PLL Block Diagram

El buffer de entrada (Buffer) y el divisor de entrada (Input Divider) acondicionan la señal de reloj para ingresar al PLL conformado por el detector de fase PFD el Charge Pump (CHPUP), el Oscilador controlado por voltaje VCO y la constante de realimentación 'feedback divider'. Este circuito proporciona una salida programable entre 100 y 500 MHz. La señal de conrol BP del multiplexor MUX permite seleccionar entre la salida del PLL y la señal de reloj externa. Los procesadores jz4740,jz4720 y jz4725 cuentan con la bandera PLLS que indica el momento de estabilizacion del PLL (PLLS = 1).

A continuación se listan los pasos necesarios para configurar el Generador de Señales:

1. Habilitamos la salida del PLL (PLLEN=1).

2. Seleccionamos la fuente de reloj del sistema: Definiendo BP=0 seleccionamos el reloj externo (12 MHz); para BP=1 seleccionamos la salida del PLL.

3. Para el caso BP=1, se determinan los valores de los divisores del PLL; modificando el registro CPPCR que presenta la siguiente distribucion:
PLL Register


Aqui, PLLM fija el valor de la constante de realimentación, PLLN el del divisor de entrada y PLLOD el del divisor de salida. El valor permitido para ellos es:


BIT Divider
00 1
01 2
10 2
11 4


Partiendo de los valores anteriores, la frecuencia de salida se calcula a partir de la siguiente ecuacion:


CKLOUT= XIN \cdot \frac{M}{N} \cdot \frac{1}{N0}

Donde:

M= Divisor de feedback +2.

N= Divisor de entrada + 2.

OD= Divisor de salida.

XIN=EXCLK

Es importante aclarar que para las señales de PLL que alimentan los dispositivos MMC ,I2C, LCD, USB; se dispone del bit PCS ( ver figura), el cual, se encarga de dividir nuevamente la salida del PLL. En este caso si PCS=0, la salida del PLL es divida por un factor de 2; luego , para PCS=1 no se efectua ninguna modificacion de la frecuencia.

[edit] Relojes

Una vez obtenida la señal del PLL, se deben configurar las diferentes señales de reloj; las principales son:

MCLK:

Definida como la señal de sincronización y temporización del manejo de datos y refresco de la SDRAM, representada en el circuito por CKO. El registro MSCCDR permite configurar este señal.


BIT Salida
0000 Clock_Fuente
0001 Clock_Fuente/2
0010 Clock_Fuente/3
0011 Clock_Fuente/4
0100 Clock_Fuente/6
0101 Clock_Fuente/8
0110 Clock_Fuente/12
0111 Clock_Fuente/16
1000 Clock_Fuente/24

CCLK :

Representa la frecuencia del Circuito Integrado, y es controlada con el registro CDIV. Los valores permitidos, se muestran en la tabla anterior.

LPCLK,LDCLK:

La señal LDCKL suministra la frecuencia del dispositivo LCD y la señal LPCKL proporciona la velocidad de muestreo interno del monitor LCD.

Los bits LDIV fijan el valor del reloj del controlador de LCD; a diferencia de los dos casos anteriores, el factor de división se obtiene directamente de: LDIV+1, con lo que la señal de salida es:

 \frac {ClockFuente}{LDIV+1}

Igualmente, la velocidad de muestreo interno del controlador de LCD, es fijado con el valor del registro LPCDR. El factor de division se obtiene de: LPCDR +1, arrojando asi una señal de salida equivalente a:


 \frac {ClockFuente}{LPCDR+1}


HCLK:

Esta señal se designa como la frecuencia del bus del sistema. Su valor se fija con HDIV,el factor de división puede tomar los valores indicados en la tabla 2 y controla los periféricos:

Módulo CIM (sensor de imagen) , el que a su vez genera CIM_MCLK. Modificando el divisor del CIM, MCLKDIV se fija el factor de división como MCLKDIV+1.

Controlador del USB host, el registro que determinara el factor de division UHCCDR tendra una valor igual a: UHCCDR+1.

Controlador de memorias externas, del controlador DMA y la unidad de procesamiento de imagen (IPU).


PCLK:


Esta señal fija la frecuencia de los dispositivos periféricos. Al igual que CCKL, HCKL y MCKL modificando el valor del registro PDIV (con los valores de la tabla 2) se obtiene la frecuencia de salida

Podemos ver en la gráfica 1 que esta señal alimenta los periféricos: TCU, RTC, SSI, AIC, MSC, Conversor Digital analogo(SADC), WDT, I2S, UART; para los cuales:

1. UART, Timer Counter (TCU) y USB-PHY: Seleccionan su fuente de reloj entre el PCLK y EXCLK

2. El watchdog timer selecciona su reloj de entrada entre PCLK, EXTAL y RTCCLK, usado posteriormente como reloj del contador.

3. MMC/SD:Controlador de memorias MMC/SD; Para su configuración se debe modificar el valor del registro MSCCDR cuyo factor de division es MSCCDR+1


4.SSI: Este Pin identificado como SSI_CLK (Puerto D18), asigna el reloj de entrada de la interfaz serial que permite la transferencia de datos de convertidores (A/D), codecs y otros dispositivos que dispongan de protocolo serial para la trasmicion de datos, dicha señal sirve de referencia para definir la tasa de bits de trasmicion. Iniciamos la configuracion del pin, para que este sea utilizado por los perifericos asociados, teniendo en cuenta la explicacion en I2C, seguimos los 3 primeros pasos. Posteriormente, se selecciona la fuente del reloj; para esto, modificamos el valor del registro SCS. Con SCS=1, se elige como frecuencia el PLL de salida, si SCS=0 el reloj de fuente es EXCLK. Luego, en caso se seleccionar como fuente el PLL de salida, se modifica el registro SSICDR el cual proporciona el factor de division:SSICDR +1

5. I2C: La señal denotada como I2C_SDA se encarga de suministrar el reloj de referencia y control para el bus I2C. Analizando su configuracion, apreciamos en que dicha señal es manejada como entrada/salida, y que de manera adicional, comparte el mismo pin con la señal PWM0. Dicho esto, es importante de manera inicial configurar el pin dependiendo del uso (I/O), siguiendo los pasos que se presentan a continuacion:

1. Definimos el registro PXFUN=1, para que realize la funcion asociada al periferico.

2. Definimos el registro PXSELX=1 para asignar la funcion asociada.

3. Definimos la direccion del pin (I/O) asignadole 1 al registro correspondiente; de manera especifica, el registro asociado a la salida se denota como PXDIRS, mientras que el registro asociado a la entrada se denota como PXDIRC.

Una vez declarado el pin, el siguiente paso es seleccionar la fuente del reloj; si apreciamos la grafica inicial, vemos que dicho reloj posee dos señales de referencias: EXCLK y la salida del divisor. De esta manera, para modificar su configuracion nos valemos del registro I2CS. Cuando I2CS=0, se seleccionara como reloj fuente EXCLK; luego, si I2CS=1 se eligira la salida del divisor.

En caso de la seleccion de la salida del divisor como fuente del reloj, el procesador cuenta con el registro I2SCDR, el cual define el valor del coeficiente de division a partir de: I2SCDR +1; arrojando una frecuencia de salida igual a:


 \frac {ClockFuente}{I2SCDR+1}

[edit] PLL Configuracion

En el archivo arch/mips/include/asm/mach-jz4740/regs.h se declaran cada uno de los registros necesarios para la generacion de las diferentes frecuencias:

  1. #define	CPM_BASE	0xB0000000 // 
  2. #define CPM_CPCCR	(CPM_BASE+0x00)
  3. #define CPM_CPPCR	(CPM_BASE+0x10)
  4. #define CPM_I2SCDR	(CPM_BASE+0x60)
  5. ....

Las funciones que permiten obtener su informacion almacenada se declaran en el archivo arch/mips/include/asm/mach-jz4740/ops.h :

  1. #define __cpm_get_pllm() \
  2. 	((REG_CPM_CPPCR & CPM_CPPCR_PLLM_MASK) >> CPM_CPPCR_PLLM_BIT)
  3. #define __cpm_get_plln() \
  4. 	((REG_CPM_CPPCR & CPM_CPPCR_PLLN_MASK) >> CPM_CPPCR_PLLN_BIT)
  5. #define __cpm_get_pllod() \
  6. 	((REG_CPM_CPPCR & CPM_CPPCR_PLLOD_MASK) >> CPM_CPPCR_PLLOD_BIT)
  7. #define __cpm_get_cdiv() \
  8. 	((REG_CPM_CPCCR & CPM_CPCCR_CDIV_MASK) >> CPM_CPCCR_CDIV_BIT)
  9. ..................

Al efectuar una llamada a dicha funcion, vemos que el registro definido como XXXX_MASK se compara con el registro que almacena el dato especifico, facilitando asi (luego de un corrimiento definido por la misma posicion del dato)la obtenecion de la informacion solicitada.

En el archivo arch/mips/include/asm/mach-jz4740/clock.h se definen los relojes principales y la funcion para obtener el PLL de salida.

  1. #define JZ_EXTAL		12000000 // Definicion del reloj principal
  1. typedef struct {
  2. 	unsigned int cclk;      /* CPU clock */
  3. 	unsigned int hclk;      /* System bus clock */
  4. 	unsigned int pclk;      /* Peripheral bus clock */
  5. ..............
  6. } jz_clocks_t;
  7.  
  8. /* PLL output frequency */
  9. static __inline__ unsigned int __cpm_get_pllout(void)
  10. {
  11. 	unsigned long m, n, no, pllout;
  12. 	unsigned long cppcr = REG_CPM_CPPCR;
  13. 	unsigned long od[4] = {1, 2, 2, 4};
  14. 	if ((cppcr & CPM_CPPCR_PLLEN) && !(cppcr & CPM_CPPCR_PLLBP)) {
  15. 		m = __cpm_get_pllm() + 2;
  16. 		n = __cpm_get_plln() + 2;
  17. 		no = od[__cpm_get_pllod()];
  18. 		pllout = ((JZ_EXTAL) / (n * no)) * m;
  19. 	} else
  20. 		pllout = JZ_EXTAL;
  21. 	return pllout;
  22. }

Teniendo en cuenta la explicacion inicial, aquì se evidencia la configuracion necesaria para obtener la frecuencia de salida:

Inicialmente habilitamos el funcionamiento del PLL, asignando 1 al bit CPM_CPPCR_PLLEN , en el caso que CPM_CPPCR_PLLEN sea igual a 0 se asigna como frecuencia de salida el reloj JZ_EXTAL. Al mismo tiempo, configuramos el BIT de conmutacion CPM_CPPCR_PLLBP , este habilitara la salida del PLL con 1 o asignara la frecuencia JZ_EXTAL si este se iguala a 0.

Una vez habilitada la señal del PLL, aqui se definen cada uno de los registros programables para calcular el valor de la frecuencia final. Como era de esperarse, en concordancia con la teoria expuesta, en el codigo se asignan el valor de los divisores m,n y no  ; y de manera adicional se proporciona segun la tabla .. ,el arreglo para los coeficientes de dicho divisor.

Luego, se proporcionan las funciones para obtener los relojes del sistema:

  1. /* PLL output frequency for MSC/I2S/LCD/USB */
  2. static __inline__ unsigned int __cpm_get_pllout2(void)
  3. {
  4. 	if (REG_CPM_CPCCR & CPM_CPCCR_PCS)
  5. 		return __cpm_get_pllout();
  6. 	else
  7. 		return __cpm_get_pllout()/2;
  8. }

De la definicion anterior podemos deducir que, al definir el valor del registro CPCCR , con CPM_CPCCR_PCS=0 la señal del salida del PLL que alimentara posteriormente los relojes MSC , I2S LCD y USB se dividira en 2; luego, para CPM_CPCCR_PCS=1 no se modificara la frecuencia del PLL.

  1. /* CPU core clock */
  2. static __inline__ unsigned int __cpm_get_cclk(void)
  3. {
  4. 	int div[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32};
  5.  
  6. 	return __cpm_get_pllout() / div[__cpm_get_cdiv()];
  7. }

Para la generacion del reloj del chip, se demuetra claramente, la definicion de los coeficientes de division segun la tabla , aqui, la posicion en el arreglo (cdiv) coincide el factor de division. El valor retornado coincide con la frecuencia del PLL divido en dicho factor.


  1. /* USB clock */
  2. static __inline__ unsigned int __cpm_get_usbclk(void)
  3. {
  4. 	if (REG_CPM_CPCCR & CPM_CPCCR_UCS) {
  5. 		return __cpm_get_pllout2() / (__cpm_get_udiv() + 1);
  6. 	}
  7. 	else {
  8. 		return JZ_EXTAL;
  9. 	}
  10. }
  11.  
  12. /* MSC clock */
  13. static __inline__ unsigned int __cpm_get_mscclk(void)
  14. {
  15. 	return __cpm_get_pllout2() / (__cpm_get_mscdiv() + 1);
  16. }
  17.  
  18.  
  19. ............

Tanto en la generacion del reloj para el dispositivo USB como para el MSC, se acceden al registro encargado de almacenar el factor de division: udiv para la USB y mscdiv para la MSC


De manera adicional se referencian los relojes externos de la tarjeta:


  1. /* EXTAL clock for UART,I2C,SSI,TCU,USB-PHY */
  2. static __inline__ unsigned int __cpm_get_extalclk(void)
  3. {
  4. 	return JZ_EXTAL;
  5. }

En la documentacion de la aplicacion la cual despliega un mensaje por el puerto serial de la plataforma Hello WorldPLL se aprecia la inicializacion del PLL.

[edit] References

[1] http://en.wikipedia.org/wiki/Phase-locked_loop [2] http://es.tldp.org/Otros/diccionario-us-es/...es.../S.html

Personal tools
Namespaces
Variants
Actions
Navigation
interactive
Toolbox
Print/export