diff --git a/armsrc/appmain.c b/armsrc/appmain.c
index 88ce070..cbeb7d2 100644
--- a/armsrc/appmain.c
+++ b/armsrc/appmain.c
@@ -921,6 +921,70 @@ static void PacketReceived(PacketCommandNG *packet) {
             reply_ng(CMD_SET_TEAROFF, PM3_SUCCESS, NULL, 0);
             break;
         }
+        case CMD_LED_CONTROL: {
+            payload_led_control_t *led_data = (payload_led_control_t *)packet->data.asBytes;
+
+            if (led_data->action == 0) {
+                // Turn off
+                if (led_data->led & LED_A) {
+                    led_pwm_disable(LED_A);
+                    LED_A_OFF();
+                }
+                if (led_data->led & LED_B) {
+                    led_pwm_disable(LED_B);
+                    LED_B_OFF();
+                }
+                if (led_data->led & LED_C) LED_C_OFF();
+                if (led_data->led & LED_D) LED_D_OFF();
+
+            } else if (led_data->action == 1) {
+                // Turn on
+                if (led_data->led & LED_A) {
+                    led_pwm_disable(LED_A);
+                    LED_A_ON();
+                }
+                if (led_data->led & LED_B) {
+                    led_pwm_disable(LED_B);
+                    LED_B_ON();
+                }
+                if (led_data->led & LED_C) LED_C_ON();
+                if (led_data->led & LED_D) LED_D_ON();
+
+            } else if (led_data->action == 2) {
+                // Toggle
+                if (led_data->led & LED_A) {
+                    led_pwm_disable(LED_A);
+                    LED_A_INV();
+                }
+                if (led_data->led & LED_B) {
+                    led_pwm_disable(LED_B);
+                    LED_B_INV();
+                }
+                if (led_data->led & LED_C) LED_C_INV();
+                if (led_data->led & LED_D) LED_D_INV();
+
+            } else if (led_data->action == 3) {
+                // PWM brightness control
+                if ((led_data->led & LED_A) && !(led_data->led & ~LED_A)) {
+                    // Only LED_A selected
+                    led_set_pwm_brightness(LED_A, led_data->brightness);
+                } else if ((led_data->led & LED_B) && !(led_data->led & ~LED_B)) {
+                    // Only LED_B selected
+                    led_set_pwm_brightness(LED_B, led_data->brightness);
+                } else if ((led_data->led & LED_A) && (led_data->led & LED_B) && !(led_data->led & ~(LED_A | LED_B))) {
+                    // Both LED_A and LED_B selected
+                    led_set_pwm_brightness(LED_A, led_data->brightness);
+                    led_set_pwm_brightness(LED_B, led_data->brightness);
+                } else {
+                    // PWM only supported for LED_A and LED_B
+                    reply_ng(CMD_LED_CONTROL, PM3_EINVARG, NULL, 0);
+                    break;
+                }
+            }
+
+            reply_ng(CMD_LED_CONTROL, PM3_SUCCESS, NULL, 0);
+            break;
+        }
         // always available
         case CMD_HF_DROPFIELD: {
             hf_field_off();
diff --git a/armsrc/util.c b/armsrc/util.c
index 0df8935..6d8246f 100644
--- a/armsrc/util.c
+++ b/armsrc/util.c
@@ -251,17 +251,17 @@ int BUTTON_CLICKED(int ms) {
         return BUTTON_NO_CLICK;
 
     // Borrow a PWM unit for my real-time clock
-    AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0);
+    AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(1);
     // 48 MHz / 1024 gives 46.875 kHz
-    AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);
-    AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0;
-    AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff;
+    AT91C_BASE_PWMC_CH1->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);
+    AT91C_BASE_PWMC_CH1->PWMC_CDTYR = 0;
+    AT91C_BASE_PWMC_CH1->PWMC_CPRDR = 0xffff;
 
