changeset 2365:6f3a847c9adc

* include/var_io.h: Fixed up the EMAC definitions to work with the brand new EMAC driver 2007-02-01 Andrew Lunn <andrew.lunn@ascom.ch> * include/var_io.h: Added PWM registers. 2007-01-25 Andrew Lunn <andrew.lunn@ascom.ch> * include/var_io.h (AT91_PITC_VALUE_MASK): New - mask to access the PITC value which is a 20 bit number. * src/timer_pit.c: Change all hard coded mask for the period, some of which were wrong, to use AT91_PITC_VALUE_MASK. When initializing the PIT, remember to decrement the period first. Bugs found by Jim Seymour.
author asl
date Tue, 20 Feb 2007 21:33:03 +0000
parents 028e0fe198b5
children 5bcdb1b5eb69
files packages/hal/arm/at91/var/current/ChangeLog packages/hal/arm/at91/var/current/include/var_io.h packages/hal/arm/at91/var/current/src/timer_pit.c
diffstat 3 files changed, 217 insertions(+), 70 deletions(-) [+]
line wrap: on
line diff
--- a/packages/hal/arm/at91/var/current/ChangeLog
+++ b/packages/hal/arm/at91/var/current/ChangeLog
@@ -1,3 +1,21 @@
+2007-02-13  John Eigelaar <jeigelaar@mweb.co.za>
+ 
+ 	* include/var_io.h: Fixed up the EMAC definitions to work
+ 	with the brand new EMAC driver  
+
+2007-02-01  Andrew Lunn  <andrew.lunn@ascom.ch>
+
+	* include/var_io.h: Added PWM registers.
+
+2007-01-25  Andrew Lunn  <andrew.lunn@ascom.ch>
+
+	* include/var_io.h (AT91_PITC_VALUE_MASK): New - mask to access
+	the PITC value which is a 20 bit number.
+	* src/timer_pit.c: Change all hard coded mask for the period, 
+	some of which were wrong, to use AT91_PITC_VALUE_MASK. 
+	When initializing the PIT, remember to decrement the period first.
+	Bugs found by Jim Seymour.
+
 2006-09-08  John Eigelaar <jeigelaar@mweb.co.za>
 
 	* include/var_io.h: Added definition for SPI MODFDIS bit 
--- a/packages/hal/arm/at91/var/current/include/var_io.h
+++ b/packages/hal/arm/at91/var/current/include/var_io.h
@@ -379,8 +379,8 @@
 #define AT91_SPI_NPCS1      AT91_PIN(0,0,31) // SPI Chip Select 1
 #endif
 
-#define AT91_TC_TI0A0       AT91_PIN(0,1, 0) // Timer/Counter 0 IO Line A
-#define AT91_TC_TI0B0       AT91_PIN(0,1, 1) // Timer/Counter 0 IO Line B
+#define AT91_TC_TIOA0       AT91_PIN(0,1, 0) // Timer/Counter 0 IO Line A
+#define AT91_TC_TIOB0       AT91_PIN(0,1, 1) // Timer/Counter 0 IO Line B
 #define AT91_USART_SCK0     AT91_PIN(0,1, 2) // USART 0 Serial Clock
 #define AT91_SPI_NPCS3      AT91_PIN(0,1, 3) // SPI Chip Select 3
 #define AT91_TC_TCLK0       AT91_PIN(0,1, 4) // Timer/Counter 0 Clock Input
@@ -903,6 +903,10 @@
 #endif
 
 #define AT91_TC_TC0     0x00
+#define AT91_TC_TC1     0x40
+#define AT91_TC_TC2     0x80
+#define AT91_TC_TC_SIZE 0x40
+
 #define AT91_TC_CCR     0x00
 #define AT91_TC_CCR_CLKEN  0x01
 #define AT91_TC_CCR_CLKDIS 0x02
@@ -1020,6 +1024,21 @@
 #define AT91_TC_BCR     0xC0
 #define AT91_TC_BCR_SYNC   0x01
 #define AT91_TC_BMR     0xC4
