SlideShare uma empresa Scribd logo
1 de 25
Baixar para ler offline
Introduction to
OMAP4 Pad Configuration

                    Jiahe Jou

                   2012/12/13
Revisions
   DATE      AUTHOUR              DESCRIPTION

2012/12/03   Jiahe Jou   Draft.
Outline
●   Overview

●   Pad Configuration

●   Off Mode Control

●   Wake Up Detection

●   Power Optimization

●   Configuration How To

●   Case Study - Talos7
Overview
●   Configure pads to desired values according to device configuration

●   Two sets of 32-bit pad configuration register

    ○   CORE power domain

    ○   WKUP power domain

●   Each register has two pads with five fields functional bits

    ○   MUXMODE (3 bits)

    ○   PULL (2 bits)

    ○   INPUT ENABLE (1 bits)

    ○   OFF MODE VALUE (5 bits)

    ○   WAKE UP (2 bits)
Overview
●   Pad configuration register


                        2
Pad Configuration
●   Mode selection

    ○   MUXMODE (3 bits), 0b000 ~ 0b111

    ○   Functional modes, 0b000 ~ 0b110
           MUXMODE                   Selected Mode

             0b000     Mode 0, primary mode

             0b001     Mode 1

             0b010     Mode 2

             0b011     Mode 3

             0b100     Mode 4

             0b101     Mode 5

             0b110     Mode 6

             0b111     Mode 7, safe mode
Pad Configuration
●   Examples
Pad Configuration
●   Pull selection

    ○    PULL (2 bits), 0b00 ~ 0b11

                        PULL
                                                    Behavior
            PULL TYPE       PULL ENABLE

                0b0              0b0        Pull Down, Not Activated

                0b0              0b1        Pull Down, Activated

                0b1              0b0        Pull Up, Not Activated

                0b1              0b1        Pull Up, Activated


●    Input enable

     ○    0, input disable, output mode

     ○    1, input enable, bidirectional mode
Pad Configuration
●   Off mode value

    ○   OFFMODEENABLE, off mode override control, 1 enable 0 disable

    ○   OFFMODEOUTENABLE, off mode output enable, 0 enable 1 disable

    ○   OFFMODEOUTVALUE, off mode output value

    ○   OFFMODEPULLUDENABLE, off mode pull up/down enable

    ○   OFFMODEPULLTYPESELECT, off mode pull type select

●   Wake Up

    ○   WAKEUPENABLE, wake up detect enable

    ○   WAKEUPEVENT, wake up event status
Pad Configuration
Off Mode Control
●   Off mode selected

    ○   PRM_DEVICE_OFF_CTRL[0] DEVICE_OFF_ENABLE

    ○   CONTROL_PADCONF_GLOBAL[31] FORCE_OFFMODE_ENABLE
Wake Up Dectection
●   Wake up enabled

    ○   PRM_IO_PMCTRL[16]GLOBAL_WUEN
Power Optimization
●   Pin types




●   Avoid unconnected or incorrectly pulled pins

    ○   For input, use pull up/down when possible

    ○   For output, avoid pull conflicts

    ○   For bi-direction, reconfigure the pin as an output driving 0
Power Optimization
Pad Configuration
●   Avoid unconnected pin (1)

    ○   If not driven externally, pull up/down is required

●   Avoid pull conflict (2)

    ○   Prevent different pulls on the same line

●   Avoid logic conflict (3)

    ○   if no external device drive the line, set the value as 0

    ○   else same value must
Pad Configuration
●   Recommended configuration for unconnected pads
Pad Configuration
●   Ball Characteristics
Configuration How To
●   Boot-loader
    struct pad_conf_entry {

           u16 offset;

           u16 val;

    };

●   Kernel
    /* omap_mux_init_gpio - initialize a signal based on the GPIO number */

    int omap_mux_init_gpio(int gpio, int val);



    /* omap_mux_init_signal - initialize a signal based on the signal name */

    int omap_mux_init_signal(const char *muxname, int val);
Configuration How To
●   Kernel
    /* Centralized control for pad init, suspend and shutdown */

    struct omap_pad_state_description {

          char                        *init_mux_name;

          u16                         init_config;

          char                        *suspend_mux_name;

          u16                         suspend_config;

          char                        *shutdown_mux_name;

          u16                         shutdown_config;

          u8                          flags;

    };
Case Study - Talos7


{GPMC_AD0, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},   /* sdmmc2_dat0: eMMC_AD0 */

