Sunday, October 29, 2023

Kirisun DP405 DMR Radio Walkie walkie programming cable pinout

Kirisun DP-405

Kirisun DP405

Programming cable pinout:




I tested cable with FTDI usb serial TTL module.

It works.


Wednesday, October 25, 2023

Monday, August 28, 2023

Wednesday, June 14, 2023

ESP32 Clear(disable) esp_deep_sleep_enable_gpio_wakeup

in ESP32 C3

esp32 c3 have no disable gpio wakeup function. so, gpio wakeup masks adds only. 

PROBLEM:

step 1: 
    esp_deep_sleep_enable_gpio_wakeup( 1<<GPIO_NUM_2 , 0 );
    esp_deep_sleep_enable_gpio_wakeup( 1<<GPIO_NUM_5 , 0 );
    esp_deep_sleep_start();
step 2: 
    wakeup 
step 3:
    esp_deep_sleep_enable_gpio_wakeup( 1<<GPIO_NUM_5 , 0 );
    esp_deep_sleep_start();
step 4 (problem):
    ESP32 can wakeup by GPIO_NUM_2 !!!!
    

Reason: ESP32 SDK 

esp_deep_sleep_enable_gpio_wakeup does not clear for other pins.

You can modify SDK source code.

sleep_modes.c   esp_deep_sleep_enable_gpio_wakeup function


esp_err_t esp_deep_sleep_enable_gpio_wakeup(uint64_t gpio_pin_mask, esp_deepsleep_gpio_wake_up_mode_t mode)
{
    if (mode > ESP_GPIO_WAKEUP_GPIO_HIGH) {
        ESP_LOGE(TAG, "invalid mode");
        return ESP_ERR_INVALID_ARG;
    }
    gpio_int_type_t intr_type = ((mode == ESP_GPIO_WAKEUP_GPIO_LOW) ? GPIO_INTR_LOW_LEVEL : GPIO_INTR_HIGH_LEVEL);
    esp_err_t err = ESP_OK;
   
    /*s_config.gpio_wakeup_mask = 0;
    for (gpio_num_t gpio_idx = GPIO_NUM_0; gpio_idx < GPIO_NUM_MAX; gpio_idx++, gpio_pin_mask >>= 1)
    {
       gpio_deep_sleep_wakeup_disable(gpio_idx);
   }*/
   
   
    for (gpio_num_t gpio_idx = GPIO_NUM_0; gpio_idx < 6; gpio_idx++, gpio_pin_mask >>= 1) {
        if ((gpio_pin_mask & 1) == 0) {
           s_config.gpio_wakeup_mask &= ~BIT(gpio_idx);
           gpio_deep_sleep_wakeup_disable(gpio_idx);
           
            continue;
        }
        if (!esp_sleep_is_valid_wakeup_gpio(gpio_idx)) {
            ESP_LOGE(TAG, "invalid mask, please ensure gpio number is no more than 5");
            return ESP_ERR_INVALID_ARG;
        }
        err = gpio_deep_sleep_wakeup_enable(gpio_idx, intr_type);

        s_config.gpio_wakeup_mask |= BIT(gpio_idx);
        if (mode == ESP_GPIO_WAKEUP_GPIO_HIGH) {
            s_config.gpio_trigger_mode |= (mode << gpio_idx);
        } else {
            s_config.gpio_trigger_mode &= ~(mode << gpio_idx);
        }
    }
    s_config.wakeup_triggers |= RTC_GPIO_TRIG_EN;
   
    rtc_hal_gpio_clear_wakeup_status();
    return err;
}


after modify , If you want use multiple pins for wakeup source, 
call esp_deep_sleep_enable_gpio_wakeup with pin bitmask. 
example: esp_deep_sleep_enable_gpio_wakeup(  1<<GPIO_NUM_2 |  1<<GPIO_NUM_5 );



In my case , sleep_modes.c located on C:\Espressif\frameworks\esp-idf-5.0\components\esp_hw_support


Wednesday, April 26, 2023

Get serial pin event and status(level) c#(ring, cts, dsr, rlsd)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.IO.Ports;

using System.Reflection;

using System.Runtime.InteropServices;

using Microsoft.Win32.SafeHandles;


namespace SerialEventMonitor

{

    class Program

    {

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]

        static extern Boolean GetCommModemStatus(SafeFileHandle hFile, ref UInt32 Status);


        const UInt32 MS_CTS_ON = 0x0010;

        const UInt32 MS_DSR_ON = 0x0020;

        const UInt32 MS_RING_ON = 0x0040;

        const UInt32 MS_RLSD_ON = 0x0080;


        static void Main(string[] args)

        {


            Console.WriteLine( string.Join( ",",SerialPort.GetPortNames()));

            

            string com_port_name = Console.ReadLine();



            SerialPort port = new SerialPort(com_port_name.Trim(), 9600, Parity.None, 8, StopBits.One);

            port.PinChanged += PinChanged;

            

            port.Open();


            DateTime dt_Start = DateTime.MinValue;            

            while(true)

            {

                if( port.ReadExisting() == "q")

                    break;


                System.Threading.Thread.Sleep(1000);

            }

            port.Close();

            port.Dispose();

        }


        private static void PinChanged(object sender, SerialPinChangedEventArgs e)

        {

            SerialPort port = sender as SerialPort;


            Console.WriteLine( e.EventType.ToString());

            ShowPinStates(port);

        }

        static private void ShowPinStates(System.IO.Ports.SerialPort serialPort)

        {

            UInt32 Status = 0;

            Boolean CTS = false;

            Boolean DSR = false;

            Boolean DCD = false;

            Boolean RI = false;


            if (serialPort == null) return;

            if (serialPort.IsOpen)

            {

                object baseStream = serialPort.BaseStream;

                Type baseStreamType = baseStream.GetType();


                // Get the Win32 file handle for the port

                SafeFileHandle portFileHandle = (SafeFileHandle)baseStreamType.GetField("_handle", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(baseStream);


                if (GetCommModemStatus(portFileHandle, ref Status))

                {

                    CTS = ((Status & MS_CTS_ON) == MS_CTS_ON);

                    DSR = ((Status & MS_DSR_ON) == MS_DSR_ON);

                    DCD = ((Status & MS_RLSD_ON) == MS_RLSD_ON);

                    RI = ((Status & MS_RING_ON) == MS_RING_ON);


                    Console.WriteLine(RI);


                }

            }

        }

    }

}