+#define AT91_TC_BMR_MASK (0x3f)
+#define AT91_TC_BMR_TC0XC0S_TCLK0 (0 << 0) // XC0S = TCLK0
+#define AT91_TC_BMR_TC0XC0S_NONE  (1 << 0) // XC0S = none
+#define AT91_TC_BMR_TC0XC0S_TIOA1 (2 << 0) // XC0S = TIOA1
+#define AT91_TC_BMR_TC0XC0S_TIOA2 (3 << 0) // XC0S = TIOA2
+#define AT91_TC_BMR_TC1XC1S_TCLK1 (0 << 2) // XC1S = TCLK1
+#define AT91_TC_BMR_TC1XC1S_NONE  (1 << 2) // XC1S = none
+#define AT91_TC_BMR_TC1XC1S_TIOA0 (2 << 2) // XC1S = TIOA0
+#define AT91_TC_BMR_TC1XC1S_TIOA2 (3 << 2) // XC1S = TIOA2
+#define AT91_TC_BMR_TC2XC2S_TCLK2 (0 << 4) // XC2S = TCLK2
+#define AT91_TC_BMR_TC2XC2S_NONE  (1 << 4) // XC2S = none
+#define AT91_TC_BMR_TC2XC2S_TIOA0 (2 << 4) // XC2S = TIOA0
+#define AT91_TC_BMR_TC2XC2S_TIOA1 (3 << 4) // XC2S = TIOA1
+
+
 
 //=============================================================================
 // External Bus Interface
@@ -1618,6 +1637,7 @@
 #define AT91_PITC_PISR_PITS   (1 << 0)  // Periodic Interval Timer Status
 #define AT91_PITC_PIVR 0x08  // Period Interval Status Register
 #define AT91_PITC_PIIR 0x0C  // Period Interval Image Register
+#define AT91_PITC_VALUE_MASK 0x000fffff  // 20-bit period value
 #endif
 
 //=============================================================================
@@ -1848,46 +1868,44 @@
 #define AT91_EMAC 0xFFFBC000
 #endif
 
-
-#define AT91_EMAC_CTL  (0x00) // Network Control
-#define AT91_EMAC_CTL_LB     (1 <<  0) // Loopback
-#define AT91_EMAC_CTL_LBL    (1 <<  1) // Loopback Local 
-#define AT91_EMAC_CTL_RE     (1 <<  2) // Receiver Enable
-#define AT91_EMAC_CTL_TX     (1 <<  3) // Transmit Enable
-#define AT91_EMAC_CTL_MPE    (1 <<  4) // Management Port Enable
-#define AT91_EMAC_CTL_CSR    (1 <<  5) // Clear Statistics Registers
-#define AT91_EMAC_CTL_ISR    (1 <<  6) // Increment Statistics Registers
-#define AT91_EMAC_CTL_WES    (1 <<  7) // Write Enable for Statistics Registers
-#define AT91_EMAC_CTL_BP     (1 <<  8) // Back Pressure 
-#define AT91_EMAC_CTL_TSTART (1 <<  9) // Start Transmitter
-#define AT91_EMAC_CTL_THALT  (1 << 10) // Halt Transmitter
+#define AT91_EMAC_NCR  (0x00) // Network Control
+#define AT91_EMAC_NCR_LB     (1 <<  0) // Loopback
+#define AT91_EMAC_NCR_LBL    (1 <<  1) // Loopback Local 
+#define AT91_EMAC_NCR_RE     (1 <<  2) // Receiver Enable
+#define AT91_EMAC_NCR_TX     (1 <<  3) // Transmit Enable
+#define AT91_EMAC_NCR_MPE    (1 <<  4) // Management Port Enable
+#define AT91_EMAC_NCR_CSR    (1 <<  5) // Clear Statistics Registers
+#define AT91_EMAC_NCR_ISR    (1 <<  6) // Increment Statistics Registers
+#define AT91_EMAC_NCR_WES    (1 <<  7) // Write Enable for Statistics Registers
+#define AT91_EMAC_NCR_BP     (1 <<  8) // Back Pressure 
+#define AT91_EMAC_NCR_TSTART (1 <<  9) // Start Transmitter
+#define AT91_EMAC_NCR_THALT  (1 << 10) // Halt Transmitter
 
