Explorar o código

Merge branch 'master' of gitee.com:openLuat/LuatOS

Wendal Chen hai 11 meses
pai
achega
f72743dd60
Modificáronse 4 ficheiros con 108 adicións e 30 borrados
  1. 1 0
      luat/include/luat_libs.h
  2. 1 0
      luat/include/luat_mcu.h
  3. 23 30
      luat/include/luat_pin.h
  4. 83 0
      luat/modules/luat_lib_pins.c

+ 1 - 0
luat/include/luat_libs.h

@@ -105,6 +105,7 @@ LUAMOD_API int luaopen_fonts( lua_State *L );
 LUAMOD_API int luaopen_gtfont( lua_State *L );
 
 LUAMOD_API int luaopen_pin( lua_State *L );
+LUAMOD_API int luaopen_pins( lua_State *L );
 LUAMOD_API int luaopen_dac( lua_State *L );
 LUAMOD_API int luaopen_otp( lua_State *L );
 LUAMOD_API int luaopen_mlx90640( lua_State *L );

+ 1 - 0
luat/include/luat_mcu.h

@@ -16,6 +16,7 @@ typedef enum
 	LUAT_MCU_PERIPHERAL_CAMERA,
 	LUAT_MCU_PERIPHERAL_ONEWIRE,
 	LUAT_MCU_PERIPHERAL_KEYBORAD,
+	LUAT_MCU_PERIPHERAL_QTY
 }LUAT_MCU_PERIPHERAL_E;
 
 int luat_mcu_set_clk(size_t mhz);

+ 23 - 30
luat/include/luat_pin.h

@@ -43,70 +43,62 @@ typedef enum
 	LUAT_PIN_ONLY_ONE_QTY = 1,
 }LUAT_PIN_FUNC_E;
 
-typedef union
-{
-	struct
-	{
-		uint8_t ec_gpio_id:7;			//移芯平台的GPIO号
-		uint8_t ec_gpio_is_altfun4:1;	//移芯对应GPIO功能是不是复用功能4
-	};
-	uint8_t common_gpio_id;				//以GPIO号为唯一ID的芯片的GPIO id
-}iomux_uid_u;
-
 typedef struct
 {
-	iomux_uid_u uid;	//用于硬件操作所需的唯一ID
+	uint8_t uid;	//用于硬件操作所需的唯一ID
 	uint8_t altfun_id;	//复用功能id
-}pin_iomux_info;	//pin复用信息
+}luat_pin_iomux_info;	//pin复用信息
 
 typedef struct
 {
 	uint16_t peripheral_type:5;
 	uint16_t peripheral_id:4;
 	uint16_t function_id:4;
-}pin_peripheral_function_description_t;
+	uint16_t pad:2;
+	uint16_t is_no_use:1;
+}luat_pin_peripheral_function_description_t;
 
 typedef struct
 {
-	pin_peripheral_function_description_t function[10];
+	luat_pin_peripheral_function_description_t function[8];
 	uint16_t index;
-	iomux_uid_u uid;
-}pin_function_description_t;
+	uint8_t uid;
+}luat_pin_function_description_t;
 
 
 typedef struct
 {
-	pin_iomux_info pin_list[LUAT_PIN_UART_QTY];
+	luat_pin_iomux_info pin_list[LUAT_PIN_UART_QTY];
 }luat_uart_pin_iomux_t;
 
 typedef struct
 {
-	pin_iomux_info pin_list[LUAT_PIN_I2C_QTY];
+	luat_pin_iomux_info pin_list[LUAT_PIN_I2C_QTY];
 }luat_i2c_pin_iomux_t;
 
 typedef struct
 {
-	pin_iomux_info pin_list[LUAT_PIN_SPI_QTY];
+	luat_pin_iomux_info pin_list[LUAT_PIN_SPI_QTY];
 }luat_spi_pin_iomux_t;
 
 typedef struct
 {
-	pin_iomux_info pin_list[LUAT_PIN_PWM_QTY];
+	luat_pin_iomux_info pin_list[LUAT_PIN_PWM_QTY];
 }luat_pwm_pin_iomux_t;
 
 typedef struct
 {
-	pin_iomux_info pin_list[LUAT_PIN_CAN_QTY];
+	luat_pin_iomux_info pin_list[LUAT_PIN_CAN_QTY];
 }luat_can_pin_iomux_t;
 
 typedef struct
 {
-	pin_iomux_info pin_list[LUAT_PIN_I2S_QTY];
+	luat_pin_iomux_info pin_list[LUAT_PIN_I2S_QTY];
 }luat_i2s_pin_iomux_t;
 
 typedef struct
 {
-	pin_iomux_info pin_list[LUAT_PIN_SDIO_QTY];
+	luat_pin_iomux_info pin_list[LUAT_PIN_SDIO_QTY];
 }luat_sdio_pin_iomux_t;
 
 
@@ -121,7 +113,7 @@ int luat_pin_parse(const char* pin_name, size_t* zone, size_t* index);
  * @param pin_list 输出pin复用信息表
  * @return 0成功,其他失败
  */