-    uint16_t start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
+    uint16_t start = AT91C_BASE_PWMC_CH1->PWMC_CCNTR;
 
     int letoff = 0;
     for (;;) {
-        uint16_t now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
+        uint16_t now = AT91C_BASE_PWMC_CH1->PWMC_CCNTR;
 
         // We haven't let off the button yet
         if (!letoff) {
@@ -270,7 +270,7 @@ int BUTTON_CLICKED(int ms) {
                 letoff = 1;
 
                 // reset our timer for 500ms
-                start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
+                start = AT91C_BASE_PWMC_CH1->PWMC_CCNTR;
                 ticks = ((MCK / 1000) * (500)) >> 10;
             }
 
@@ -316,16 +316,16 @@ int BUTTON_HELD(int ms) {
     }
 
     // Borrow a PWM unit for my real-time clock
-    AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0);
+    AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(1);
     // 48 MHz / 1024 gives 46.875 kHz
-    AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);
-    AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0;
-    AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff;
+    AT91C_BASE_PWMC_CH1->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);
+    AT91C_BASE_PWMC_CH1->PWMC_CDTYR = 0;
+    AT91C_BASE_PWMC_CH1->PWMC_CPRDR = 0xffff;
 
-    uint16_t start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
+    uint16_t start = AT91C_BASE_PWMC_CH1->PWMC_CCNTR;
 
     for (;;) {
-        uint16_t now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
+        uint16_t now = AT91C_BASE_PWMC_CH1->PWMC_CCNTR;
 
         // As soon as our button let go, we didn't hold long enough
         if (BUTTON_PRESS() == false) {
@@ -415,3 +415,90 @@ void convertToHexArray(uint32_t num, uint8_t *partialkey) {
         partialkey[i] = (uint8_t)strtoul(group, NULL, 2);
     }
 }
+
+// PWM LED brightness control
+#define LED_PWM_PERIOD 1000  // 48kHz PWM frequency (48MHz / 1000)
+
+static bool pwm0_initialized = false;
+static bool pwm2_initialized = false;
+
+void led_set_pwm_brightness(uint8_t led, uint8_t brightness) {
+    // brightness: 0-100
+    if (brightness > 100) {
+        brightness = 100;
+    }
+
+    // Convert 0-100 to 0-1000 duty cycle
+    uint16_t duty = (brightness * LED_PWM_PERIOD) / 100;
+
+    // Inverted duty cycle for active-low LEDs
+    uint16_t inverted_duty = LED_PWM_PERIOD - duty;
+
+    if (led == LED_A) {
+        // LED_A uses PWM Channel 0
+        if (!pwm0_initialized) {
+            // Enable PWM clock
+            AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PWMC);
+
+            // Configure PA0 as PWM0 peripheral function
+            AT91C_BASE_PIOA->PIO_PDR = GPIO_LED_A;   // Disable GPIO control
+            AT91C_BASE_PIOA->PIO_ASR = GPIO_LED_A;   // Select peripheral A (PWM)
+
+            // Configure PWM Channel 0
+            AT91C_BASE_PWMC_CH0->PWMC_CMR = AT91C_PWMC_CPRE_MCK;  // Clock = MCK
+            AT91C_BASE_PWMC_CH0->PWMC_CPRDR = LED_PWM_PERIOD;     // Period
+
+            // Enable PWM Channel 0
+            AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0);
+
+            pwm0_initialized = true;
+        }
+
+        // Update duty cycle
+        AT91C_BASE_PWMC_CH0->PWMC_CUPDR = inverted_duty;
+
+    } else if (led == LED_B) {
+        // LED_B uses PWM Channel 2
+        if (!pwm2_initialized) {
+            // Enable PWM clock
+            AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PWMC);
+
+            // Configure PA2 as PWM2 peripheral function
+            AT91C_BASE_PIOA->PIO_PDR = GPIO_LED_B;   // Disable GPIO control
+            AT91C_BASE_PIOA->PIO_ASR = GPIO_LED_B;   // Select peripheral A (PWM)
+
+            // Configure PWM Channel 2
+            AT91C_BASE_PWMC_CH2->PWMC_CMR = AT91C_PWMC_CPRE_MCK;  // Clock = MCK
+            AT91C_BASE_PWMC_CH2->PWMC_CPRDR = LED_PWM_PERIOD;     // Period
+
+            // Enable PWM Channel 2
+            AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(2);
+
+            pwm2_initialized = true;
+        }
+
+        // Update duty cycle
+        AT91C_BASE_PWMC_CH2->PWMC_CUPDR = inverted_duty;
+    }
+}
+
+void led_pwm_disable(uint8_t led) {
+    if (led == LED_A && pwm0_initialized) {
+        // Disable PWM Channel 0
+        AT91C_BASE_PWMC->PWMC_DIS = PWM_CHANNEL(0);
+
+        // Return PA0 to GPIO control
+        AT91C_BASE_PIOA->PIO_PER = GPIO_LED_A;
+
+        pwm0_initialized = false;
+
+    } else if (led == LED_B && pwm2_initialized) {
+        // Disable PWM Channel 2
+        AT91C_BASE_PWMC->PWMC_DIS = PWM_CHANNEL(2);
+
+        // Return PA2 to GPIO control
+        AT91C_BASE_PIOA->PIO_PER = GPIO_LED_B;
+
+        pwm2_initialized = false;
+    }
+}
diff --git a/armsrc/util.h b/armsrc/util.h
index fd99ac7..d558dda 100644
--- a/armsrc/util.h
+++ b/armsrc/util.h
@@ -105,4 +105,7 @@ bool data_available_fast(void);
 uint32_t flash_size_from_cidr(uint32_t cidr);
 uint32_t get_flash_size(void);
 