{GPMC_AD1, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},   /* sdmmc2_dat1: eMMC_AD1 */

{GPMC_AD2, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},   /* sdmmc2_dat2: eMMC_AD2 */

{GPMC_AD3, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},   /* sdmmc2_dat3: eMMC_AD3 */

{GPMC_AD4, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},   /* sdmmc2_dat4: eMMC_AD4 */

{GPMC_AD5, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},   /* sdmmc2_dat5: eMMC_AD5 */

{GPMC_AD6, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},   /* sdmmc2_dat6: eMMC_AD6 */

{GPMC_AD7, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)},   /* sdmmc2_dat7: eMMC_AD7 */
Case Study - Talos7



{SDMMC1_DAT4, (PTD | IDIS | M7)},   /* sdmmc1_dat4: NC: SafeMode */

{SDMMC1_DAT5, (PTD | IDIS | M7)},   /* sdmmc1_dat5: NC: SafeMode */

{SDMMC1_DAT6, (PTD | IDIS | M7)},   /* sdmmc1_dat6: NC: SafeMode */

{SDMMC1_DAT7, (PTD | IDIS | M7)},   /* sdmmc1_dat7: NC: SafeMode */
Case Study - Talos7
omap_mux_init_gpio(GPIO_WIFI_IRQ, OMAP_PIN_INPUT | OMAP_PIN_OFF_WAKEUPENABLE);

omap_mux_init_gpio(GPIO_WIFI_PMENA, OMAP_PIN_OUTPUT);



omap_mux_init_signal("sdmmc5_cmd", OMAP_PIN_INPUT_PULLUP);

omap_mux_init_signal("sdmmc5_clk", OMAP_PIN_INPUT_PULLUP);

omap_mux_init_signal("sdmmc5_dat0", OMAP_PIN_INPUT_PULLUP);

omap_mux_init_signal("sdmmc5_dat1", OMAP_PIN_INPUT_PULLUP);

omap_mux_init_signal("sdmmc5_dat2", OMAP_PIN_INPUT_PULLUP);

omap_mux_init_signal("sdmmc5_dat3", OMAP_PIN_INPUT_PULLUP);
Case Study - Talos7
static struct omap_pad_state_description talos_dynamic_pads[] __initdata = {

...

      /*sdmmc2_clk */

      {

             .init_mux_name      = "gpmc_noe.sdmmc2_clk",

             .init_config   = OMAP_PIN_INPUT_PULLUP,

      },

      /*sdmmc2_cmd */

      {

             .init_mux_name      = "gpmc_nwe.sdmmc2_cmd",

             .init_config   = OMAP_PIN_INPUT_PULLUP,

      }

...

}
Q&A
The End

Mais conteúdo relacionado

Semelhante a OMAP4 Pad Configuration: Configure Pins for Desired Functions

Get Programmable digital timer | Programmable timer switch | Cyclic Timer- GI...
Get Programmable digital timer | Programmable timer switch | Cyclic Timer- GI...Get Programmable digital timer | Programmable timer switch | Cyclic Timer- GI...
Get Programmable digital timer | Programmable timer switch | Cyclic Timer- GI...PrasadPurohit1988
 
Part-1 : Mastering microcontroller with embedded driver development
Part-1 : Mastering microcontroller with embedded driver development Part-1 : Mastering microcontroller with embedded driver development
Part-1 : Mastering microcontroller with embedded driver development FastBit Embedded Brain Academy
 
MicrocontrollersII (1).pptx
MicrocontrollersII (1).pptxMicrocontrollersII (1).pptx
MicrocontrollersII (1).pptxnodov66591
 
Changable tundra electronics customize parameters
Changable tundra electronics customize parameters Changable tundra electronics customize parameters
Changable tundra electronics customize parameters buyobdii
 
Tac404 electronic control_family_specifications
Tac404 electronic control_family_specificationsTac404 electronic control_family_specifications
Tac404 electronic control_family_specificationsJosedgeo
 
Twin wheeler modified for arduino simplified serial protocol to sabertooth v22
Twin wheeler modified for arduino simplified serial protocol to sabertooth v22Twin wheeler modified for arduino simplified serial protocol to sabertooth v22
Twin wheeler modified for arduino simplified serial protocol to sabertooth v22josnihmurni2907
 
Hgm190 v1.4 en
Hgm190 v1.4 enHgm190 v1.4 en
Hgm190 v1.4 enPhamVinh36
 