-#define AT91_EMAC_CFG  (0x04) // Network Configuration
-#define AT91_EMAC_CFG_SPD_10Mbps  (0 <<  0) // 10Mbps line speed
-#define AT91_EMAC_CFG_SPD_100Mbps (1 <<  0) // 100Mbps line speed
-#define AT91_EMAC_CFG_FD          (1 <<  1) // Full Deplex
-#define AT91_EMAC_CFG_BR          (1 <<  2) // Bit Rate
-#define AT91_EMAC_CFG_CAF         (1 <<  4) // Copy All Frames
-#define AT91_EMAC_CFG_NBC         (1 <<  5) // Don't receiver Broadcasts
-#define AT91_EMAC_CFG_MTI         (1 <<  6) // Multicast Hash Enable
-#define AT91_EMAC_CFG_UNI         (1 <<  7) // Unicast hash enable
-#define AT91_EMAC_CFG_BIG         (1 <<  8) // Receive upto 1522 byte frames
-#define AT91_EMAC_CFG_EAE         (1 <<  9) // External Address match Enable
-#define AT91_EMAC_CFG_CLK_HCLK_8  (0 << 10) // HCLK divided by 8
-#define AT91_EMAC_CFG_CLK_HCLK_16 (1 << 10) // HCLK divided by 16
-#define AT91_EMAC_CFG_CLK_HCLK_32 (2 << 10) // HCLK divided by 32
-#define AT91_EMAC_CFG_CLK_HCLK_64 (3 << 10) // HCLK divided by 64
-#define AT91_EMAC_CFG_CLK_MASK    (3 << 10) // HCLK mask
-#define AT91_EMAC_CFG_CLK_RTY     (1 << 12) // Retry Test
-#define AT91_EMAC_CFG_CLK_RMII    (1 << 13) // Enable RMII mode
-#define AT91_EMAC_CFG_CLK_MII     (0 << 13) // Enable MII mode
-#define AT91_EMAC_SR   (0x08) // Network Status
-#define AT91_EMAC_SR_MDIO_MASK (1 << 1) // MDIO Pin status
-#define AT91_EMAC_SR_IDLE      (1 << 2) // PHY logical is idle
-#define AT91_EMAC_TAR  (0x0c) // Transmit Address 
-#define AT91_EMAC_TCR  (0x10) // Transmit Control
-#define AT91_EMAC_TCR_LEN_MASK (0x3ff <<  0) // Transmit frame length
-#define AT91_EMAC_TCR_NCRC     (    1 << 15) // No CRC added by MAC
+#define AT91_EMAC_NCFG  (0x04) // Network Configuration
+#define AT91_EMAC_NCFG_SPD_10Mbps  (0 <<  0) // 10Mbps line speed
+#define AT91_EMAC_NCFG_SPD_100Mbps (1 <<  0) // 100Mbps line speed
+#define AT91_EMAC_NCFG_FD          (1 <<  1) // Full Deplex
+#define AT91_EMAC_NCFG_BR          (1 <<  2) // Bit Rate
+#define AT91_EMAC_NCFG_CAF         (1 <<  4) // Copy All Frames
+#define AT91_EMAC_NCFG_NBC         (1 <<  5) // Don't receiver Broadcasts
+#define AT91_EMAC_NCFG_MTI         (1 <<  6) // Multicast Hash Enable
+#define AT91_EMAC_NCFG_UNI         (1 <<  7) // Unicast hash enable
+#define AT91_EMAC_NCFG_BIG         (1 <<  8) // Receive upto 1522 byte frames
+#define AT91_EMAC_NCFG_EAE         (1 <<  9) // External Address match Enable
+#define AT91_EMAC_NCFG_CLK_HCLK_8  (0 << 10) // HCLK divided by 8
+#define AT91_EMAC_NCFG_CLK_HCLK_16 (1 << 10) // HCLK divided by 16
+#define AT91_EMAC_NCFG_CLK_HCLK_32 (2 << 10) // HCLK divided by 32
+#define AT91_EMAC_NCFG_CLK_HCLK_64 (3 << 10) // HCLK divided by 64
+#define AT91_EMAC_NCFG_CLK_MASK    (3 << 10) // HCLK mask
+#define AT91_EMAC_NCFG_CLK_RTY     (1 << 12) // Retry Test
+#define AT91_EMAC_NCFG_CLK_RMII    (1 << 13) // Enable RMII mode
+#define AT91_EMAC_NCFG_CLK_MII     (0 << 13) // Enable MII mode
+#define AT91_EMAC_NCFG_RLCE        (0 << 16) // Receive Length Check Enable
+
+#define AT91_EMAC_NSR   (0x08) // Network Status
+#define AT91_EMAC_NSR_MDIO_MASK (1 << 1) // MDIO Pin status
+#define AT91_EMAC_NSR_IDLE      (1 << 2) // PHY logical is idle
+
 #define AT91_EMAC_TSR  (0x14) // Transmit Status
 #define AT91_EMAC_TSR_OVR    (1 << 0) // Overrun
 #define AT91_EMAC_TSR_COL    (1 << 1) // Collision occurred
