在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 3.4.2內(nèi)核下I2C驅(qū)動之24CXX實(shí)例

            3.4.2內(nèi)核下I2C驅(qū)動之24CXX實(shí)例

            作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
            at24cxx_dev.c部分:
            #include "linux/kernel.h"
            #include "linux/module.h"
            #include "linux/platform_device.h"
            #include "linux/i2c.h"
            #include "linux/err.h"
            #include "linux/regmap.h"
            #include "linux/slab.h"
            static struct i2c_board_info at24cxx_info = {
            I2C_BOARD_INFO("at24c08", 0x50),
            };
            static struct i2c_client *at24cxx_client;
            static int at24cxx_dev_init(void)
            {
            struct i2c_adapter *i2c_adap;
            i2c_adap = i2c_get_adapter(0);
            at24cxx_client = i2c_new_device(i2c_adap, &at24cxx_info);
            i2c_put_adapter(i2c_adap);
            return 0;
            }
            static void at24cxx_dev_exit(void)
            {
            i2c_unregister_device(at24cxx_client);
            }
            module_init(at24cxx_dev_init);
            module_exit(at24cxx_dev_exit);
            MODULE_LICENSE("GPL");
            =================================================================
            at24cxx_drv.c部分:
            #include "linux/kernel.h"
            #include "linux/module.h"
            #include "linux/platform_device.h"
            #include "linux/i2c.h"
            #include "linux/err.h"
            #include "linux/regmap.h"
            #include "linux/slab.h"
            #include "linux/fs.h"
            #include "asm/uaccess.h"
            static int major;
            static struct class *class;
            static struct i2c_client *at24cxx_client;
            // 傳入: buf[0] : addr
            // 輸出: buf[0] : data
            //
            static ssize_t at24cxx_read(struct file * file, char __user *buf, size_t count, loff_t *off)
            {
            unsigned char addr, data;
            copy_from_user(&addr, buf, 1);
            data = i2c_smbus_read_byte_data(at24cxx_client, addr);
            copy_to_user(buf, &data, 1);
            return 1;
            }
            // buf[0] : addr
            // buf[1] : data
            //
            static ssize_t at24cxx_write(struct file *file, const char __user *buf, size_t count, loff_t *off)
            {
            unsigned char ker_buf[2];
            unsigned char addr, data;
            copy_from_user(ker_buf, buf, 2);
            addr = ker_buf[0];
            data = ker_buf[1];
            printk("addr = 0xx, data = 0xxn", addr, data);
            if (!i2c_smbus_write_byte_data(at24cxx_client, addr, data))
            return 2;
            else
            return -EIO;
            }
            static struct file_operations at24cxx_fops = {
            .owner = THIS_MODULE,
            .read = at24cxx_read,
            .write = at24cxx_write,
            };
            static int __devinit at24cxx_probe(struct i2c_client *client,
            const struct i2c_device_id *id)
            {
            at24cxx_client = client;
            //printk("%s %s %dn", __FILE__, __FUNCTION__, __LINE__);
            major = register_chrdev(0, "at24cxx", &at24cxx_fops);
            class = class_create(THIS_MODULE, "at24cxx");
            device_create(class, NULL, MKDEV(major, 0), NULL, "at24cxx"); // /dev/at24cxx //
            return 0;
            }
            static int __devexit at24cxx_remove(struct i2c_client *client)
            {
            //printk("%s %s %dn", __FILE__, __FUNCTION__, __LINE__);
            device_destroy(class, MKDEV(major, 0));
            class_destroy(class);
            unregister_chrdev(major, "at24cxx");
            return 0;
            }
            static const struct i2c_device_id at24cxx_id_table[] = {
            { "at24c08", 0 },
            {}
            };
            // 1. 分配/設(shè)置i2c_driver //
            static struct i2c_driver at24cxx_driver = {
            .driver = {
            .name = "100ask",
            .owner = THIS_MODULE,
            },
            .probe = at24cxx_probe,
            .remove = __devexit_p(at24cxx_remove),
            .id_table = at24cxx_id_table,
            };
            static int at24cxx_drv_init(void)
            {
            // 2. 注冊i2c_driver //
            i2c_add_driver(&at24cxx_driver);
            return 0;
            }
            static void at24cxx_drv_exit(void)
            {
            i2c_del_driver(&at24cxx_driver);
            }
            module_init(at24cxx_drv_init);
            module_exit(at24cxx_drv_exit);
            MODULE_LICENSE("GPL");
            =================================================================
            i2c_test.c測試程序:
            #include "stdio.h"
            #include "stdlib.h"
            #include "string.h"
            #include "sys/types.h"
            #include "sys/stat.h"
            #include "fcntl.h"
            // i2c_test r addr
            // i2c_test w addr val
            void print_usage(char *file)
            {
            printf("%s r addrn", file);
            printf("%s w addr valn", file);
            }
            int main(int argc, char **argv)
            {
            int fd;
            unsigned char buf[2];
            if ((argc != 3) && (argc != 4))
            {
            print_usage(argv[0]);
            return -1;
            }
            fd = open("/dev/at24cxx", O_RDWR);
            if (fd " 0)
            {
            printf("cant open /dev/at24cxxn");
            return -1;
            }
            if (strcmp(argv[1], "r") == 0)
            {
            buf[0] = strtoul(argv[2], NULL, 0);
            read(fd, buf, 1);
            printf("data: %c, %d, 0x%2xn", buf[0], buf[0], buf[0]);
            }
            else if ((strcmp(argv[1], "w") == 0) && (argc == 4))
            {
            buf[0] = strtoul(argv[2], NULL, 0);
            buf[1] = strtoul(argv[3], NULL, 0);
            if (write(fd, buf, 2) != 2)
            printf("write err, addr = 0xx, data = 0xxn", buf[0], buf[1]);
            }
            else
            {
            print_usage(argv[0]);
            return -1;
            }
            return 0;
            }
            ================================================================
            Makefile:
            KERN_DIR = /work/system/linux-3.4.2
            all:
            make -C $(KERN_DIR) M=`pwd` modules
            clean:
            make -C $(KERN_DIR) M=`pwd` modules clean
            rm -rf modules.order
            obj-m += at24cxx_dev.o
            obj-m += at24cxx_drv.o
            #obj-m += i2c_bus_s3c2440.o



            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