嵌入式加密芯片dm2016驱动

DM2016是一款防抄板保密芯片,通过一个解密算法和与之相对应的128bit密钥,有效地保护了软件设计。当输入的暗文执行解密算法之后,产生的数据等于加密端输入的明文时,解密通过主机程序往下执行,否则程序退出执行.密钥存储在128bit OTP中,该芯片除了解密功能之外,内嵌1024bit E2PROM,可以作为数据保存,采用I2C总线进行数据传输。 该芯片可以保护产品的软件设计,防止抄板,可以广泛应用于消费电子、汽车电子等各种领域的电子产品中。

一下是通IIC总线于芯片玩成通讯加密的源码,新手请多指教。。。。

 /* 

 * dm2016drv.c
 *
 *  Created on: 2012-11-21
 *      Author: ruian
 */
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/jiffies.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <linux/delay.h>


#include <linux/mutex.h>
#include <linux/fs.h>           /* everything... */
#include <linux/cdev.h>
#include <linux/mm.h>
#include <asm/uaccess.h>
#include <linux/device.h>
#include "dm2016drv.h"
int DM2016_Addr = 0xA0 >> 1;


int DM2016_Open(struct inode *inode, struct file *filp);
ssize_t DM2016_Read(struct file *filp, char __user *buff, size_t count,
loff_t *offp);
ssize_t DM2016_Write(struct file *filp, const char __user *buff, size_t count,
loff_t *offp);
int DM2016_Release(struct inode *inode, struct file *filp);
int DM2016_AttachAdapter(struct i2c_adapter *adapter); //设备连接
int DM2016_DetachClient(struct i2c_client *client); //断开
struct class *dm2016_class;
typedef struct IIC_DM2016
{
struct cdev dev;
int major;
int devAddr; //0xA0
struct semaphore semLock; //信号量


struct i2c_client client; //!< Data structure containing general access routines.
struct i2c_driver driver; //!< Data structure containing information specific to each client.


char name[20];
int user;
} IIC_DM2016;


IIC_DM2016 gIIC_DM2016;


int DM2016_Create(void)
{
    struct i2c_driver *dm2016_driver;
    dm2016_driver = &gIIC_DM2016.driver;
    strcpy(gIIC_DM2016.name, "iic_dm2016");


    dm2016_driver->driver.owner = THIS_MODULE;
    dm2016_driver->driver.name = gIIC_DM2016.name;
    dm2016_driver->id = I2C_DRIVERID_MISC;
    dm2016_driver->attach_adapter = DM2016_AttachAdapter;
    dm2016_driver->detach_client = DM2016_DetachClient;
#ifdef DEBUG_DM2016
    printk(KERN_INFO "I2C:  dm2016 i2c_add_driver(dm2016_driver)\n");
#endif
return  i2c_add_driver(dm2016_driver);
}


int DM2016_DetachClient(struct i2c_client *client)   //
{
    int err;


    if (!client->adapter)
   return -ENODEV; /* our client isn't attached */


    if ((err = i2c_detach_client(client)))
    {
   printk( KERN_INFO "Client deregistration failed (address=%x), client not detached.\n", client->addr);
   return err;
    }
    client->adapter = NULL;
    return 0;
}


int DM2016_AttachAdapter(struct i2c_adapter *adapter)
{
    int err = 0;
    struct i2c_client *dm2016_client;
    dm2016_client = &gIIC_DM2016.client;
    dm2016_client->addr = gIIC_DM2016.devAddr;
    dm2016_client->adapter = adapter;
    dm2016_client->driver = &gIIC_DM2016.driver;


    if ((err = i2c_attach_client(dm2016_client)))
    {
   printk( KERN_INFO "I2C: ERROR: Couldn't attach %s (address=%x)\n", gIIC_DM2016.name, gIIC_DM2016.devAddr);
   return err;
    }
#ifdef DEBUG_DM2016
    printk(KERN_INFO "I2C:  dm2016 client registered at address %x !\n", gIIC_DM2016.devAddr);
#endif
    return 0;
}


int DM2016_Open(struct inode *inode, struct file *filp)
{
    int minor, major;
    minor = iminor(inode);
    major = imajor(inode);
#ifdef DEBUG_DM2016
    printk(KERN_INFO"DM2016_Open():%4d  %2d\n", minor, major);
#endif
    filp->private_data = NULL;
    down_interruptible(&gIIC_DM2016.semLock);
    gIIC_DM2016.user++; //用户数加1
    up(&gIIC_DM2016.semLock);
#ifdef DEBUG_DM2016
    printk("gIIC_DM2016.user-->%2d\n", gIIC_DM2016.user);
#endif
    return 0;
}