+void led_set_pwm_brightness(uint8_t led, uint8_t brightness);
+void led_pwm_disable(uint8_t led);
+
 #endif
diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c
index 9bbdc98..ad877b0 100644
--- a/client/src/cmdhw.c
+++ b/client/src/cmdhw.c
@@ -1504,6 +1504,115 @@ int set_fpga_mode(uint8_t mode) {
     return resp.status;
 }
 
+static int CmdLed(const char *Cmd) {
+    CLIParserContext *ctx;
+    CLIParserInit(&ctx, "hw led",
+                  "Control Proxmark3 LEDs with optional PWM brightness for LED A and B",
+                  "hw led --led a --on                     --> Turn on LED A\n"
+                  "hw led --led b --off                    --> Turn off LED B\n"
+                  "hw led --led a,b --toggle               --> Toggle LEDs A and B\n"
+                  "hw led --led a --brightness 50          --> Set LED A to 50%% brightness (PWM)\n"
+                  "hw led --led b --brightness 75          --> Set LED B to 75%% brightness (PWM)\n"
+                  "hw led --led a,b --brightness 30        --> Set both LEDs A and B to 30%% brightness");
+
+    void *argtable[] = {
+        arg_param_begin,
+        arg_str1(NULL, "led", "<a|b|c|d|all>", "LED selection (comma separated)"),
+        arg_lit0(NULL, "on", "Turn LED on"),
+        arg_lit0(NULL, "off", "Turn LED off"),
+        arg_lit0(NULL, "toggle", "Toggle LED"),
+        arg_int0(NULL, "brightness", "<0-100>", "LED brightness percentage (PWM, LED A and B only)"),
+        arg_param_end
+    };
+    CLIExecWithReturn(ctx, Cmd, argtable, false);
+
+    int led_len = 63;
+    char led_str[64] = {0};
+    CLIGetStrWithReturn(ctx, 1, (uint8_t *)led_str, &led_len);
+    bool on = arg_get_lit(ctx, 2);
+    bool off = arg_get_lit(ctx, 3);
+    bool toggle = arg_get_lit(ctx, 4);
+    int brightness = arg_get_int_def(ctx, 5, -1);
+    CLIParserFree(ctx);
+
+    // Validate only one action
+    if ((on + off + toggle + (brightness >= 0)) != 1) {
+        PrintAndLogEx(ERR, "Specify exactly one action: --on, --off, --toggle, or --brightness");
+        return PM3_EINVARG;
+    }
+
+    // Parse LED selection
+    uint8_t led_mask = 0;
+    char *token = strtok(led_str, ",");
+    while (token != NULL) {
+        if (strcmp(token, "a") == 0 || strcmp(token, "A") == 0) {
+            led_mask |= 1;  // LED_A
+        } else if (strcmp(token, "b") == 0 || strcmp(token, "B") == 0) {
+            led_mask |= 2;  // LED_B
+        } else if (strcmp(token, "c") == 0 || strcmp(token, "C") == 0) {
+            led_mask |= 4;  // LED_C
+        } else if (strcmp(token, "d") == 0 || strcmp(token, "D") == 0) {
+            led_mask |= 8;  // LED_D
+        } else if (strcmp(token, "all") == 0 || strcmp(token, "ALL") == 0) {
+            led_mask = 15;  // All LEDs
+        } else {
+            PrintAndLogEx(ERR, "Invalid LED: %s (use a, b, c, d, or all)", token);
+            return PM3_EINVARG;
+        }
+        token = strtok(NULL, ",");
+    }
+
+    if (led_mask == 0) {
+        PrintAndLogEx(ERR, "No LEDs selected");
+        return PM3_EINVARG;
+    }
+
+    // Validate brightness
+    if (brightness >= 0) {
+        if (brightness > 100) {
+            PrintAndLogEx(ERR, "Brightness must be 0-100");
+            return PM3_EINVARG;
+        }
+        // Check if only LED_A and/or LED_B selected for PWM
+        if (led_mask & ~0x03) {  // If any bit other than LED_A or LED_B is set
+            PrintAndLogEx(ERR, "PWM brightness only supported for LED A and B");
+            return PM3_EINVARG;
+        }
+    }
+
+    // Build payload
+    struct {
+        uint8_t led;
+        uint8_t action;
+        uint8_t brightness;
+    } PACKED payload;
+
+    payload.led = led_mask;
+    if (on) {
+        payload.action = 1;
+    } else if (off) {
+        payload.action = 0;
+    } else if (toggle) {
+        payload.action = 2;
+    } else {
+        payload.action = 3;  // PWM
+    }
+    payload.brightness = (brightness >= 0) ? brightness : 0;
+
+    clearCommandBuffer();
+    SendCommandNG(CMD_LED_CONTROL, (uint8_t *)&payload, sizeof(payload));
+    PacketResponseNG resp;
+    if (WaitForResponseTimeout(CMD_LED_CONTROL, &resp, 1000) == false) {
+        PrintAndLogEx(WARNING, "command execution time out");
+        return PM3_ETIMEOUT;
+    }
+    if (resp.status != PM3_SUCCESS) {
+        PrintAndLogEx(ERR, "LED control command failed");
+        return resp.status;
+    }
+    return PM3_SUCCESS;
+}
+
 static command_t CommandTable[] = {
     {"help",          CmdHelp,         AlwaysAvailable,  "This help"},
     {"-------------", CmdHelp,         AlwaysAvailable,  "----------------------- " _CYAN_("Operation") " -----------------------"},
@@ -1518,6 +1627,7 @@ static command_t CommandTable[] = {
     {"connect",       CmdConnect,      AlwaysAvailable,  "Connect to the device via serial port"},
     {"dbg",           CmdDbg,          IfPm3Present,     "Set device side debug level"},
     {"fpgaoff",       CmdFPGAOff,      IfPm3Present,     "Turn off FPGA on device"},
+    {"led",           CmdLed,          IfPm3Present,     "Control LEDs with optional PWM brightness"},
     {"lcd",           CmdLCD,          IfPm3Lcd,         "Send command/data to LCD"},
     {"lcdreset",      CmdLCDReset,     IfPm3Lcd,         "Hardware reset LCD"},
     {"ping",          CmdPing,         IfPm3Present,     "Test if the Proxmark3 is responsive"},
diff --git a/common_arm/ticks.c b/common_arm/ticks.c
index 73182a1..1655241 100644
--- a/common_arm/ticks.c
+++ b/common_arm/ticks.c
@@ -32,19 +32,19 @@ void SpinDelayUsPrecision(int us) {
     int ticks = ((MCK / 1000000) * us + 16) >> 5;
 
     // Borrow a PWM unit for my real-time clock
-    AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0);
+    AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(1);
 
     // 48 MHz / 32 gives 1.5 Mhz
-    AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(5);      // Channel Mode Register
-    AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0;                           // Channel Duty Cycle Register
-    AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xFFFF;                      // Channel Period Register
+    AT91C_BASE_PWMC_CH1->PWMC_CMR = PWM_CH_MODE_PRESCALER(5);      // Channel Mode Register
+    AT91C_BASE_PWMC_CH1->PWMC_CDTYR = 0;                           // Channel Duty Cycle Register
+    AT91C_BASE_PWMC_CH1->PWMC_CPRDR = 0xFFFF;                      // Channel Period Register
 
-    uint16_t end = AT91C_BASE_PWMC_CH0->PWMC_CCNTR + ticks;
-    if (end == 0) // AT91C_BASE_PWMC_CH0->PWMC_CCNTR is never == 0
+    uint16_t end = AT91C_BASE_PWMC_CH1->PWMC_CCNTR + ticks;
+    if (end == 0) // AT91C_BASE_PWMC_CH1->PWMC_CCNTR is never == 0
         end++;    // so we have to end++ to avoid inivity loop
 
     for (;;) {
-        uint16_t now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
+        uint16_t now = AT91C_BASE_PWMC_CH1->PWMC_CCNTR;
 
         if (now == end)
             return;
@@ -59,19 +59,19 @@ void SpinDelayUs(int us) {
     int ticks = ((MCK / 1000000) * us + 512) >> 10;
 
     // Borrow a PWM unit for my real-time clock
-    AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0);
+    AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(1);
 
     // 48 MHz / 1024 gives 46.875 kHz
-    AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);      // Channel Mode Register
-    AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0;                            // Channel Duty Cycle Register
-    AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff;                       // Channel Period Register
+    AT91C_BASE_PWMC_CH1->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);      // Channel Mode Register
+    AT91C_BASE_PWMC_CH1->PWMC_CDTYR = 0;                            // Channel Duty Cycle Register
+    AT91C_BASE_PWMC_CH1->PWMC_CPRDR = 0xffff;                       // Channel Period Register
 
-    uint16_t end = AT91C_BASE_PWMC_CH0->PWMC_CCNTR + ticks;
-    if (end == 0) // AT91C_BASE_PWMC_CH0->PWMC_CCNTR is never == 0
+    uint16_t end = AT91C_BASE_PWMC_CH1->PWMC_CCNTR + ticks;
+    if (end == 0) // AT91C_BASE_PWMC_CH1->PWMC_CCNTR is never == 0
         end++;    // so we have to end++ to avoid inivity loop
 
     for (;;) {
-        uint16_t now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
+        uint16_t now = AT91C_BASE_PWMC_CH1->PWMC_CCNTR;
 
         if (now == end)
             return;
diff --git a/common_arm/usb_cdc.c b/common_arm/usb_cdc.c
index ce7bda3..776b00f 100644
--- a/common_arm/usb_cdc.c
+++ b/common_arm/usb_cdc.c
@@ -487,17 +487,17 @@ static void SpinDelayUs(int us) {
     int ticks = ((MCK / 1000000) * us + 512) >> 10;
 
     // Borrow a PWM unit for my real-time clock
-    AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(0);
+    AT91C_BASE_PWMC->PWMC_ENA = PWM_CHANNEL(1);
 
     // 48 MHz / 1024 gives 46.875 kHz
-    AT91C_BASE_PWMC_CH0->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);      // Channel Mode Register
-    AT91C_BASE_PWMC_CH0->PWMC_CDTYR = 0;                            // Channel Duty Cycle Register
-    AT91C_BASE_PWMC_CH0->PWMC_CPRDR = 0xffff;                       // Channel Period Register
+    AT91C_BASE_PWMC_CH1->PWMC_CMR = PWM_CH_MODE_PRESCALER(10);      // Channel Mode Register
+    AT91C_BASE_PWMC_CH1->PWMC_CDTYR = 0;                            // Channel Duty Cycle Register
+    AT91C_BASE_PWMC_CH1->PWMC_CPRDR = 0xffff;                       // Channel Period Register
 
-    uint16_t start = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
+    uint16_t start = AT91C_BASE_PWMC_CH1->PWMC_CCNTR;
 
     for (;;) {
-        uint16_t now = AT91C_BASE_PWMC_CH0->PWMC_CCNTR;
+        uint16_t now = AT91C_BASE_PWMC_CH1->PWMC_CCNTR;
         if (now == (uint16_t)(start + ticks))
             return;
 
diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h
index 860dfa9..e1551b5 100644
--- a/include/pm3_cmd.h
+++ b/include/pm3_cmd.h
@@ -465,6 +465,13 @@ typedef struct {
     uint8_t data[];
 } PACKED smart_card_raw_t;
 
+// For CMD_LED_CONTROL
+typedef struct {
+    uint8_t led;        // LED bitmask: LED_A=1, LED_B=2, LED_C=4, LED_D=8
+    uint8_t action;     // 0=off, 1=on, 2=toggle, 3=pwm
+    uint8_t brightness; // 0-100 (for action=3 PWM mode only)
+} PACKED payload_led_control_t;
+
 
 // For the bootloader
 #define CMD_DEVICE_INFO                                                   0x0000
@@ -500,6 +507,7 @@ typedef struct {
 #define CMD_TIA                                                           0x0117
 #define CMD_BREAK_LOOP                                                    0x0118
 #define CMD_SET_TEAROFF                                                   0x0119
+#define CMD_LED_CONTROL                                                   0x011A
 #define CMD_GET_DBGMODE                                                   0x0120
 
 // RDV40, Flash memory operations