Digital Weighing Transmitter with RS232/485 and analogue output
Digital Weighing Transmitter with RS232/485 and analogue outputDigital Weighing Transmitter with RS232/485 and analogue output
Digital Weighing Transmitter with RS232/485 and analogue outputGeneral Measure
 
Cataloge ge 3.control and_automation_dienhathe.com-4_20_vat300_e_c6-6-4_1_rev_b
Cataloge ge 3.control and_automation_dienhathe.com-4_20_vat300_e_c6-6-4_1_rev_bCataloge ge 3.control and_automation_dienhathe.com-4_20_vat300_e_c6-6-4_1_rev_b
Cataloge ge 3.control and_automation_dienhathe.com-4_20_vat300_e_c6-6-4_1_rev_bDien Ha The
 
Cataloge ge 3.control and_automation-20_vat300_e_c6-6-4_1_rev_b
Cataloge ge 3.control and_automation-20_vat300_e_c6-6-4_1_rev_bCataloge ge 3.control and_automation-20_vat300_e_c6-6-4_1_rev_b
Cataloge ge 3.control and_automation-20_vat300_e_c6-6-4_1_rev_bDien Ha The
 
2003 presentation24
2003 presentation242003 presentation24
2003 presentation24Sarth Lodhi
 
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...Dien Ha The
 
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...Dien Ha The
 
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual d...
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual d...Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual d...
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual d...Dien Ha The
 

Semelhante a OMAP4 Pad Configuration: Configure Pins for Desired Functions (20)

Get Programmable digital timer | Programmable timer switch | Cyclic Timer- GI...
Get Programmable digital timer | Programmable timer switch | Cyclic Timer- GI...Get Programmable digital timer | Programmable timer switch | Cyclic Timer- GI...
Get Programmable digital timer | Programmable timer switch | Cyclic Timer- GI...
 
Part-1 : Mastering microcontroller with embedded driver development
Part-1 : Mastering microcontroller with embedded driver development Part-1 : Mastering microcontroller with embedded driver development
Part-1 : Mastering microcontroller with embedded driver development
 
MicrocontrollersII (1).pptx
MicrocontrollersII (1).pptxMicrocontrollersII (1).pptx
MicrocontrollersII (1).pptx
 
PPT+.pdf
PPT+.pdfPPT+.pdf
PPT+.pdf
 
Industrial Automation Using B&R PLC.
Industrial Automation Using B&R PLC.Industrial Automation Using B&R PLC.
Industrial Automation Using B&R PLC.
 
Changable tundra electronics customize parameters
Changable tundra electronics customize parameters Changable tundra electronics customize parameters
Changable tundra electronics customize parameters
 
Tac404 electronic control_family_specifications
Tac404 electronic control_family_specificationsTac404 electronic control_family_specifications
Tac404 electronic control_family_specifications
 
Twin wheeler modified for arduino simplified serial protocol to sabertooth v22
Twin wheeler modified for arduino simplified serial protocol to sabertooth v22Twin wheeler modified for arduino simplified serial protocol to sabertooth v22
Twin wheeler modified for arduino simplified serial protocol to sabertooth v22
 
Manual-de-Usuario.pdf
Manual-de-Usuario.pdfManual-de-Usuario.pdf
Manual-de-Usuario.pdf
 
Hgm190 v1.4 en
Hgm190 v1.4 enHgm190 v1.4 en
Hgm190 v1.4 en
 
8051 MC.pptx
8051 MC.pptx8051 MC.pptx
8051 MC.pptx
 
Digital Weighing Transmitter with RS232/485 and analogue output
Digital Weighing Transmitter with RS232/485 and analogue outputDigital Weighing Transmitter with RS232/485 and analogue output
Digital Weighing Transmitter with RS232/485 and analogue output
 
Cataloge ge 3.control and_automation_dienhathe.com-4_20_vat300_e_c6-6-4_1_rev_b
Cataloge ge 3.control and_automation_dienhathe.com-4_20_vat300_e_c6-6-4_1_rev_bCataloge ge 3.control and_automation_dienhathe.com-4_20_vat300_e_c6-6-4_1_rev_b
Cataloge ge 3.control and_automation_dienhathe.com-4_20_vat300_e_c6-6-4_1_rev_b
 
Cataloge ge 3.control and_automation-20_vat300_e_c6-6-4_1_rev_b
Cataloge ge 3.control and_automation-20_vat300_e_c6-6-4_1_rev_bCataloge ge 3.control and_automation-20_vat300_e_c6-6-4_1_rev_b
Cataloge ge 3.control and_automation-20_vat300_e_c6-6-4_1_rev_b
 