@@ -1896,12 +1914,15 @@
 #define AT91_EMAC_TSR_BNQ    (1 << 4) // Buffer Not Queues
 #define AT91_EMAC_TSR_COMP   (1 << 5) // Transmission Complete
 #define AT91_EMAC_TSR_UND    (1 << 6) // Transmit Underrun
+
 #define AT91_EMAC_RBQP (0x18) // Receiver Buffer Queue Pointer
 #define AT91_EMAC_TBQP (0x1c) // Transmit Buffer Queue Pointer
+
 #define AT91_EMAC_RSR  (0x20) // Receiver Status
 #define AT91_EMAC_RSR_BNA (1 << 0) // Buffer Not Available
 #define AT91_EMAC_RSR_REC (1 << 1) // Frame Received
 #define AT91_EMAC_RSR_OVR (1 << 2) // Transmit Buffer Overrun
+
 #define AT91_EMAC_ISR  (0x24) // Interrupt Status
 #define AT91_EMAC_ISR_DONE  (1 <<  0) // Management Done
 #define AT91_EMAC_ISR_RCOM  (1 <<  1) // Receiver Complete
@@ -1918,35 +1939,46 @@
 #define AT91_EMAC_IER  (0x28) // Interrupt Enable
 #define AT91_EMAC_IDR  (0x2c) // Interrupt Disable
 #define AT91_EMAC_IMR  (0x30) // Interrupt Mask
+
 #define AT91_EMAC_MAN  (0x34) // PHY Maintenance
-#define AT91_EMAC_MAN_DATA_MASK  (0xffff <<  0) // Data to/from PHY
-#define AT91_EMAC_MAN_CODE       (2      << 16) // Code
-#define AT91_EMAC_MAN_REGA_MASK  (0x1f   << 18) // Register Address Mask
+#define AT91_EMAC_MAN_DATA_MASK  (0xffff<<0)    // Data to/from PHY
+#define AT91_EMAC_MAN_CODE       (2<<16)        // Code
+#define AT91_EMAC_MAN_REGA_MASK  (0x1f<<18)     // Register Address Mask
 #define AT91_EMAC_MAN_REGA_SHIFT (18)           // Register Address Shift
-#define AT91_EMAC_MAN_PHY_MASK   (0x1f   << 23) // PHY Address Mask
+#define AT91_EMAC_MAN_PHY_MASK   (0x1f<<23)     // PHY Address Mask
 #define AT91_EMAC_MAN_PHY_SHIFT  (23)           // PHY Address Shift
