/**
 * __sunxi_dump_regs_ex - dump a range of registers' value, copy to buf.
 * @start_reg:   address of start reg.
 * @end_reg:     address of end reg.
 * @buf:         store the dump info.
 * 
 * return bytes written to buf, <=0 indicate err
 */
ssize_t __sunxi_dump_regs_ex(u32 start_reg, u32 end_reg, char *buf)
{
	int 	i;
	ssize_t cnt = 0;
	u32 	first_addr = 0, end_addr = 0;

	if(!__addr_valid(start_reg) || !__addr_valid(end_reg) || NULL == buf) {
		printk(KERN_ERR "%s err, invalid para, start 0x%08x, end 0x%08x, buf 0x%08x\n", __func__, start_reg, end_reg, (u32)buf);
		return -EIO;
	}
	/* only one to dump */
	if(start_reg == end_reg)
		//return sprintf(buf, "0x%08x: 0x%08x\n", start_reg, R(start_reg));
		return sprintf(buf, "0x%08x\n", R(start_reg)); /* for open("/sys/class/...") app call */

	first_addr = start_reg & (~0xf);
	end_addr   = (end_reg   & (~0xf)) + 0xf;
	cnt += sprintf(buf, "0x%08x: ", first_addr);
	for(i = first_addr; i < end_addr; i += 4) {
		if(i < start_reg || i > end_reg)
			cnt += sprintf(buf + cnt, "           "); /* "0x12345678 ", 11 space*/
		else
			cnt += sprintf(buf + cnt, "0x%08x ", R(i));

		if((i & 0xc) == 0xc) {
			cnt += sprintf(buf + cnt, "\n");
			if(i + 4 < end_addr) /* avoid the last blank line */
				cnt += sprintf(buf + cnt, "0x%08x: ", i + 4);
		}
	}
	printk(KERN_INFO "%s, start 0x%08x, end 0x%08x, return %d\n", __func__, start_reg, end_reg, cnt);
	return cnt;
}
Esempio n. 2
0
static int __parse_str(char *str, u32 *out)
{
        if ((str == NULL) || (out == NULL)) {
                printk(KERN_ERR "%s err, line %d\n", __func__, __LINE__);
                return -EINVAL;
        }
        
        if(strict_strtoul(str, 16, (long unsigned int *)out)) {
                printk(KERN_ERR "%s err, line %d\n", __func__, __LINE__);
                printk("str:%s\n", str);
                return -EINVAL;
        }
        
        if(!__addr_valid(*out) ) 
                return -EINVAL;
        
        return 0;
}