VERILOG CODE
VERILOG CODEVERILOG CODE
VERILOG CODE
 
2003 presentation24
2003 presentation242003 presentation24
2003 presentation24
 
Lampiran 1.programdocx
Lampiran 1.programdocxLampiran 1.programdocx
Lampiran 1.programdocx
 
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...
 
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual-1...
 
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual d...
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual d...Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual d...
Mitsubishi inverter catalog-fr-d700-safety-stop-function-instruction-manual d...
 

Mais de Johnson Chou

Introduction of unit test on android kernel
Introduction of unit test on android kernelIntroduction of unit test on android kernel
Introduction of unit test on android kernelJohnson Chou
 
Introduction of omap4 booting sequence
Introduction of omap4 booting sequence Introduction of omap4 booting sequence
Introduction of omap4 booting sequence Johnson Chou
 
Integrate gitolite with mantis
Integrate gitolite with mantisIntegrate gitolite with mantis
Integrate gitolite with mantisJohnson Chou
 
Introduction to Android G-sensor
Introduction to Android G-sensorIntroduction to Android G-sensor
Introduction to Android G-sensorJohnson Chou
 
Algorithm Final Presentation
Algorithm Final PresentationAlgorithm Final Presentation
Algorithm Final PresentationJohnson Chou
 

Mais de Johnson Chou (6)

JavaScript OOPs
JavaScript OOPsJavaScript OOPs
JavaScript OOPs
 
Introduction of unit test on android kernel
Introduction of unit test on android kernelIntroduction of unit test on android kernel
Introduction of unit test on android kernel
 
Introduction of omap4 booting sequence
Introduction of omap4 booting sequence Introduction of omap4 booting sequence
Introduction of omap4 booting sequence
 
Integrate gitolite with mantis
Integrate gitolite with mantisIntegrate gitolite with mantis
Integrate gitolite with mantis
 
Introduction to Android G-sensor
Introduction to Android G-sensorIntroduction to Android G-sensor
Introduction to Android G-sensor
 
Algorithm Final Presentation
Algorithm Final PresentationAlgorithm Final Presentation
Algorithm Final Presentation
 