-#define AT91_EMAC_MAN_RD         (2      << 28) // Read operation
-#define AT91_EMAC_MAN_WR         (1      << 28) // Write Operation
-#define AT91_EMAC_MAN_HIGH       (1      << 30) // Must be set to 1
-#define AT91_EMAC_FRA  (0x40) // Frames Transmitted OK
-#define AT91_EMAC_SCOL (0x44) // Single Collision Frame
-#define AT91_EMAC_MCOL (0x48) // Multiple Collision Frame
-#define AT91_EMAC_OK   (0x4c) // Frames Received OK
-#define AT91_EMAC_SEQE (0x50) // Frame Check Sequence Error
+#define AT91_EMAC_MAN_RD         (2<<28)        // Read operation
+#define AT91_EMAC_MAN_WR         (1<<28)        // Write Operation
+#define AT91_EMAC_MAN_SOF        (1<<30)        // Must be set to 01
+#define AT91_EMAC_MAN_PHYA(x)    ((x&0x1f)<<23) // Create a PHY Address
+#define AT91_EMAC_MAN_REGA(x)    ((x&0x1f)<<18) // Create a Register Address
+#define AT91_EMAC_MAN_DATA(x)    (x&0xffff)     // Create a Data word
+                                          
+
+#define AT91_EMAC_PTR  (0x38) // Pause Time Register
+#define AT91_EMAC_PFR  (0x3C) // Pause Frames Received
+#define AT91_EMAC_FTO  (0x40) // Frames Transmitted OK
+#define AT91_EMAC_SCF  (0x44) // Single Collision Frame
+#define AT91_EMAC_MCF  (0x48) // Multiple Collision Frame
+#define AT91_EMAC_FRO  (0x4c) // Frames Received OK
+#define AT91_EMAC_FCSE (0x50) // Frame Check Sequence Error
 #define AT91_EMAC_ALE  (0x54) // Alignment Error
 #define AT91_EMAC_DTR  (0x58) // Deferred Transmission Frame
 #define AT91_EMAC_LCOL (0x5c) // Late Collision
-#define AT91_EMAC_XCOL (0x60) // Excessive Collisions - ECAL!!
-#define AT91_EMAC_CSE  (0x64) // Carrier Sense Error
-#define AT91_EMAC_TUE  (0x68) // Transmit Underrun Error
-#define AT91_EMAC_CDE  (0x6c) // Code Error
-#define AT91_EMAC_ELR  (0x70) // Excessive Length
-#define AT91_EMAC_RJB  (0x74) // Receiver Jabber 
-#define AT91_EMAC_USF  (0x78) // Undersize Frame
-#define AT91_EMAC_SQEE (0x7c) // SEQ Test Error
-#define AT91_EMAC_DRFC (0x80) // Discarded RX Frame
-#define AT91_EMAC_HSH  (0x90) // Hash Address High [63:21]
-#define AT91_EMAC_HSL  (0x94) // Hash Address Low  [31:0]
+#define AT91_EMAC_XCOL (0x60) // Excessive Collisions - ECOL!!
+#define AT91_EMAC_TUND (0x64) // Transmit Underrun Error
+#define AT91_EMAC_CSE  (0x68) // Carrier Sense Error
+#define AT91_EMAC_RRE  (0x6c) // Receive Resource Errors
+#define AT91_EMAC_ROV  (0x70) // Receive Overrun
+#define AT91_EMAC_RSE  (0x74) // Receiver Symbol erros 
+#define AT91_EMAC_ELE  (0x78) // Excessive Length Errors
+#define AT91_EMAC_RJE  (0x7c) // Receive Jabber Errors
+#define AT91_EMAC_USF  (0x80) // Undersize Frame Errors
+#define AT91_EMAC_STE  (0x84) // SQE Test Errors
+#define AT91_EMAC_RLE  (0x88) // Receive Length Field Mismatch
+                              
+#define AT91_EMAC_HRB  (0x90) // Hash Address Low  [31:0]
+#define AT91_EMAC_HRT  (0x94) // Hash Address High [63:32]
 #define AT91_EMAC_SA1L (0x98) // Specific Address 1 Low, First 4 bytes
 #define AT91_EMAC_SA1H (0x9c) // Specific Address 1 High, Last 2 bytes
 #define AT91_EMAC_SA2L (0xa0) // Specific Address 2 Low, First 4 bytes
