android平台led开发之硬件抽象层

本文详细介绍了在Android系统中实现硬件抽象层,具体以SWTLED模块为例,从创建硬件抽象层文件、模块接口定义、设备操作方法到模块编译部署的全过程。重点在于如何将内核中的LED驱动进行封装,导出接口供JNI层调用,并通过权限配置确保应用层能够正常访问。同时,介绍了模块的构建过程,包括源代码组织、构建脚本使用等关键步骤。
二,硬件抽象层
 
1,在hardware\libhardware\include\hardware下新建swtled.h文件
swtled.h

点击(此处)折叠或打开

  1. #ifndef ANDROID_SWTLED_INTERFACE_H
  2. #define ANDROID_SWTLED_INTERFACE_H

  3. #include <hardware/hardware.h>

  4. __BEGIN_DECLS

  5. //module interface
  6. struct swtled_module_t
  7. {
  8.     struct hw_module_t common;
  9. };

  10. //device interface
  11. struct swtled_device_t
  12. {
  13.     struct hw_device_t common;
  14.     int fd;
  15.     int (*set_on)(struct swtled_device_t* dev,int number);
  16.     int (*set_off)(struct swtled_device_t* dev,int number);
  17. };


  18. #define SWTLED_HARDWARE_MODULE_ID "swtled"
  19. __END_DECLS

  20. #endif

2:在hardware/libhardware/module下新建swtled文件夹并新建swtled.c

点击(此处)折叠或打开

  1. #define LOG_TAG "swtledStub"

  2. #include <hardware/hardware.h>
  3. #include <hardware/swtled.h>
  4. #include <fcntl.h>
  5. #include <errno.h>
  6. #include <cutils/log.h>
  7. #include <cutils/atomic.h>
  8. #include <string.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <sys/ioctl.h>


  12. #define LED_ON _IO('k',1)
  13. #define LED_OFF _IO('k',2)

  14. #define DEVICE_NAME "/dev/swt_led"
  15. #define MODULE_NAME "swtled"
  16. #define MODULE_AUTHOR "zc"



  17. //open or close device interface

  18. static int swtled_device_open(const struct hw_module_t* module,const char* name, struct hw_device_t** device);

  19. static int swtled_device_close(struct hw_device_t* device);


  20. //light-on light-off
  21. static int swtled_set_on(struct swtled_device_t* dev,int number);
  22. static int swtled_set_off(struct swtled_device_t* dev,int number);


  23. static int swtled_device_open(const struct hw_module_t* module,const char* name, struct hw_device_t** device)
  24. {

  25.     struct swtled_device_t * dev;
  26.     dev = (struct swtled_device_t*)malloc(sizeof(struct swtled_device_t));
  27.     if (!dev)
  28.     {
  29.      LOGE("Swtled Stub:failed to alloc space");
  30.         return -EFAULT;
  31.             
  32.     }
  33.     memset(dev,0,sizeof(struct swtled_device_t));
  34.     dev->common.tag= HARDWARE_DEVICE_TAG;
  35.     dev->common.version= 0;
  36.     dev->common.module= (hw_module_t*)module;
  37.     dev->common.close= swtled_device_close;
  38.     dev->set_on= swtled_set_on;
  39.     dev->set_off= swtled_set_off;

  40.     if ((dev->fd= open(DEVICE_NAME,O_RDWR))== -1)
  41.     {
  42.         LOGE("Swtled Stub:failed to open /dev/swt_led -- %s.",strerror(errno));
  43.         free(dev);
  44.         return -EFAULT;
  45.     }

  46.     *device =&(dev->common);
  47.     LOGI("Swtled Stub: open /dev/swt_led successfully");

  48.     return 0;
  49. }

  50. static int swtled_device_close(struct hw_device_t* device)
  51. {
  52.     struct swtled_device_t* swtled_device = (struct swtled_device_t*)device;
  53.     if (swtled_device)
  54.     {
  55.         close(swtled_device->fd);
  56.         free(swtled_device);
  57.     }
  58.     return 0;
  59. }


  60. //------------------------------------------------------------------------------
  61. //number: 1: light one 2:light two
  62. //------------------------------------------------------------------------------
  63. static int swtled_set_on(struct swtled_device_t* device,int number)
  64. {
  65.     ioctl(device->fd,LED_ON,number);
  66.     return 0;
  67. }


  68. //------------------------------------------------------------------------------
  69. //number: 1: light one 2:light two
  70. //------------------------------------------------------------------------------
  71. static int swtled_set_off(struct swtled_device_t* device,int number)
  72. {
  73.     ioctl(device->fd,LED_OFF,number);
  74.     return 0;
  75. }



  76. //module method table
  77. static struct hw_module_methods_t swtled_module_methods =
  78. {
  79.     open: swtled_device_open
  80. };



  81. const struct swtled_module_t HAL_MODULE_INFO_SYM= {

  82.     common:
  83.     {
  84.         tag: HARDWARE_MODULE_TAG,
  85.         version_major: 1,
  86.         version_minor: 0,
  87.         id: SWTLED_HARDWARE_MODULE_ID,
  88.         name:MODULE_NAME,
  89.         author: MODULE_AUTHOR,
  90.         methods: &swtled_module_methods,        
  91.     }
  92.         
  93. };