ssize_t DM2016_Read(struct file *filp, char __user *buff, size_t count,
loff_t *offp)
{
char *iic_buf = NULL;
ssize_t result;
#ifdef DEBUG_DM2016
printk(KERN_INFO"DM2016_Read...\n");
#endif
iic_buf = (char *)kmalloc(sizeof(count), GFP_KERNEL);
if(!iic_buf)
{
printk(KERN_INFO"kmalloc fialed....\n");
kfree(iic_buf);
return -1;
}
#ifdef DEBUG_DM2016
printk(KERN_INFO"DM2016_Read:read %d byte......\n", count);
#endif
result = i2c_master_recv(&gIIC_DM2016.client, iic_buf ,count);
if(result > 0)
{
#ifdef DEBUG_DM2016
printk(KERN_INFO"i2c_master_recv.....\n");
#endif
       if(copy_to_user(buff, iic_buf, count))
       {
      printk("DM2016_Read...copy_to_user failed\n");
      kfree(iic_buf);
      return -1;
       }
}
    kfree(iic_buf);
    return result;
}


ssize_t DM2016_Write(struct file *filp,const char  *buff, size_t count,
loff_t *offp)
{
ssize_t result;
char *iic_buf = NULL;
#ifdef DEBUG_DM2016
printk(KERN_INFO"DM2016_Write.....\n");
#endif
iic_buf = (char *)kmalloc(sizeof(count), GFP_KERNEL);
if(!iic_buf)
{
printk(KERN_INFO"kmalloc fialed....\n");
return -1;
}
#ifdef DEBUG_DM2016
printk("DM2016_Write:write %d byte......\n", count);
#endif
result = copy_from_user(iic_buf, buff, count);
if(0 != result)
{
   printk(KERN_INFO"DM2016_Write...copy_from_user failed \n");
kfree(iic_buf);
return -1;
}
#ifdef DEBUG_DM2016
printk(KERN_INFO"");
#endif
result = i2c_master_send(&gIIC_DM2016.client, iic_buf ,count);
msleep(5);
if(result < 0)
{
printk(KERN_ERR"i2c_master_send failed..-->%d", result);
kfree(iic_buf);
return result;
}
kfree(iic_buf);
return result;
}


int DM2016_Release(struct inode *inode, struct file *filp)
{
    int user;
#ifdef DEBUG_DM2016
    printk(KERN_INFO"DM2016_Release....\n");
#endif
    down_interruptible(&gIIC_DM2016.semLock); //
    user = gIIC_DM2016.user --;
    up(&gIIC_DM2016.semLock);
    /*if(user <= 0)
    {
    if(i2c_del_driver(&gIIC_DM2016.driver))
    {
    printk(KERN_INFO "I2C: ERROR: Driver remove failed (address=%x), module not removed.\n", gIIC_DM2016.devAddr);
    }
    gIIC_DM2016.client.adapter = NULL;
    }*/
    return 0;
}


struct file_operations dm2016_ops =
{
.owner = THIS_MODULE,
.open = DM2016_Open,
.read = DM2016_Read,
.write = DM2016_Write,
.release = DM2016_Release
};


static int __init DM2016_init(void)
{
    int result = 0;
    dev_t dev;
#ifdef DEBUG_DM2016
    printk(KERN_INFO"alloc_chrdev_region-->"IIC_DM2016_NAME"\n");
#endif
    result = alloc_chrdev_region(&dev, 0, 1, IIC_DM2016_NAME); //自动分配一个设备好
    if (result < 0)
    {
   printk(KERN_WARNING "I2C: can't get device major num \n");
   return result;
    }


    cdev_init(&gIIC_DM2016.dev, &dm2016_ops);//字符设备初始化


    gIIC_DM2016.devAddr = DM2016_Addr;
    gIIC_DM2016.dev.owner = THIS_MODULE;
    gIIC_DM2016.dev.ops = &dm2016_ops;
    sema_init(&gIIC_DM2016.semLock, 1);
    gIIC_DM2016.major = MAJOR(dev);//获取主设备号


    result = cdev_add(&gIIC_DM2016.dev, dev, 1); //添加一个字符设备
    if (result < 0)
    {
   printk(KERN_WARNING "I2C: Error [%d] while adding device [%s] \n", result, IIC_DM2016_NAME);
   unregister_chrdev_region(MKDEV(gIIC_DM2016.major, 0), 1);
   return result;
    }
    result = DM2016_Create(); //注册一个设备驱动
    if (result < 0)
    {
        printk( KERN_INFO "I2C: ERROR: Driver registration failed (address=%x), module not inserted.\n", gIIC_DM2016.devAddr );
        unregister_chrdev_region(MKDEV(gIIC_DM2016.major, 0), 1);
        cdev_del(&gIIC_DM2016.dev);
        return result;
    }
    printk(KERN_INFO "I2C-DM2016: Module install successful, device major num = %d \n", gIIC_DM2016.major);


    return result;
}


static void __exit  DM2016_exit(void)
{
    dev_t devno;
    devno = MKDEV(gIIC_DM2016.major, 0);
    i2c_del_driver(&gIIC_DM2016.driver);
    cdev_del(&gIIC_DM2016.dev);
    unregister_chrdev_region(devno, 1);
    printk(KERN_INFO"DM2016_Module exit....\n");
}


MODULE_LICENSE("GPL");
module_init( DM2016_init);
module_exit( DM2016_exit);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值