@@ -1955,9 +1987,15 @@
 #define AT91_EMAC_SA3H (0xac) // Specific Address 3 High, Last 2 bytes
 #define AT91_EMAC_SA4L (0xb0) // Specific Address 4 Low, First 4 bytes
 #define AT91_EMAC_SA4H (0xb4) // Specific Address 4 High, Last 2 bytes
+#define AT91_EMAC_TID  (0xb8) // Type ID Checking Register
+
+#define AT91_EMAC_USRIO  (0xc0) // User IO Register
+#define AT91_EMAC_USRIO_RMII   (1<<0) // RMII Mode
+#define AT91_EMAC_USRIO_CLKEN  (1<<1) // Clock Enable
 
 // Receiver Buffer Descriptor
 #define AT91_EMAC_RBD_ADDR 0x0  // Address to beginning of buffer
+#define AT91_EMAC_RBD_ADDR_MASK   (0xFFFFFFFC) // Address Mask masking the reserved bits
 #define AT91_EMAC_RBD_ADDR_OWNER_EMAC (0 << 0) // EMAC owns receiver buffer
 #define AT91_EMAC_RBD_ADDR_OWNER_SW   (1 << 0) // SW owns receiver buffer
 #define AT91_EMAC_RBD_ADDR_WRAP       (1 << 1) // Last receiver buffer
@@ -2248,12 +2286,103 @@
 
 #endif
 