-int luat_pin_get_iomux_info(LUAT_MCU_PERIPHERAL_E type, uint8_t id, pin_iomux_info *pin_list);
+int luat_pin_get_iomux_info(LUAT_MCU_PERIPHERAL_E type, uint8_t id, luat_pin_iomux_info *pin_list);
 /**
  * @brief 设置某个外设的全部pin复用信息,如果该外设只有一种复用可能性,则不必设置,会直接失败
  * @param type 外设类型,见LUAT_MCU_PERIPHERAL_E
@@ -129,15 +121,16 @@ int luat_pin_get_iomux_info(LUAT_MCU_PERIPHERAL_E type, uint8_t id, pin_iomux_in
  * @param pin_list 输入pin复用信息表
  * @return 0成功,其他失败
  */
-int luat_pin_set_iomux_info(LUAT_MCU_PERIPHERAL_E type, uint8_t id, pin_iomux_info *pin_list);
+int luat_pin_set_iomux_info(LUAT_MCU_PERIPHERAL_E type, uint8_t id, luat_pin_iomux_info *pin_list);
 /**
- * @brief 从模块pin脚号返回芯片pin的唯一id
+ * @brief 从模块pin脚号返回芯片pin功能的详细描述
  * @param num 模块pin脚号
- * @return pin的唯一id,如果唯一id是0xff代表没有
+ * @param pin_function 芯片pin功能的详细描述
+ * @return 0成功,其他失败
  */
-iomux_uid_u luat_pin_get_from_num(uint32_t num);
+int luat_pin_get_description_from_num(uint32_t num, luat_pin_function_description_t *pin_function);
 
-void luat_pin_iomux_config(pin_iomux_info pin, uint8_t use_altfunction_pull, uint8_t driver_strength);
+void luat_pin_iomux_config(luat_pin_iomux_info pin, uint8_t use_altfunction_pull, uint8_t driver_strength);
 
-void luat_pin_iomux_print(pin_iomux_info *pin_list, uint8_t num);
+void luat_pin_iomux_print(luat_pin_iomux_info *pin_list, uint8_t num);
 #endif

+ 83 - 0
luat/modules/luat_lib_pins.c

@@ -0,0 +1,83 @@
+/*
+@module  pins
+@summary 管脚外设复用
+@version 1.0
+@date    2025.4.10
+@tag LUAT_USE_PINS
+@usage
+
+*/
+
+#include "luat_base.h"
+#include "luat_pin.h"
+#include "luat_mcu.h"
+#include <stdlib.h>
+
+#define LUAT_LOG_TAG "pins"
+#include "luat_log.h"
+
+static luat_pin_peripheral_function_description_t luat_pins_function_analyze(char *string)
+{
+	const char *peripheral_names[LUAT_MCU_PERIPHERAL_QTY] = {
+			"UART","I2C","SPI","PWM","CAN","GPIO","I2S","SDIO","LCD","CAMERA","ONEWIRE","KEYBORAD"
+	};
+	const char *function0_names[3] = {
+			"RX","SCL","MOSI",
+	};
+	const char *function1_names[3] = {
+			"TX","SDA","MISO",
+	};
+	const char *function2_names[4] = {
+			"RTS","CLK","STB","BCLK"
+	};
+	const char *function3_names[3] = {
+			"CTS","CS","LRCLK"
+	};
+	const char *function4_names[2] = {
+			"MCLK","CMD"
+	};
+}
+
+/**
+当某种外设允许复用在不同引脚上时,指定某个管脚允许复用成某种外设功能,需要在外设启用前配置好,外设启用时起作用。
+@api pins.setup(pin, func)
+@int 管脚物理编号, 对应模组俯视图下的顺序编号, 例如 67, 68
+@string 功能说明, 例如 "GPIO18", "UART1_TX", "UART1_RX", "SPI1_CLK", "I2C1_CLK", 目前支持的外设有"UART","I2C","SPI","PWM","CAN","GPIO","ONEWIRE"
+@return boolean 配置成功,返回true, 其他情况均返回nil, 并在日志中提示失败原因
+@usage
+-- 把air780epm的PIN67脚,做GPIO 18用
+--pins.setup(67, "GPIO18")
+-- 把air780epm的PIN55脚,做uart2 rx用
+--pins.setup(55, "UART2_RX")
+-- 把air780epm的PIN56脚,做uart2 tx用
+--pins.setup(56, "UART2_TX")
+ */
+static int luat_pins_setup(lua_State *L){
+	return 1;
+}
+
+/**
+加载硬件配置,如果存在/luadb/pins.json,开机后自动加载/luadb/pins.json,无需调用
+@api pins.load(path)
+@string path, 配置文件路径, 可选, 默认值是 /luadb/pins.json
+@return boolean 成功返回true, 失败返回false
+@usage
+pins.load()
+pins.load("/my.json")
+*/
+static int luat_pins_load(lua_State *L){
+	return 1;
+}
+
+#include "rotable2.h"
+static const rotable_Reg_t reg_pins[] =
+{
+    {"setup",     ROREG_FUNC(luat_pins_setup)},
+	{"load",     ROREG_FUNC(luat_pins_load)},
+	{ NULL,     ROREG_INT(0) }
+};
+
+LUAMOD_API int luaopen_pins( lua_State *L ) {
+    luat_newlib2(L, reg_pins);
+    return 1;
+}