这里主要是通过hw_module_t和hw_device_t结构体形式将内核中led的驱动封装一层,
导出set_on和set_off接口,到时供JNI层的CPP调用。由于权限问题,应用层在打开dev时可能提示permission deny,所以需要修改
system\core\rootdir下的ueventd.rc文件,在其中添加一句

点击(此处)折叠或打开

  1. /dev/swt_led 0666 root root
3,在同目录下添加Android.mk

点击(此处)折叠或打开

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS := optional
  4. LOCAL_PRELINK_MODULE := false
  5. LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
  6. LOCAL_SHARED_LIBRARIES := liblog
  7. LOCAL_SRC_FILES := swtled.c
  8. LOCAL_MODULE := swtled.default
  9. include $(BUILD_SHARED_LIBRARY)
4,编译
 (1 进入到gingerbread目录下,执行mmm hardware/libhardware/modules/swtled会
    编译成功后,就可以在out/target/product/generic/system/lib/hw目录下看到swtled.default.so文件了
 
 (2 再执行make snod,使system.img镜像文件中包名硬件抽象模块swtled.default.so

一、 内容概要 本资源提供了一个完整的“金属板材压弯成型”非线性仿真案例,基于ABAQUS/Explicit或Standard求解器完成。案例精确模拟了模具(凸模、凹模)与金属板材之间的接触、压合过程,直至板材发生塑性弯曲成型。 模型特点:包含完整的模具-工件装配体,定义了刚体约束、通用接触(或面面接触)及摩擦系数。 材料定义:金属板材采用弹塑性材料模型,定义了完整的屈服强度、塑性应变等真实应力-应变数据。 关键结果:提供了成型过程中的板材应力(Mises应力)、塑性应变(PE)、厚度变化​ 云图,以及模具受力(接触力)曲线,完整再现了压弯工艺的力学状态。 二、 适用人群 CAE工程师/工艺工程师:从事钣金冲压、模具设计、金属成型工艺分析与优化的专业人员。 高校师生:学习ABAQUS非线性分析、金属塑性成形理论,或从事相关课题研究的硕士/博士生。 结构设计工程师:需要评估钣金件可制造性(DFM)或预测成型回弹的设计人员。 三、 使用场景及目标 学习目标: 掌握在ABAQUS中设置金属塑性成形仿真的全流程,包括材料定义、复杂接触设置、边界条件与载荷步。 学习如何调试和分析大变形、非线性接触问题的收敛性技巧。 理解如何通过仿真预测成型缺陷(如减薄、破裂、回弹),并与理论或实验进行对比验证。 应用价值:本案例的建模方法与分析思路可直接应用于汽车覆盖件、电器外壳、结构件等钣金产品的冲压工艺开发与模具设计优化,减少试模成本。 四、 其他说明 资源包内包含参数化的INP文件、CAE模型文件、材料数据参考及一份简要的操作要点说明文档。INP文件便于用户直接修改关键参数(如压边力、摩擦系数、行程)进行自主研究。 建议使用ABAQUS 2022或更高版本打开。显式动力学分析(如用Explicit)对计算资源有一定要求。 本案例为教学与工程参考目的提供,用户可基于此框架进行拓展,应用于V型弯曲
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值