+//=============================================================================
+// Pulse Width Modulation (PWM)
+
+#if defined(CYGHWR_HAL_ARM_AT91SAM7)
+
+#ifndef AT91_PWM
+#define AT91_PWM     0XFFFCC000
+#define AT91_PWM_CH0 0xFFFCC200
+#define AT91_PWM_CH1 0xFFFCC220
+#define AT91_PWM_CH2 0xFFFCC240
+#define AT91_PWM_CH3 0xFFFCC260
+#define AT91_PWM_CH_SIZE 0x20
+#endif
+
+#if defined(CYGHWR_HAL_ARM_AT91SAM7)
+#define AT91_PWM_CHANNELS 4
+#endif
+
+#define AT91_PWM_MR  (0x00) // Mode 
+#define AT91_PWM_MR_DIVA_MASK  (0xff) // CLKA divide factor mask
+#define AT91_PWM_MR_DIVA_SHIFT (00)   // CLKA divide factor shirt
+#define AT91_PWM_MR_PREA_MCK_BY_1    ( 0 <<  8) // Prescale A MCLK / 1
+#define AT91_PWM_MR_PREA_MCK_BY_2    ( 1 <<  8) // Prescale A MCLK / 2
+#define AT91_PWM_MR_PREA_MCK_BY_4    ( 2 <<  8) // Prescale A MCLK / 4
+#define AT91_PWM_MR_PREA_MCK_BY_8    ( 3 <<  8) // Prescale A MCLK / 8
+#define AT91_PWM_MR_PREA_MCK_BY_16   ( 4 <<  8) // Prescale A MCLK / 16
+#define AT91_PWM_MR_PREA_MCK_BY_32   ( 5 <<  8) // Prescale A MCLK / 32
+#define AT91_PWM_MR_PREA_MCK_BY_64   ( 6 <<  8) // Prescale A MCLK / 64
+#define AT91_PWM_MR_PREA_MCK_BY_128  ( 7 <<  8) // Prescale A MCLK / 128
+#define AT91_PWM_MR_PREA_MCK_BY_256  ( 8 <<  8) // Prescale A MCLK / 256
+#define AT91_PWM_MR_PREA_MCK_BY_512  ( 9 <<  8) // Prescale A MCLK / 512
+#define AT91_PWM_MR_PREA_MCK_BY_1024 (10 <<  8) // Prescale A MCLK / 1024
+
+#define AT91_PWM_MR_DIVB_MASK  (0xff) // CLKB divide factor mask
+#define AT91_PWM_MR_DIVB_SHIFT (16)   // CLKB divide factor shirt
+#define AT91_PWM_MR_PREB_MCK_BY_1    ( 0 << 24) // Prescale B MCLK / 1
+#define AT91_PWM_MR_PREB_MCK_BY_2    ( 1 << 24) // Prescale B MCLK / 2
+#define AT91_PWM_MR_PREB_MCK_BY_4    ( 2 << 24) // Prescale B MCLK / 4
+#define AT91_PWM_MR_PREB_MCK_BY_8    ( 3 << 24) // Prescale B MCLK / 8
+#define AT91_PWM_MR_PREB_MCK_BY_16   ( 4 << 24) // Prescale B MCLK / 16
+#define AT91_PWM_MR_PREB_MCK_BY_32   ( 5 << 24) // Prescale B MCLK / 32
+#define AT91_PWM_MR_PREB_MCK_BY_64   ( 6 << 24) // Prescale B MCLK / 64
+#define AT91_PWM_MR_PREB_MCK_BY_128  ( 7 << 24) // Prescale B MCLK / 128
+#define AT91_PWM_MR_PREB_MCK_BY_256  ( 8 << 24) // Prescale B MCLK / 256
+#define AT91_PWM_MR_PREB_MCK_BY_512  ( 9 << 24) // Prescale B MCLK / 512
+#define AT91_PWM_MR_PREB_MCK_BY_1024 (10 << 24) // Prescale B MCLK / 1024
+#define AT91_PWM_ENA (0x04) // Enable
+#define AT91_PWM_CHANNEL_ID_0 (0)    // Channel ID 0
+#define AT91_PWM_CHANNEL_ID_1 (1)    // Channel ID 1
+#define AT91_PWM_CHANNEL_ID_2 (2)    // Channel ID 2
+#define AT91_PWM_CHANNEL_ID_3 (3)    // Channel ID 3
+#define AT91_PWM_CHANNEL_ID_4 (4)    // Channel ID 4
+#define AT91_PWM_CHANNEL_ID_5 (5)    // Channel ID 5
+#define AT91_PWM_CHANNEL_ID_6 (6)    // Channel ID 6
+#define AT91_PWM_CHANNEL_ID_7 (7)    // Channel ID 7
+#define AT91_PWM_DIS (0x08) // Disable 
+#define AT91_PWM_SR  (0x0c) // Status 
+#define AT91_PWM_IER (0x10) // Interrupt Enable
+#define AT91_PWM_IDR (0x14) // Interrupt Disable
+#define AT91_PWM_IMR (0x18) // Interrupt Mask
+#define AT91_PWM_ISR (0x1c) // Interrupt Status
+#define AT91_PWM_VR  (0xfc) // Version
+
+// Channel registers. 
+#define AT91_PWM_CMR   (0x00) // Channel Mode
+#define AT91_PWM_CMR_CPRE_MCK_BY_1     0  // Channel Prescale MCL / 1
+#define AT91_PWM_CMR_CPRE_MCK_BY_2     1  // Channel Prescale MCL / 2
+#define AT91_PWM_CMR_CPRE_MCK_BY_4     2  // Channel Prescale MCL / 4
+#define AT91_PWM_CMR_CPRE_MCK_BY_8     3  // Channel Prescale MCL / 8
+#define AT91_PWM_CMR_CPRE_MCK_BY_16    4  // Channel Prescale MCL / 16
+#define AT91_PWM_CMR_CPRE_MCK_BY_32    5  // Channel Prescale MCL / 32
+#define AT91_PWM_CMR_CPRE_MCK_BY_64    6  // Channel Prescale MCL / 64
+#define AT91_PWM_CMR_CPRE_MCK_BY_128   7  // Channel Prescale MCL / 128
+#define AT91_PWM_CMR_CPRE_MCK_BY_256   8  // Channel Prescale MCL / 256
+#define AT91_PWM_CMR_CPRE_MCK_BY_512   9  // Channel Prescale MCL / 512
+#define AT91_PWM_CMR_CPRE_MCK_BY_1024 10 // Channel Prescale MCL / 1024
+#define AT91_PWM_CMR_CPRE_MCK_A       11 // Channel MCLK A
+#define AT91_PWM_CMR_CPRE_MCK_B       12 // Channel MCLK B
+#define AT91_PWM_CMR_CALG_LEFT   (0 <<  8) // Left align period
+#define AT91_PWM_CMR_CALG_CENTER (1 <<  8) // Center align period
+#define AT91_PWM_CMR_CPOL_LOW    (0 <<  9) // Low to start with
+#define AT91_PWM_CMR_CPOL_HIGH   (1 <<  9) // High to start with
+#define AT91_PWM_CPD_DUTY        (0 << 10) // Notify the duty cycle
+#define AT91_PWM_CPD_PERIOD      (1 << 10) // Notify the period
+#define AT91_PWM_CDTY  (0x04) // Channel Duty Cycle
+#define AT91_PWM_CPRDR (0x08) // Channel Period
+#define AT91_PWM_CCNTR (0x0C) // Channel Counter
+#define AT91_PWM_CUPDR (0x10) // Channel Update
+
+#endif
 
 //=============================================================================
 // FIQ interrupt vector which is shared by all HAL varients.
 
 #define CYGNUM_HAL_INTERRUPT_FIQ 0
 