OMAP4 Pad Configuration: Configure Pins for Desired Functions

  • 1. Introduction to OMAP4 Pad Configuration Jiahe Jou 2012/12/13
  • 2. Revisions DATE AUTHOUR DESCRIPTION 2012/12/03 Jiahe Jou Draft.
  • 3. Outline ● Overview ● Pad Configuration ● Off Mode Control ● Wake Up Detection ● Power Optimization ● Configuration How To ● Case Study - Talos7
  • 4. Overview ● Configure pads to desired values according to device configuration ● Two sets of 32-bit pad configuration register ○ CORE power domain ○ WKUP power domain ● Each register has two pads with five fields functional bits ○ MUXMODE (3 bits) ○ PULL (2 bits) ○ INPUT ENABLE (1 bits) ○ OFF MODE VALUE (5 bits) ○ WAKE UP (2 bits)
  • 5. Overview ● Pad configuration register 2
  • 6. Pad Configuration ● Mode selection ○ MUXMODE (3 bits), 0b000 ~ 0b111 ○ Functional modes, 0b000 ~ 0b110 MUXMODE Selected Mode 0b000 Mode 0, primary mode 0b001 Mode 1 0b010 Mode 2 0b011 Mode 3 0b100 Mode 4 0b101 Mode 5 0b110 Mode 6 0b111 Mode 7, safe mode
  • 8. Pad Configuration ● Pull selection ○ PULL (2 bits), 0b00 ~ 0b11 PULL Behavior PULL TYPE PULL ENABLE 0b0 0b0 Pull Down, Not Activated 0b0 0b1 Pull Down, Activated 0b1 0b0 Pull Up, Not Activated 0b1 0b1 Pull Up, Activated ● Input enable ○ 0, input disable, output mode ○ 1, input enable, bidirectional mode
  • 9. Pad Configuration ● Off mode value ○ OFFMODEENABLE, off mode override control, 1 enable 0 disable ○ OFFMODEOUTENABLE, off mode output enable, 0 enable 1 disable ○ OFFMODEOUTVALUE, off mode output value ○ OFFMODEPULLUDENABLE, off mode pull up/down enable ○ OFFMODEPULLTYPESELECT, off mode pull type select ● Wake Up ○ WAKEUPENABLE, wake up detect enable ○ WAKEUPEVENT, wake up event status
  • 11. Off Mode Control ● Off mode selected ○ PRM_DEVICE_OFF_CTRL[0] DEVICE_OFF_ENABLE ○ CONTROL_PADCONF_GLOBAL[31] FORCE_OFFMODE_ENABLE
  • 12. Wake Up Dectection ● Wake up enabled ○ PRM_IO_PMCTRL[16]GLOBAL_WUEN
  • 13. Power Optimization ● Pin types ● Avoid unconnected or incorrectly pulled pins ○ For input, use pull up/down when possible ○ For output, avoid pull conflicts ○ For bi-direction, reconfigure the pin as an output driving 0
  • 15. Pad Configuration ● Avoid unconnected pin (1) ○ If not driven externally, pull up/down is required ● Avoid pull conflict (2) ○ Prevent different pulls on the same line ● Avoid logic conflict (3) ○ if no external device drive the line, set the value as 0 ○ else same value must
  • 16. Pad Configuration ● Recommended configuration for unconnected pads
  • 17. Pad Configuration ● Ball Characteristics
  • 18. Configuration How To ● Boot-loader struct pad_conf_entry { u16 offset; u16 val; }; ● Kernel /* omap_mux_init_gpio - initialize a signal based on the GPIO number */ int omap_mux_init_gpio(int gpio, int val); /* omap_mux_init_signal - initialize a signal based on the signal name */ int omap_mux_init_signal(const char *muxname, int val);
  • 19. Configuration How To ● Kernel /* Centralized control for pad init, suspend and shutdown */ struct omap_pad_state_description { char *init_mux_name; u16 init_config; char *suspend_mux_name; u16 suspend_config; char *shutdown_mux_name; u16 shutdown_config; u8 flags; };
  • 20. Case Study - Talos7 {GPMC_AD0, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat0: eMMC_AD0 */ {GPMC_AD1, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat1: eMMC_AD1 */ {GPMC_AD2, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat2: eMMC_AD2 */ {GPMC_AD3, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat3: eMMC_AD3 */ {GPMC_AD4, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat4: eMMC_AD4 */ {GPMC_AD5, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat5: eMMC_AD5 */ {GPMC_AD6, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat6: eMMC_AD6 */ {GPMC_AD7, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat7: eMMC_AD7 */
  • 21. Case Study - Talos7 {SDMMC1_DAT4, (PTD | IDIS | M7)}, /* sdmmc1_dat4: NC: SafeMode */ {SDMMC1_DAT5, (PTD | IDIS | M7)}, /* sdmmc1_dat5: NC: SafeMode */ {SDMMC1_DAT6, (PTD | IDIS | M7)}, /* sdmmc1_dat6: NC: SafeMode */ {SDMMC1_DAT7, (PTD | IDIS | M7)}, /* sdmmc1_dat7: NC: SafeMode */
  • 22. Case Study - Talos7 omap_mux_init_gpio(GPIO_WIFI_IRQ, OMAP_PIN_INPUT | OMAP_PIN_OFF_WAKEUPENABLE); omap_mux_init_gpio(GPIO_WIFI_PMENA, OMAP_PIN_OUTPUT); omap_mux_init_signal("sdmmc5_cmd", OMAP_PIN_INPUT_PULLUP); omap_mux_init_signal("sdmmc5_clk", OMAP_PIN_INPUT_PULLUP); omap_mux_init_signal("sdmmc5_dat0", OMAP_PIN_INPUT_PULLUP); omap_mux_init_signal("sdmmc5_dat1", OMAP_PIN_INPUT_PULLUP); omap_mux_init_signal("sdmmc5_dat2", OMAP_PIN_INPUT_PULLUP); omap_mux_init_signal("sdmmc5_dat3", OMAP_PIN_INPUT_PULLUP);
  • 23. Case Study - Talos7 static struct omap_pad_state_description talos_dynamic_pads[] __initdata = { ... /*sdmmc2_clk */ { .init_mux_name = "gpmc_noe.sdmmc2_clk", .init_config = OMAP_PIN_INPUT_PULLUP, }, /*sdmmc2_cmd */ { .init_mux_name = "gpmc_nwe.sdmmc2_cmd", .init_config = OMAP_PIN_INPUT_PULLUP, } ... }
  • 24. Q&A