+//=============================================================================
 // Macros for access the GPIO lines and configuring peripheral pins
 
 // Given a pin description, determine which PIO controller it is on
--- a/packages/hal/arm/at91/var/current/src/timer_pit.c
+++ b/packages/hal/arm/at91/var/current/src/timer_pit.c
@@ -66,7 +66,7 @@ hal_clock_initialize(cyg_uint32 period)
   
   /* Set Period Interval timer and enable interrupt */
   HAL_WRITE_UINT32((AT91_PITC + AT91_PITC_PIMR), 
-                   period |  
+                   (period - 1) |  
                    AT91_PITC_PIMR_PITEN |
                    AT91_PITC_PIMR_PITIEN);
   
@@ -81,11 +81,11 @@ hal_clock_reset(cyg_uint32 vector, cyg_u
   cyg_uint32 reg;
   cyg_uint32 pimr;
   
-  CYG_ASSERT(period < 0xffffff, "Invalid HAL clock configuration");
+  CYG_ASSERT(period < AT91_PITC_VALUE_MASK, "Invalid HAL clock configuration");
   
   // Check that the PIT has the right period.
   HAL_READ_UINT32((AT91_PITC + AT91_PITC_PIMR), pimr);
-  if ((pimr & 0xffffff) != (period - 1)){
+  if ((pimr & AT91_PITC_VALUE_MASK) != (period - 1)) {
     HAL_WRITE_UINT32((AT91_PITC + AT91_PITC_PIMR), 
                      (period - 1) |  
                      AT91_PITC_PIMR_PITEN |
@@ -109,11 +109,11 @@ hal_clock_read(cyg_uint32 *pvalue)
   HAL_READ_UINT32((AT91_PITC + AT91_PITC_PIMR),pimr);
   if (!(pimr & AT91_PITC_PIMR_PITEN)) {
     HAL_WRITE_UINT32((AT91_PITC + AT91_PITC_PIMR), 
-                     0xffffff | AT91_PITC_PIMR_PITEN);
+                     AT91_PITC_VALUE_MASK | AT91_PITC_PIMR_PITEN);
   }
   
   HAL_READ_UINT32(AT91_PITC + AT91_PITC_PIIR, ir);
-  *pvalue = ir & 0xfffff;
+  *pvalue = ir & AT91_PITC_VALUE_MASK;
 }
 
 // -------------------------------------------------------------------------
@@ -135,7 +135,7 @@ void hal_delay_us(cyg_int32 usecs)
   
   // Calculate the wrap around period. 
   HAL_READ_UINT32(AT91_PITC + AT91_PITC_PIMR, piv);
-  piv = (piv & 0xffffff) - 1; 
+  piv = (piv & AT91_PITC_VALUE_MASK) - 1; 
   
   hal_clock_read(&val1);
   while (ticks > 0) {